Decompiled source of TornadoWizards v1.0.4

TornadoWizards.dll

Decompiled 4 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BTD_Mod_Helper;
using BTD_Mod_Helper.Api;
using BTD_Mod_Helper.Api.ModOptions;
using BTD_Mod_Helper.Extensions;
using Il2Cpp;
using Il2CppAssets.Scripts.Models;
using Il2CppAssets.Scripts.Models.Entities;
using Il2CppAssets.Scripts.Models.GenericBehaviors;
using Il2CppAssets.Scripts.Models.Towers;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Attack;
using Il2CppAssets.Scripts.Models.Towers.Filters;
using Il2CppAssets.Scripts.Models.Towers.Projectiles;
using Il2CppAssets.Scripts.Models.Towers.Projectiles.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Weapons;
using Il2CppAssets.Scripts.Unity;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppNinjaKiwi.Common.ResourceUtils;
using Il2CppNinjaKiwi.Localization;
using Il2CppSystem.Linq;
using MelonLoader;
using Microsoft.CodeAnalysis;
using PathsPlusPlus;
using TornadoWizards;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(TornadoWizardsMod), "Tornado Wizards", "1.0.4", "doombubbles", null)]
[assembly: MelonGame("Ninja Kiwi", "BloonsTD6")]
[assembly: MelonGame("Ninja Kiwi", "BloonsTD6-Epic")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("TornadoWizards")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+f042f8400c35ae267db03175fe16482359eb92f1")]
[assembly: AssemblyProduct("TornadoWizards")]
[assembly: AssemblyTitle("TornadoWizards")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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]
	[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 TornadoWizards
{
	public static class ModHelperData
	{
		public const string WorksOnVersion = "54.0";

		public const string Version = "1.0.4";

		public const string Name = "Tornado Wizards";

		public const string Description = "A mod making use of PathsPlusPlus to add an additional upgrade path for Wizards.\nThe 5 new upgrades give them back lightning and tornado themed abilities they had in previous games that were instead shifted to Druids in BTD6.";

		public const string RepoOwner = "doombubbles";

		public const string PrevRepoName = "tornado-wizards";

		public const string RepoName = "TornadoWizards";

		public const string Dependencies = "doombubbles/PathsPlusPlus";
	}
	public class MysticDisruption : UpgradePlusPlus<TornadoWizardPath>
	{
		public override int Cost => 400;

		public override int Tier => 1;

		public override string Icon => "f8ecd04260b47014493bc025eae0dbf1";

		public override string Portrait => "Wizard1";

		public override string Description => "Attacks slightly faster, and magic can now pop purple Bloons.";

		public override void ApplyUpgrade(TowerModel towerModel, int tier)
		{
			//IL_0064: 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)
			foreach (WeaponModel item in Enumerable.ToArray<WeaponModel>(((Model)towerModel).GetDescendants<WeaponModel>()))
			{
				item.Rate /= 1.1f;
			}
			foreach (DamageModel item2 in Enumerable.ToArray<DamageModel>(((Model)towerModel).GetDescendants<DamageModel>()))
			{
				item2.immuneBloonProperties = (BloonProperties)(item2.immuneBloonProperties & -9);
			}
			if (((UpgradePlusPlus)this).IsHighestUpgrade(towerModel, false))
			{
				PrefabReference display = (TowerModelBehaviorExt.GetBehavior<DisplayModel>(towerModel).display = ((EntityModel)Game.instance.model.GetTower(TowerType.WizardMonkey, 0, 0, 1)).display);
				((EntityModel)towerModel).display = display;
			}
		}
	}
	public class LightningBolt : UpgradePlusPlus<TornadoWizardPath>
	{
		public override int Cost => 1020;

		public override int Tier => 2;

		public override string Portrait => "Wizard2";

		public override string Description => "Unleashes the power of lightning to zap many Bloons at once in a chain.";

		public override void ApplyUpgrade(TowerModel towerModel, int tier)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: 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_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Expected O, but got Unknown
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			TowerModel tower = Game.instance.model.GetTower(TowerType.Druid, Math.Min(tier, 5), 0, 0);
			WeaponModel val = ModelExt.Duplicate<WeaponModel>(ModelExt.FindDescendant<WeaponModel>((Model)(object)tower, "Lightning"));
			val.animation = 1;
			DamageModel damageModel = ProjectileModelExt.GetDamageModel(val.projectile);
			damageModel.immuneBloonProperties = (BloonProperties)(damageModel.immuneBloonProperties & -9);
			if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Monkey Sense"))
			{
				Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)val).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel model)
				{
					model.isActive = false;
				});
			}
			if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Arcane Mastery"))
			{
				float damage = damageModel.damage;
				damageModel.damage = damage + 1f;
				if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Arcane Spike"))
				{
					DamageModifierForTagModel val2 = CreateDamageModifierForTagModelExt.Create(new Args
					{
						damageAddative = 6f,
						tag = "Moabs"
					});
					ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(val.projectile, val2);
					val.projectile.hasDamageModifiers = true;
					if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Archmage"))
					{
						damageModel.damage += 7f;
						val2.damageAddative = 24f;
						ProjectileModel projectile = val.projectile;
						damage = projectile.pierce;
						projectile.pierce = damage + 1f;
						ProjectileModel projectile2 = val.projectile;
						damage = projectile2.maxPierce;
						projectile2.maxPierce = damage + 1f;
						val.Rate /= 2f;
					}
				}
			}
			if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Dragon's Breath"))
			{
				val.Rate /= 3f;
				if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Summon Phoenix"))
				{
					damageModel.damage *= 2f;
					if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Wizard Lord Phoenix"))
					{
						damageModel.damage *= 3f;
					}
					TowerModel[] array = ModelExt.FindDescendants<TowerModel>((Model)(object)towerModel, "Phoenix");
					foreach (TowerModel val3 in array)
					{
						AttackModel attackModel = TowerModelExt.GetAttackModel(val3);
						WeaponModel val4 = ((IEnumerable<WeaponModel>)attackModel.weapons).First();
						WeaponModel val5 = ModelExt.Duplicate<WeaponModel>(val);
						val5.animation = 1;
						WeaponModelExt.SetEject(val5, WeaponModelExt.GetEject(val4), false, false, false);
						val5.Rate *= val4.Rate / 0.2f;
						AttackModelExt.AddWeapon(attackModel, val5);
					}
				}
			}
			AttackModelExt.AddWeapon(TowerModelExt.GetAttackModel(towerModel), val);
			if (((UpgradePlusPlus)this).IsHighestUpgrade(towerModel, false))
			{
				PrefabReference display = (TowerModelBehaviorExt.GetBehavior<DisplayModel>(towerModel).display = ((EntityModel)Game.instance.model.GetTower(TowerType.WizardMonkey, 0, 0, 1)).display);
				((EntityModel)towerModel).display = display;
			}
		}
	}
	public class SummonWhirlwind : UpgradePlusPlus<TornadoWizardPath>
	{
		public override int Cost => 1700;

		public override int Tier => 3;

		public override string Icon => "87bf090e91425a94eb2050f4d9256133";

		public override string Portrait => "Wizard3";

		public override string Description => "Whirlwind blows bloons off the path away from the exit. However, removes ice and glue from the bloons.";

		public override void ApplyUpgrade(TowerModel towerModel, int tier)
		{
			TowerModel tower = Game.instance.model.GetTower(TowerType.Druid, Math.Min(tier, 5), 0, 0);
			AttackModel val = ModelExt.Duplicate<AttackModel>(TowerModelExt.GetAttackModels(tower).First((AttackModel model) => ((Model)model).name.Contains("Tornado")));
			((Il2CppArrayBase<WeaponModel>)(object)val.weapons)[0].animation = 1;
			if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Monkey Sense"))
			{
				Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)val).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel model)
				{
					model.isActive = false;
				});
			}
			val.range = towerModel.range;
			TowerModelBehaviorExt.AddBehavior<AttackModel>(towerModel, val);
		}
	}
	public class ElectricOverload : UpgradePlusPlus<TornadoWizardPath>
	{
		public override int Tier => 4;

		public override string Portrait => "Wizard4";

		public override int Cost => ModSettingBool.op_Implicit(TornadoWizardsMod.BallLightning) ? Game.instance.model.GetUpgrade("Ball Lightning").cost : 7000;

		public override string DisplayName => ModSettingBool.op_Implicit(TornadoWizardsMod.BallLightning) ? "[Ball Lightning]" : ((NamedModContent)this).DisplayName;

		public override string Description => ModSettingBool.op_Implicit(TornadoWizardsMod.BallLightning) ? "[Ball Lightning Description]" : "Supercharges the Lightning attack, increasing damage, speed, and splitting.";

		public override string Icon => ModSettingBool.op_Implicit(TornadoWizardsMod.BallLightning) ? "2839dd76ceecd024291cf9c489473e30" : ((UpgradePlusPlus)this).Icon;

		public override void ApplyUpgrade(TowerModel towerModel, int tier)
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			if (ModSettingBool.op_Implicit(TornadoWizardsMod.BallLightning))
			{
				TowerModel tower = Game.instance.model.GetTower(TowerType.Druid, Math.Min(tier, 5), 0, 0);
				WeaponModel val = ModelExt.Duplicate<WeaponModel>(((IEnumerable<WeaponModel>)TowerModelExt.GetAttackModel(tower).weapons).First((WeaponModel w) => ((Model)w).name == "WeaponModel_BallLightning"));
				val.animation = 1;
				DamageModel damageModel = ProjectileModelExt.GetDamageModel(val.projectile);
				damageModel.immuneBloonProperties = (BloonProperties)(damageModel.immuneBloonProperties & -9);
				if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Monkey Sense"))
				{
					Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)val).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel model)
					{
						model.isActive = false;
					});
				}
				AttackModelExt.AddWeapon(TowerModelExt.GetAttackModel(towerModel), val);
			}
			else
			{
				WeaponModel val2 = ((IEnumerable<WeaponModel>)TowerModelExt.GetAttackModel(towerModel).weapons).First((WeaponModel w) => ((Model)w).name == "WeaponModel_Lightning");
				val2.Rate /= 2f;
				ProjectileModel projectile = val2.projectile;
				DamageModel damageModel2 = ProjectileModelExt.GetDamageModel(projectile);
				damageModel2.damage += 4f;
				LightningModel behavior = ProjectileModelBehaviorExt.GetBehavior<LightningModel>(projectile);
				int splits = behavior.splits;
				behavior.splits = splits + 1;
			}
			if (((UpgradePlusPlus)this).IsHighestUpgrade(towerModel, false))
			{
				PrefabReference display = (TowerModelBehaviorExt.GetBehavior<DisplayModel>(towerModel).display = ((EntityModel)Game.instance.model.GetTower(TowerType.Druid, 4, 0, 0)).display);
				((EntityModel)towerModel).display = display;
			}
		}
	}
	public class TempestTornado : UpgradePlusPlus<TornadoWizardPath>
	{
		public override int Tier => 5;

		public override string Icon => "3a2676eac98a3b24194bf9963296f12e";

		public override string Portrait => "Wizard5";

		public override int Cost => ModSettingBool.op_Implicit(TornadoWizardsMod.BallLightning) ? Game.instance.model.GetUpgrade("Superstorm").cost : 50000;

		public override string Description => "The tempest blows more Bloons faster, further, and more often.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			TowerModel tower = Game.instance.model.GetTower(TowerType.Druid, 5, 0, 0);
			WeaponModel val = ModelExt.Duplicate<WeaponModel>(((IEnumerable<WeaponModel>)TowerModelExt.GetAttackModel(tower).weapons).First((WeaponModel w) => ((Model)w).name.Contains("Superstorm")));
			val.animation = 1;
			if (!ModSettingBool.op_Implicit(TornadoWizardsMod.BallLightning))
			{
				ProjectileModelBehaviorExt.RemoveBehavior<CreateProjectileOnIntervalModel>(val.projectile);
			}
			Il2CppGenericIEnumerable.ForEach<DamageModel>(((Model)val).GetDescendants<DamageModel>(), (Action<DamageModel>)delegate(DamageModel model)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				model.immuneBloonProperties = (BloonProperties)(model.immuneBloonProperties & -9);
			});
			if (((Il2CppArrayBase<string>)(object)towerModel.appliedUpgrades).Contains("Monkey Sense"))
			{
				Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)val).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel model)
				{
					model.isActive = false;
				});
			}
			AttackModelExt.AddWeapon(TowerModelExt.GetAttackModel(towerModel), val);
			if (((UpgradePlusPlus)this).IsHighestUpgrade(towerModel, false))
			{
				PrefabReference display = (TowerModelBehaviorExt.GetBehavior<DisplayModel>(towerModel).display = ((EntityModel)Game.instance.model.GetTower(TowerType.Druid, 5, 0, 0)).display);
				((EntityModel)towerModel).display = display;
			}
		}
	}
	public class TornadoWizardsMod : BloonsTD6Mod
	{
		public static readonly ModSettingBool BallLightning;

		static TornadoWizardsMod()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_0037: Expected O, but got Unknown
			ModSettingBool val = new ModSettingBool(false)
			{
				description = "Uses Ball Lightning as the Tier 4 Upgrade instead of the custom Lightning Overload upgrade. \r\nAlso reincorporates the Ball Lightning projectiles into the Tier 5 Upgrade.",
				icon = "2839dd76ceecd024291cf9c489473e30"
			};
			((ModSetting<bool>)val).onSave = delegate
			{
				((NamedModContent)ModContent.GetInstance<ElectricOverload>()).RegisterText(LocalizationManager.Instance.defaultTable);
			};
			BallLightning = val;
		}
	}
	public class TornadoWizardPath : PathPlusPlus
	{
		public override string Tower => TowerType.WizardMonkey;
	}
}