using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using SimpleInjector;
using TrainworksReloaded.Base;
using TrainworksReloaded.Core;
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("BalanceConfigurator.Plugin")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.2.1.0")]
[assembly: AssemblyInformationalVersion("1.2.1+bdbee15f460abbaff405b3e2617098a91ec340a2")]
[assembly: AssemblyProduct("BalanceConfigurator.Plugin")]
[assembly: AssemblyTitle("BalanceConfigurator.Plugin")]
[assembly: AssemblyVersion("1.2.1.0")]
[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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[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 BalanceConfigurator.Plugin
{
internal class ConfigDescriptionBuilder
{
public string English { get; set; } = "";
public string French { get; set; } = "";
public string German { get; set; } = "";
public string Russian { get; set; } = "";
public string Portuguese { get; set; } = "";
public string Chinese { get; set; } = "";
public string Spanish { get; set; } = "";
public string ChineseTraditional { get; set; } = "";
public string Korean { get; set; } = "";
public string Japanese { get; set; } = "";
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
if (!string.IsNullOrEmpty(English))
{
stringBuilder.AppendLine(English);
}
if (!string.IsNullOrEmpty(French))
{
stringBuilder.AppendLine(French);
}
if (!string.IsNullOrEmpty(German))
{
stringBuilder.AppendLine(German);
}
if (!string.IsNullOrEmpty(Russian))
{
stringBuilder.AppendLine(Russian);
}
if (!string.IsNullOrEmpty(Portuguese))
{
stringBuilder.AppendLine(Portuguese);
}
if (!string.IsNullOrEmpty(Chinese))
{
stringBuilder.AppendLine(Chinese);
}
if (!string.IsNullOrEmpty(Spanish))
{
stringBuilder.AppendLine(Spanish);
}
if (!string.IsNullOrEmpty(ChineseTraditional))
{
stringBuilder.AppendLine(ChineseTraditional);
}
if (!string.IsNullOrEmpty(Korean))
{
stringBuilder.AppendLine(Korean);
}
if (!string.IsNullOrEmpty(Japanese))
{
stringBuilder.AppendLine(Japanese);
}
return stringBuilder.ToString().TrimEnd();
}
}
[BepInPlugin("BalanceConfigurator.Plugin", "BalanceConfigurator.Plugin", "1.2.1")]
public class Plugin : BaseUnityPlugin
{
internal static ManualLogSource Logger = new ManualLogSource("BalanceConfigurator.Plugin");
private ConfigEntry<int>? startingGold;
private ConfigEntry<int>? maxHandSize;
private ConfigEntry<int>? startOfTurnEnergy;
private ConfigEntry<int>? startOfDeploymentPhaseEnergy;
private ConfigEntry<int>? maxEnergy;
private ConfigEntry<int>? initialDragonsHoardCap;
private ConfigEntry<int>? maxDragonsHoard;
private ConfigEntry<int>? startOfTurnCards;
private ConfigEntry<int>? unitUpgradeSlots;
private ConfigEntry<int>? spellUpgradeSlots;
private ConfigEntry<int>? equipmentUpgradeSlots;
private ConfigEntry<int>? numSpawnPointsPerFloor;
private ConfigEntry<int>? characterCapacityPerFloor;
private ConfigEntry<int>? maxMutatorCount;
private ConfigEntry<int>? championUpgradesShown;
private ConfigEntry<float>? mainClanXpFactor;
private ConfigEntry<float>? subClanXpFactor;
private ConfigEntry<int>? alternateChampionUnlockLevel;
private ConfigEntry<int>? cardRarityTicketCommon;
private ConfigEntry<int>? cardRarityTicketUncommon;
private ConfigEntry<int>? cardRarityTicketRare;
private ConfigEntry<int>? cardRarityTicketChampion;
private ConfigEntry<int>? enhancerRarityTicketCommon;
private ConfigEntry<int>? enhancerRarityTicketUncommon;
private ConfigEntry<int>? enhancerRarityTicketRare;
private ConfigEntry<int>? enhancerRarityTicketChampion;
private ConfigEntry<int>? relicRarityTicketCommon;
private ConfigEntry<int>? relicRarityTicketUncommon;
private ConfigEntry<int>? relicRarityTicketRare;
private ConfigEntry<int>? relicRarityTicketChampion;
private ConfigEntry<int>? goldSkipCardDraft;
private ConfigEntry<int>? goldSkipRelicDraft;
private ConfigEntry<int>? goldSkipChampionUpgrade;
private ConfigEntry<int>? goldSkipIndividualRelic;
private ConfigEntry<int>? goldSkipIndividualCard;
private ConfigEntry<int>? goldSkipPurge;
private ConfigEntry<int>? goldSkipLevelUpUnit;
private ConfigEntry<int>? chanceOfOptionalOutpostDialogue;
private ConfigEntry<float>? fastDialogueMultiplier;
private ConfigEntry<int>? draftCostCommonCardMin;
private ConfigEntry<int>? draftCostCommonCardMax;
private ConfigEntry<int>? draftCostUncommonCardMin;
private ConfigEntry<int>? draftCostUncommonCardMax;
private ConfigEntry<int>? draftCostRareCardMin;
private ConfigEntry<int>? draftCostRareCardMax;
private ConfigEntry<int>? draftCostCommonRelicMin;
private ConfigEntry<int>? draftCostCommonRelicMax;
private ConfigEntry<int>? draftCostUncommonRelicMin;
private ConfigEntry<int>? draftCostUncommonRelicMax;
private ConfigEntry<int>? draftCostRareRelicMin;
private ConfigEntry<int>? draftCostRareRelicMax;
private ConfigEntry<int>? draftCostCommonEnhancerMin;
private ConfigEntry<int>? draftCostCommonEnhancerMax;
private ConfigEntry<int>? draftCostUncommonEnhancerMin;
private ConfigEntry<int>? draftCostUncommonEnhancerMax;
private ConfigEntry<int>? draftCostRareEnhancerMin;
private ConfigEntry<int>? draftCostRareEnhancerMax;
public void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
FormConfiguration();
Railend.ConfigurePostAction((Action<Container>)delegate(Container c)
{
SaveManager val = default(SaveManager);
if (!c.GetInstance<GameDataClient>().TryGetProvider<SaveManager>(ref val))
{
Logger.LogError((object)"Failed to get SaveManager instance please report this https://github.com/Monster-Train-2-Modding-Group/Balance-Configurator/issues");
}
else
{
BalanceData balanceData = val.GetAllGameData().GetBalanceData();
ReconfigureBalance(balanceData);
}
});
Logger.LogInfo((object)"Plugin BalanceConfigurator.Plugin is loaded!");
}
private void FormConfiguration()
{
startingGold = ((BaseUnityPlugin)this).Config.Bind<int>("Gold", "Starting Gold", 50, new ConfigDescriptionBuilder
{
English = "Starting Gold in a run.",
Chinese = "修改一轮游戏的初始金钱。"
}.ToString());
startOfTurnCards = ((BaseUnityPlugin)this).Config.Bind<int>("Hand Size", "Initial Hand Size", 5, new ConfigDescriptionBuilder
{
English = "Starting hand size.",
Chinese = "修改每回合的初始抽牌数量。"
}.ToString());
maxHandSize = ((BaseUnityPlugin)this).Config.Bind<int>("Hand Size", "Max Hand Size", 10, new ConfigDescriptionBuilder
{
English = "Maximum hand size possible.",
Chinese = "修改手牌数量上限。"
}.ToString());
startOfTurnEnergy = ((BaseUnityPlugin)this).Config.Bind<int>("Ember", "Starting Ember", 3, new ConfigDescriptionBuilder
{
English = "Starting ember gained per turn in a run.",
Chinese = "修改每回合获得的初始余烬数量。"
}.ToString());
startOfDeploymentPhaseEnergy = ((BaseUnityPlugin)this).Config.Bind<int>("Ember", "Deployment Phase Ember", 1, new ConfigDescriptionBuilder
{
English = "Extra ember given during the Deployment Phase.",
Chinese = "修改初始部署余烬数量。"
}.ToString());
maxEnergy = ((BaseUnityPlugin)this).Config.Bind<int>("Ember", "Maximum Ember", 99, new ConfigDescriptionBuilder
{
English = "Maximum ember that is possible during a turn.",
Chinese = "修改余烬数量上限。"
}.ToString());
initialDragonsHoardCap = ((BaseUnityPlugin)this).Config.Bind<int>("Dragons Hoard", "Initial Dragons Hoard Cap", 8, new ConfigDescriptionBuilder
{
English = "Initial cap on Dragons Hoard.",
Chinese = "修改龙族宝藏的初始数量上限。"
}.ToString());
maxDragonsHoard = ((BaseUnityPlugin)this).Config.Bind<int>("Dragons Hoard", "Maximum Dragons Hoard Cap", 13, new ConfigDescriptionBuilder
{
English = "Maximum cap on Dragons Hoard that's possible in given run.",
Chinese = "修改龙族宝藏的最大数量上限。"
}.ToString());
unitUpgradeSlots = ((BaseUnityPlugin)this).Config.Bind<int>("Upgrades and Slots", "Unit Upgrade Slots", 2, new ConfigDescriptionBuilder
{
English = "Initial amount of unit upgrade slots available.",
Chinese = "修改单位的初始升级栏位数量。"
}.ToString());
spellUpgradeSlots = ((BaseUnityPlugin)this).Config.Bind<int>("Upgrades and Slots", "Spell Upgrade Slots", 2, new ConfigDescriptionBuilder
{
English = "Initial amount of spell upgrade slots available.",
Chinese = "修改法术的初始升级栏位数量。"
}.ToString());
equipmentUpgradeSlots = ((BaseUnityPlugin)this).Config.Bind<int>("Upgrades and Slots", "Equipment Upgrade Slots", 0, new ConfigDescriptionBuilder
{
English = "Initial amount of equipment upgrade slots available (Currently equipment can't be upgraded).",
Chinese = "修改装备的初始升级栏位数量(目前装备无法升级)。"
}.ToString());
championUpgradesShown = ((BaseUnityPlugin)this).Config.Bind<int>("Upgrades and Slots", "Champion Upgrades Shown", 2, new ConfigDescriptionBuilder
{
English = "Number of champion upgrades shown in the Light Forge.",
Chinese = "修改光之锻炉出现的勇者升级数量。"
}.ToString());
numSpawnPointsPerFloor = ((BaseUnityPlugin)this).Config.Bind<int>("Floor Balance", "Num Spawn Points Per Floor", 7, new ConfigDescriptionBuilder
{
English = "Maximum number of spawn points (characters) that can be present on a side of the floor.",
Chinese = "修改每层每方势力的单位数量上限。"
}.ToString());
characterCapacityPerFloor = ((BaseUnityPlugin)this).Config.Bind<int>("Floor Balance", "Character Capacity Per Floor", 5, new ConfigDescriptionBuilder
{
English = "Initial amount of capacity per floor.",
Chinese = "修改每层的初始容量值。"
}.ToString());
maxMutatorCount = ((BaseUnityPlugin)this).Config.Bind<int>("Mutators", "Max Mutator Count", 3, new ConfigDescriptionBuilder
{
English = "Maximum amount of mutators that can be applied to a run.",
Chinese = "修改一轮游戏的转变器数量上限。"
}.ToString());
mainClanXpFactor = ((BaseUnityPlugin)this).Config.Bind<float>("XP and Unlocks", "Main Clan Xp Factor", 1f, new ConfigDescriptionBuilder
{
English = "Scales the base amount of XP amount given to the primary clan at the end of a run.",
Chinese = "修改在一轮游戏结束之后,主氏族获得经验的倍率。"
}.ToString());
subClanXpFactor = ((BaseUnityPlugin)this).Config.Bind<float>("XP and Unlocks", "Sub Clan Xp Factor", 0.5f, new ConfigDescriptionBuilder
{
English = "Scales the base amount of XP amount given to the allied clan at the end of a run.",
Chinese = "修改在一轮游戏结束之后,盟友氏族获得经验的倍率。"
}.ToString());
alternateChampionUnlockLevel = ((BaseUnityPlugin)this).Config.Bind<int>("XP and Unlocks", "Alternate Champion Unlock Level", 5, new ConfigDescriptionBuilder
{
English = "The level at which the alternate champion is available.",
Chinese = "修改备选勇者的解锁等级。"
}.ToString());
cardRarityTicketCommon = ((BaseUnityPlugin)this).Config.Bind<int>("Card Rarity Ticket Counts", "Common", 940, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a common card when drafting a card. (Rings 1 & 2 only, non banner drafts)",
Chinese = "修改自选卡牌时,普通卡牌出现的权重。出现的几率为该权重占权重总和中的比例。(仅前2层区域的除战旗以外的自选卡牌)"
}.ToString());
cardRarityTicketUncommon = ((BaseUnityPlugin)this).Config.Bind<int>("Card Rarity Ticket Counts", "Uncommon", 55, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a uncommon card when drafting a card.",
Chinese = "修改自选卡牌时,高级卡牌出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
cardRarityTicketRare = ((BaseUnityPlugin)this).Config.Bind<int>("Card Rarity Ticket Counts", "Rare", 5, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a rare card when drafting a card.",
Chinese = "修改自选卡牌时,稀有卡牌出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
cardRarityTicketChampion = ((BaseUnityPlugin)this).Config.Bind<int>("Card Rarity Ticket Counts", "Champion", 0, new ConfigDescriptionBuilder
{
English = "(Unused) number of tickets that will produce a champion card in a card draft.",
Chinese = "(未使用)修改自选卡牌时,勇者卡牌出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
enhancerRarityTicketCommon = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Rarity Ticket Counts", "Common", 70, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a common enhancer when finding an enhancer.",
Chinese = "修改商店升级时,普通升级石出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
enhancerRarityTicketUncommon = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Rarity Ticket Counts", "Uncommon", 30, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a uncommon enhancer when finding an enhancer.",
Chinese = "修改商店升级时,高级升级石出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
enhancerRarityTicketRare = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Rarity Ticket Counts", "Rare", 0, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a rare enhancer when finding an enhancer.",
Chinese = "修改商店升级时,稀有升级石出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
enhancerRarityTicketChampion = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Rarity Ticket Counts", "Champion", 0, new ConfigDescriptionBuilder
{
English = "(Unused) number of tickets that will produce a champion enahncer when finding an enhancer.",
Chinese = "(未使用)修改商店升级时,勇者升级石出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
relicRarityTicketCommon = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Rarity Ticket Counts", "Common", 80, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a common relic when drafting a relic.",
Chinese = "修改自选神器时,普通神器出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
relicRarityTicketUncommon = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Rarity Ticket Counts", "Uncommon", 20, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a uncommon relic when drafting a relic.",
Chinese = "修改自选神器时,高级神器出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
relicRarityTicketRare = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Rarity Ticket Counts", "Rare", 0, new ConfigDescriptionBuilder
{
English = "Number of tickets that will produce a rare relic when drafting a relic.",
Chinese = "修改自选神器时,稀有神器出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
relicRarityTicketChampion = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Rarity Ticket Counts", "Champion", 0, new ConfigDescriptionBuilder
{
English = "Unused no chance of finding a champion relic in a relic draft.",
Chinese = "(未使用)修改自选神器时,勇者神器出现的权重。出现的几率为该权重占权重总和中的比例。"
}.ToString());
goldSkipCardDraft = ((BaseUnityPlugin)this).Config.Bind<int>("Gold For Skipping Rewards", "Card Draft", 10, new ConfigDescriptionBuilder
{
English = "Gold for skipping a Card Draft.",
Chinese = "修改跳过自选卡牌时获得的金钱。"
}.ToString());
goldSkipRelicDraft = ((BaseUnityPlugin)this).Config.Bind<int>("Gold For Skipping Rewards", "Relic Draft", 25, new ConfigDescriptionBuilder
{
English = "Gold for skipping a Relic Draft.",
Chinese = "修改跳过自选神器时获得的金钱。"
}.ToString());
goldSkipChampionUpgrade = ((BaseUnityPlugin)this).Config.Bind<int>("Gold For Skipping Rewards", "Champion Upgrade Draft", 0, new ConfigDescriptionBuilder
{
English = "Gold for skipping a Champion Upgrade.",
Chinese = "修改跳过勇者升级时获得的金钱。"
}.ToString());
goldSkipIndividualRelic = ((BaseUnityPlugin)this).Config.Bind<int>("Gold For Skipping Rewards", "Individual Relic", 25, new ConfigDescriptionBuilder
{
English = "Gold for skipping a singular Relic Draft.",
Chinese = "修改跳过单件神器时获得的金钱。"
}.ToString());
goldSkipIndividualCard = ((BaseUnityPlugin)this).Config.Bind<int>("Gold For Skipping Rewards", "Individual Card", 10, new ConfigDescriptionBuilder
{
English = "Gold for skipping a singular Card Draft.",
Chinese = "修改跳过单张卡牌时获得的金钱。"
}.ToString());
goldSkipPurge = ((BaseUnityPlugin)this).Config.Bind<int>("Gold For Skipping Rewards", "Purge", 0, new ConfigDescriptionBuilder
{
English = "Gold for skipping a Purge.",
Chinese = "修改跳过移除卡牌时获得的金钱。"
}.ToString());
goldSkipLevelUpUnit = ((BaseUnityPlugin)this).Config.Bind<int>("Gold For Skipping Rewards", "Level Up Unit", 0, new ConfigDescriptionBuilder
{
English = "(Unused) Gold for skipping a Level Up Unit.",
Chinese = "(未使用)修改跳过升级单位时获得的金钱。"
}.ToString());
chanceOfOptionalOutpostDialogue = ((BaseUnityPlugin)this).Config.Bind<int>("Dialogues", "Chance of Optional Output Dialogue", 30, new ConfigDescriptionBuilder
{
English = "Percentage chance of getting an optional outpost dialogue after a run (0-100).",
Chinese = "修改在一轮游戏结束之后,契约前哨站可选对话的出现概率百分比(0-100)。"
}.ToString());
fastDialogueMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Dialogues", "Fast Dialog Multiplier", 2f, new ConfigDescriptionBuilder
{
English = "Multiplier for fast dialogues.",
Chinese = "修改对话的速度倍率。"
}.ToString());
draftCostCommonCardMin = ((BaseUnityPlugin)this).Config.Bind<int>("Card Draft Costs", "Minimum Cost Common Card", 20, new ConfigDescriptionBuilder
{
English = "Minimum cost of a common card.",
Chinese = "修改普通卡牌的最低价格。"
}.ToString());
draftCostCommonCardMax = ((BaseUnityPlugin)this).Config.Bind<int>("Card Draft Costs", "Maximum Cost Common Card", 20, new ConfigDescriptionBuilder
{
English = "Maximum cost of an common card.",
Chinese = "修改普通卡牌的最高价格。"
}.ToString());
draftCostUncommonCardMin = ((BaseUnityPlugin)this).Config.Bind<int>("Card Draft Costs", "Minimum Cost Uncommon Card", 40, new ConfigDescriptionBuilder
{
English = "Minimum cost of a uncommon card.",
Chinese = "修改高级卡牌的最低价格。"
}.ToString());
draftCostUncommonCardMax = ((BaseUnityPlugin)this).Config.Bind<int>("Card Draft Costs", "Maximum Cost Uncommon Card", 40, new ConfigDescriptionBuilder
{
English = "Maximum cost of an uncommon card.",
Chinese = "修改高级卡牌的最高价格。"
}.ToString());
draftCostRareCardMin = ((BaseUnityPlugin)this).Config.Bind<int>("Card Draft Costs", "Minimum Cost Rare Card", 90, new ConfigDescriptionBuilder
{
English = "Minimum cost of a rare card.",
Chinese = "修改稀有卡牌的最低价格。"
}.ToString());
draftCostRareCardMax = ((BaseUnityPlugin)this).Config.Bind<int>("Card Draft Costs", "Maximum Cost Rare Card", 90, new ConfigDescriptionBuilder
{
English = "Maximum cost of a rare card.",
Chinese = "修改稀有卡牌的最高价格。"
}.ToString());
draftCostCommonRelicMin = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Draft Costs", "Minimum Cost Common Relic", 125, new ConfigDescriptionBuilder
{
English = "Minimum cost of a common artifact.",
Chinese = "修改普通神器的最低价格。"
}.ToString());
draftCostCommonRelicMax = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Draft Costs", "Maximum Cost Common Relic", 175, new ConfigDescriptionBuilder
{
English = "Maximum cost of an common artifact.",
Chinese = "修改普通神器的最高价格。"
}.ToString());
draftCostUncommonRelicMin = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Draft Costs", "Minimum Cost Uncommon Relic", 125, new ConfigDescriptionBuilder
{
English = "Minimum cost of a uncommon artifact.",
Chinese = "修改高级神器的最低价格。"
}.ToString());
draftCostUncommonRelicMax = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Draft Costs", "Maximum Cost Uncommon Relic", 175, new ConfigDescriptionBuilder
{
English = "Maximum cost of an uncommon artifact.",
Chinese = "修改高级神器的最高价格。"
}.ToString());
draftCostRareRelicMin = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Draft Costs", "Minimum Cost Rare Relic", 999, new ConfigDescriptionBuilder
{
English = "(Unused) Minimum cost of a rare shop artifact.",
Chinese = "(未使用)修改稀有神器的最低价格。"
}.ToString());
draftCostRareRelicMax = ((BaseUnityPlugin)this).Config.Bind<int>("Relic Draft Costs", "Maximum Cost Rare Relic", 999, new ConfigDescriptionBuilder
{
English = "(Unused) Maximum cost of a rare artifact.",
Chinese = "(未使用)修改稀有神器的最高价格。"
}.ToString());
draftCostCommonEnhancerMin = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Draft Costs", "Minimum Cost Common Enhancer", 15, new ConfigDescriptionBuilder
{
English = "Minimum cost of a common shop upgrade.",
Chinese = "修改普通升级石的最低价格。"
}.ToString());
draftCostCommonEnhancerMax = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Draft Costs", "Maximum Cost Common Enhancer", 25, new ConfigDescriptionBuilder
{
English = "Maximum cost of an common shop upgrade.",
Chinese = "修改普通升级石的最高价格。"
}.ToString());
draftCostUncommonEnhancerMin = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Draft Costs", "Minimum Cost Uncommon Enhancer", 35, new ConfigDescriptionBuilder
{
English = "Minimum cost of a uncommon shop upgrade.",
Chinese = "修改高级升级石的最低价格。"
}.ToString());
draftCostUncommonEnhancerMax = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Draft Costs", "Maximum Cost Uncommon Enhancer", 35, new ConfigDescriptionBuilder
{
English = "Maximum cost of an uncommon shop upgrade.",
Chinese = "修改高级升级石的最高价格。"
}.ToString());
draftCostRareEnhancerMin = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Draft Costs", "Minimum Cost Rare Enhancer", 80, new ConfigDescriptionBuilder
{
English = "Minimum cost of a rare shop upgrade.",
Chinese = "修改稀有升级石的最低价格。"
}.ToString());
draftCostRareEnhancerMax = ((BaseUnityPlugin)this).Config.Bind<int>("Enhancer (Shop Upgrade) Draft Costs", "Maximum Cost Rare Enhancer", 110, new ConfigDescriptionBuilder
{
English = "Maximum cost of a rare shop upgrade.",
Chinese = "修改稀有升级石的最高价格。"
}.ToString());
}
private void ReconfigureBalance(BalanceData balanceData)
{
//IL_0305: Unknown result type (might be due to invalid IL or missing references)
//IL_0334: Unknown result type (might be due to invalid IL or missing references)
//IL_0363: Unknown result type (might be due to invalid IL or missing references)
//IL_0392: Unknown result type (might be due to invalid IL or missing references)
//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
//IL_03f0: Unknown result type (might be due to invalid IL or missing references)
//IL_041f: Unknown result type (might be due to invalid IL or missing references)
//IL_044e: Unknown result type (might be due to invalid IL or missing references)
//IL_047d: Unknown result type (might be due to invalid IL or missing references)
List<RarityTicket> rarityTicket = GetRarityTicket(cardRarityTicketCommon, cardRarityTicketUncommon, cardRarityTicketRare, cardRarityTicketChampion);
List<RarityTicket> rarityTicket2 = GetRarityTicket(enhancerRarityTicketCommon, enhancerRarityTicketUncommon, enhancerRarityTicketRare, enhancerRarityTicketChampion);
List<RarityTicket> rarityTicket3 = GetRarityTicket(relicRarityTicketCommon, relicRarityTicketUncommon, relicRarityTicketRare, relicRarityTicketChampion);
GoldForSkippingRewardsData? goldForSkippingRewards = GetGoldForSkippingRewards();
SafeSetField<BalanceData>(balanceData, "cardRarityTicketValues", rarityTicket);
SafeSetField<BalanceData>(balanceData, "enhancerRarityTicketValues", rarityTicket2);
SafeSetField<BalanceData>(balanceData, "relicRarityTicketValues", rarityTicket3);
SafeSetField<BalanceData>(balanceData, "goldForSkippingRewards", goldForSkippingRewards);
SafeSetField<BalanceData>(balanceData, "startingGold", startingGold.Value);
SafeSetField<BalanceData>(balanceData, "maxHandSize", maxHandSize.Value);
SafeSetField<BalanceData>(balanceData, "startOfTurnEnergy", startOfTurnEnergy.Value);
SafeSetField<BalanceData>(balanceData, "startOfDeploymentPhaseEnergy", startOfDeploymentPhaseEnergy.Value);
SafeSetField<BalanceData>(balanceData, "maxEnergy", maxEnergy.Value);
SafeSetField<BalanceData>(balanceData, "initialDragonsHoardCap", initialDragonsHoardCap.Value);
SafeSetField<BalanceData>(balanceData, "maxDragonsHoard", maxDragonsHoard.Value);
SafeSetField<BalanceData>(balanceData, "startOfTurnCards", startOfTurnCards.Value);
SafeSetField<BalanceData>(balanceData, "unitUpgradeSlots", unitUpgradeSlots.Value);
SafeSetField<BalanceData>(balanceData, "spellUpgradeSlots", spellUpgradeSlots.Value);
SafeSetField<BalanceData>(balanceData, "equipmentUpgradeSlots", equipmentUpgradeSlots.Value);
SafeSetField<BalanceData>(balanceData, "numSpawnPointsPerFloor", numSpawnPointsPerFloor.Value);
SafeSetField<BalanceData>(balanceData, "characterCapacityPerFloor", characterCapacityPerFloor.Value);
SafeSetField<BalanceData>(balanceData, "maxMutatorCount", maxMutatorCount.Value);
SafeSetField<BalanceData>(balanceData, "championUpgradesShown", championUpgradesShown.Value);
SafeSetField<BalanceData>(balanceData, "mainClanXpFactor", mainClanXpFactor.Value);
SafeSetField<BalanceData>(balanceData, "subClanXpFactor", subClanXpFactor.Value);
SafeSetField<BalanceData>(balanceData, "alternateChampionUnlockLevel", alternateChampionUnlockLevel.Value);
SafeSetField<BalanceData>(balanceData, "chanceOfOptionalOutpostDialogue", chanceOfOptionalOutpostDialogue.Value);
SafeSetField<BalanceData>(balanceData, "fastDialogueMultiplier", fastDialogueMultiplier.Value);
if (SafeGetField(balanceData, "draftCosts") is DraftCost[] array)
{
SafeSetField<DraftCost>(array[0], "costRange", (object)new Vector2Int(draftCostCommonCardMin.Value, draftCostCommonCardMax.Value));
SafeSetField<DraftCost>(array[1], "costRange", (object)new Vector2Int(draftCostUncommonCardMin.Value, draftCostUncommonCardMax.Value));
SafeSetField<DraftCost>(array[2], "costRange", (object)new Vector2Int(draftCostRareCardMin.Value, draftCostRareCardMax.Value));
SafeSetField<DraftCost>(array[3], "costRange", (object)new Vector2Int(draftCostCommonRelicMin.Value, draftCostCommonRelicMax.Value));
SafeSetField<DraftCost>(array[4], "costRange", (object)new Vector2Int(draftCostUncommonRelicMin.Value, draftCostUncommonRelicMax.Value));
SafeSetField<DraftCost>(array[5], "costRange", (object)new Vector2Int(draftCostRareRelicMin.Value, draftCostRareRelicMax.Value));
SafeSetField<DraftCost>(array[6], "costRange", (object)new Vector2Int(draftCostCommonEnhancerMin.Value, draftCostCommonEnhancerMax.Value));
SafeSetField<DraftCost>(array[7], "costRange", (object)new Vector2Int(draftCostUncommonEnhancerMin.Value, draftCostUncommonEnhancerMax.Value));
SafeSetField<DraftCost>(array[8], "costRange", (object)new Vector2Int(draftCostRareEnhancerMin.Value, draftCostRareEnhancerMax.Value));
}
}
private void SafeSetField<T>(T? data, string field, object? obj)
{
if (data == null)
{
Logger.LogError((object)"Internal Error data is null");
throw new ArgumentNullException("data");
}
if (obj == null)
{
Logger.LogWarning((object)("Not setting " + typeof(T).Name + " field " + field + " because the value to set is null (value specified may be invalid or field not present)"));
return;
}
try
{
Logger.LogDebug((object)$"Setting {typeof(T).Name} field {field} to {obj}");
AccessTools.Field(data.GetType(), field).SetValue(data, obj);
}
catch (Exception ex)
{
Logger.LogError((object)("Could not set " + typeof(T).Name + " field " + field + " because of an exception " + ex.Message));
}
}
private object? SafeGetField(BalanceData balanceData, string field)
{
try
{
Logger.LogDebug((object)("Getting BalanceData field " + field));
return AccessTools.Field(((object)balanceData).GetType(), field).GetValue(balanceData);
}
catch (Exception ex)
{
Logger.LogError((object)("Could not get BalanceData field " + field + " because of an exception " + ex.Message));
}
return null;
}
private List<RarityTicket>? GetRarityTicket(ConfigEntry<int> common, ConfigEntry<int> uncommon, ConfigEntry<int> rare, ConfigEntry<int> champion)
{
//IL_0009: 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_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: 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_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
return new List<RarityTicket>(4)
{
new RarityTicket
{
rarityType = (CollectableRarity)0,
ticketValue = common.Value
},
new RarityTicket
{
rarityType = (CollectableRarity)1,
ticketValue = uncommon.Value
},
new RarityTicket
{
rarityType = (CollectableRarity)2,
ticketValue = rare.Value
},
new RarityTicket
{
rarityType = (CollectableRarity)3,
ticketValue = champion.Value
}
};
}
private GoldForSkippingRewardsData? GetGoldForSkippingRewards()
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
GoldForSkippingRewardsData value = default(GoldForSkippingRewardsData);
value.cardDraft = goldSkipCardDraft.Value;
value.blessingDraft = goldSkipRelicDraft.Value;
value.championUpgradeDraft = goldSkipChampionUpgrade.Value;
value.individualBlessing = goldSkipIndividualRelic.Value;
value.individualCard = goldSkipIndividualCard.Value;
value.purge = goldSkipPurge.Value;
value.levelUpUnit = goldSkipLevelUpUnit.Value;
return value;
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "BalanceConfigurator.Plugin";
public const string PLUGIN_NAME = "BalanceConfigurator.Plugin";
public const string PLUGIN_VERSION = "1.2.1";
}
}