Decompiled source of TempleBase v1.1.13

TempleBase.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.Display;
using BTD_Mod_Helper.Api.Helpers;
using BTD_Mod_Helper.Api.ModOptions;
using BTD_Mod_Helper.Api.Towers;
using BTD_Mod_Helper.Extensions;
using HarmonyLib;
using Il2Cpp;
using Il2CppAssets.Scripts;
using Il2CppAssets.Scripts.Models;
using Il2CppAssets.Scripts.Models.Audio;
using Il2CppAssets.Scripts.Models.Effects;
using Il2CppAssets.Scripts.Models.Entities;
using Il2CppAssets.Scripts.Models.GenericBehaviors;
using Il2CppAssets.Scripts.Models.Map;
using Il2CppAssets.Scripts.Models.TowerSets;
using Il2CppAssets.Scripts.Models.Towers;
using Il2CppAssets.Scripts.Models.Towers.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Abilities;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Abilities.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Attack;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Attack.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Mutators;
using Il2CppAssets.Scripts.Models.Towers.Projectiles;
using Il2CppAssets.Scripts.Models.Towers.Projectiles.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.TowerFilters;
using Il2CppAssets.Scripts.Models.Towers.Weapons;
using Il2CppAssets.Scripts.Models.Towers.Weapons.Behaviors;
using Il2CppAssets.Scripts.Simulation;
using Il2CppAssets.Scripts.Simulation.Objects;
using Il2CppAssets.Scripts.Simulation.SMath;
using Il2CppAssets.Scripts.Simulation.Towers;
using Il2CppAssets.Scripts.Simulation.Towers.Behaviors;
using Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Abilities.Behaviors;
using Il2CppAssets.Scripts.Unity;
using Il2CppAssets.Scripts.Unity.Bridge;
using Il2CppAssets.Scripts.Unity.Display;
using Il2CppAssets.Scripts.Unity.UI_New.InGame;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppNinjaKiwi.Common.ResourceUtils;
using MelonLoader;
using Microsoft.CodeAnalysis;
using TempleBase;
using TempleBase.Displays;
using TempleBase.SacrificeAttacks;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(TempleBaseMod), "Temple Base", "1.1.13", "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("TempleBase")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a0aa255a2920aaf52660c246f7b93ecdb64a4fb0")]
[assembly: AssemblyProduct("TempleBase")]
[assembly: AssemblyTitle("TempleBase")]
[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 TempleBase
{
	public static class Extensions
	{
		public static void SetSelectable(this TargetSupplierModel m, bool value)
		{
			TargetFirstModel val = default(TargetFirstModel);
			TargetLastModel val2 = default(TargetLastModel);
			TargetStrongModel val3 = default(TargetStrongModel);
			TargetCloseModel val4 = default(TargetCloseModel);
			TargetFirstPrioCamoModel val5 = default(TargetFirstPrioCamoModel);
			TargetLastPrioCamoModel val6 = default(TargetLastPrioCamoModel);
			TargetStrongPrioCamoModel val7 = default(TargetStrongPrioCamoModel);
			TargetClosePrioCamoModel val8 = default(TargetClosePrioCamoModel);
			TargetEliteTargettingModel val9 = default(TargetEliteTargettingModel);
			if (Il2CppSystemObjectExt.Is<TargetFirstModel>((Il2CppObjectBase)(object)m, ref val))
			{
				val.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetLastModel>((Il2CppObjectBase)(object)m, ref val2))
			{
				val2.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetStrongModel>((Il2CppObjectBase)(object)m, ref val3))
			{
				val3.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetCloseModel>((Il2CppObjectBase)(object)m, ref val4))
			{
				val4.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetFirstPrioCamoModel>((Il2CppObjectBase)(object)m, ref val5))
			{
				val5.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetLastPrioCamoModel>((Il2CppObjectBase)(object)m, ref val6))
			{
				val6.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetStrongPrioCamoModel>((Il2CppObjectBase)(object)m, ref val7))
			{
				val7.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetClosePrioCamoModel>((Il2CppObjectBase)(object)m, ref val8))
			{
				val8.isSelectable = value;
			}
			else if (Il2CppSystemObjectExt.Is<TargetEliteTargettingModel>((Il2CppObjectBase)(object)m, ref val9))
			{
				val9.isSelectable = value;
			}
		}

		public static AttackModel FixedSacAttack(this AttackModel attackModel)
		{
			AttackModel val = ModelExt.Duplicate<AttackModel>(attackModel);
			AttackModelBehaviorExt.RemoveBehavior<UseTowerRangeModel>(val);
			AttackModelBehaviorExt.GetBehaviors<TargetSupplierModel>(val).ForEach(delegate(TargetSupplierModel model)
			{
				model.SetSelectable(value: true);
			});
			Il2CppGenericIEnumerable.ForEach<WeaponModel>(((Model)val).GetDescendants<WeaponModel>(), (Action<WeaponModel>)delegate(WeaponModel weaponModel)
			{
				WeaponModelBehaviorExt.RemoveBehavior<UseParentEjectModel>(weaponModel);
				WeaponModelBehaviorExt.RemoveBehavior<CheckTempleCanFireModel>(weaponModel);
			});
			Il2CppGenericIEnumerable.ForEach<TowerModel>(((Model)val).GetDescendants<TowerModel>(), (Action<TowerModel>)delegate(TowerModel towerModel)
			{
				Il2CppGenericIEnumerable.ForEach<WeaponModel>(((Model)towerModel).GetDescendants<WeaponModel>(), (Action<WeaponModel>)delegate(WeaponModel weaponModel)
				{
					WeaponModelBehaviorExt.RemoveBehavior<CheckTempleCanFireModel>(weaponModel);
				});
			});
			return val;
		}

		public static SupportModel FixedSacSupport(this SupportModel supportModel)
		{
			SupportModel val = ModelExt.Duplicate<SupportModel>(supportModel);
			val.isGlobal = true;
			val.onlyShowBuffIfMutated = true;
			return val;
		}

		public static T Paragon<T>(this T getFixedBoi) where T : Model
		{
			Il2CppGenericIEnumerable.ForEach<DamageModel>(((Model)getFixedBoi).GetDescendants<DamageModel>(), (Action<DamageModel>)delegate(DamageModel model)
			{
				model.damage *= 2f;
				model.immuneBloonProperties = (BloonProperties)0;
			});
			Il2CppGenericIEnumerable.ForEach<DisplayModel>(((Model)getFixedBoi).GetDescendants<DisplayModel>(), (Action<DisplayModel>)delegate(DisplayModel model)
			{
				model.display = CosmeticHelper.SwapDarkTempleAsset(model.display);
			});
			Il2CppGenericIEnumerable.ForEach<EffectModel>(((Model)getFixedBoi).GetDescendants<EffectModel>(), (Action<EffectModel>)delegate(EffectModel model)
			{
				model.assetId = CosmeticHelper.SwapDarkTempleAsset(model.assetId);
			});
			Il2CppGenericIEnumerable.ForEach<ProjectileModel>(((Model)getFixedBoi).GetDescendants<ProjectileModel>(), (Action<ProjectileModel>)delegate(ProjectileModel model)
			{
				model.display = CosmeticHelper.SwapDarkTempleAsset(model.display);
			});
			Il2CppGenericIEnumerable.ForEach<AirUnitModel>(((Model)getFixedBoi).GetDescendants<AirUnitModel>(), (Action<AirUnitModel>)delegate(AirUnitModel model)
			{
				model.display = CosmeticHelper.SwapDarkTempleAsset(model.display);
			});
			Il2CppGenericIEnumerable.ForEach<TowerModel>(((Model)getFixedBoi).GetDescendants<TowerModel>(), (Action<TowerModel>)delegate(TowerModel model)
			{
				((EntityModel)model).display = CosmeticHelper.SwapDarkTempleAsset(((EntityModel)model).display);
				model.Paragon<TowerModel>();
			});
			return getFixedBoi;
		}

		public static Tower? GetTowerOnTop(this Tower tower)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			TowerManager towerManager = InGameExt.GetTowerManager(InGame.instance);
			TowerModel towerModel = tower.towerModel;
			return Il2CppGenerics.FirstOrDefault<Tower>(Il2CppGenerics.Where<Tower>(towerManager.GetClosestTowers(((CommonBehaviorProxy<ITowerBehavior>)(object)tower).Position.ToVector2(), -1, (TowerFilter)null, towerModel.range), (Func<Tower, bool>)delegate(Tower t)
			{
				//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)
				ObjectId parentId = ((CommonBehaviorProxy<ITowerBehavior>)(object)t).ParentId;
				return ((ObjectId)(ref parentId)).Id == -1;
			}), (Func<Tower, bool>)((Tower t) => ((RootObject)t).Id != ((RootObject)tower).Id));
		}

		public static List<Tower> GetAllTowersOnTop(this Tower tower)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			TowerManager towerManager = InGameExt.GetTowerManager(InGame.instance);
			TowerModel towerModel = tower.towerModel;
			return Il2CppGenericsExt.ToList<Tower>(Il2CppGenerics.Where<Tower>(towerManager.GetClosestTowers(((CommonBehaviorProxy<ITowerBehavior>)(object)tower).Position.ToVector2(), -1, (TowerFilter)null, towerModel.range), (Func<Tower, bool>)delegate(Tower t)
			{
				//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_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				ObjectId parentId = ((CommonBehaviorProxy<ITowerBehavior>)(object)t).ParentId;
				return ((ObjectId)(ref parentId)).Id == -1 && ((RootObject)t).Id != ((RootObject)tower).Id;
			}));
		}

		public static void ApplyToAttack(this TempleTowerMutatorGroupModel templeTowerMutatorGroupModel, AttackModel attackModel)
		{
			if (((TowerMutatorGroupModel)templeTowerMutatorGroupModel).mutators == null)
			{
				return;
			}
			WeaponModel val = ((Il2CppArrayBase<WeaponModel>)(object)attackModel.weapons)[0];
			ProjectileModel projectile = val.projectile;
			DamageModel damageModel = ProjectileModelExt.GetDamageModel(projectile);
			PierceTowerMutatorModel val2 = default(PierceTowerMutatorModel);
			DamageTowerMutatorModel val3 = default(DamageTowerMutatorModel);
			ReloadTimeTowerMutatorModel val4 = default(ReloadTimeTowerMutatorModel);
			ProjectileSizeTowerMutatorModel val5 = default(ProjectileSizeTowerMutatorModel);
			ProjectileSpeedTowerMutatorModel val6 = default(ProjectileSpeedTowerMutatorModel);
			RangeTowerMutatorModel val7 = default(RangeTowerMutatorModel);
			WindChanceTowerMutatorModel val8 = default(WindChanceTowerMutatorModel);
			AddBehaviorToTowerMutatorModel val9 = default(AddBehaviorToTowerMutatorModel);
			RateSupportModel val10 = default(RateSupportModel);
			PierceSupportModel val11 = default(PierceSupportModel);
			RangeSupportModel val12 = default(RangeSupportModel);
			DamageSupportModel val13 = default(DamageSupportModel);
			foreach (TowerMutatorModel item in ((IEnumerable<TowerMutatorModel>)((TowerMutatorGroupModel)templeTowerMutatorGroupModel).mutators).Where((TowerMutatorModel mutator) => mutator.conditionalId == null))
			{
				if (Il2CppSystemObjectExt.Is<PierceTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val2))
				{
					projectile.pierce += (float)val2.pierce;
				}
				else if (Il2CppSystemObjectExt.Is<DamageTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val3))
				{
					damageModel.damage += val3.damage;
				}
				else if (Il2CppSystemObjectExt.Is<ReloadTimeTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val4))
				{
					val.Rate *= 1f - val4.multiplier;
				}
				else if (Il2CppSystemObjectExt.Is<ProjectileSizeTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val5))
				{
					projectile.radius *= 1f + val5.sizeModifier;
					projectile.scale *= 1f + val5.assetSizeModifier;
				}
				else if (Il2CppSystemObjectExt.Is<ProjectileSpeedTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val6))
				{
					TravelStraitModel behavior = ProjectileModelBehaviorExt.GetBehavior<TravelStraitModel>(projectile);
					behavior.Speed *= 1f + val6.speedModifier;
				}
				else if (Il2CppSystemObjectExt.Is<RangeTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val7))
				{
					attackModel.range += val7.rangeIncrease;
				}
				else if (Il2CppSystemObjectExt.Is<WindChanceTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val8))
				{
					WindModel behavior2 = ProjectileModelBehaviorExt.GetBehavior<WindModel>(projectile);
					behavior2.chance += val8.windChance;
				}
				else
				{
					if (!Il2CppSystemObjectExt.Is<AddBehaviorToTowerMutatorModel>((Il2CppObjectBase)(object)item, ref val9))
					{
						continue;
					}
					foreach (TowerBehaviorModel item2 in (Il2CppArrayBase<TowerBehaviorModel>)(object)val9.behaviors)
					{
						if (Il2CppSystemObjectExt.Is<RateSupportModel>((Il2CppObjectBase)(object)item2, ref val10))
						{
							val.Rate *= val10.multiplier;
						}
						else if (Il2CppSystemObjectExt.Is<PierceSupportModel>((Il2CppObjectBase)(object)item2, ref val11))
						{
							projectile.pierce += val11.pierce;
						}
						else if (Il2CppSystemObjectExt.Is<RangeSupportModel>((Il2CppObjectBase)(object)item2, ref val12))
						{
							attackModel.range += val12.additive;
							attackModel.range *= 1f + val12.multiplier;
						}
						else if (Il2CppSystemObjectExt.Is<DamageSupportModel>((Il2CppObjectBase)(object)item2, ref val13))
						{
							DamageModel damageModel2 = ProjectileModelExt.GetDamageModel(projectile);
							damageModel2.damage += val13.increase;
						}
					}
				}
			}
		}
	}
	public static class ModHelperData
	{
		public const string WorksOnVersion = "54.0";

		public const string Version = "1.1.13";

		public const string Name = "Temple Base";

		public const string Description = "Adds in the Temple Base, a tower that lets you place another tower on top of it to power it up like a Sun Temple.";

		public const string RepoOwner = "doombubbles";

		public const string PrevRepoName = "temple-base";

		public const string RepoName = "TempleBase";

		public const string Icon = "TempleBase.png";
	}
	internal static class AllowTempleSacrificing
	{
		[HarmonyPatch(typeof(MonkeyTemple), "StartSacrifice")]
		internal static class MonkeyTemple_StartSacrifice
		{
			[HarmonyPrefix]
			private static void Prefix()
			{
				sacrificing = true;
			}

			[HarmonyPostfix]
			private static void Postfix()
			{
				sacrificing = false;
			}
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		internal static class TowerModel_isPowerTower
		{
			[HarmonyPrefix]
			private static bool Prefix(TowerModel __instance, ref bool __result)
			{
				if (sacrificing && TowerModelExt.GetModTower(__instance) is TempleBase)
				{
					__result = true;
					return false;
				}
				return true;
			}
		}

		public static bool sacrificing;
	}
	internal static class ParagonSacrificing
	{
		[HarmonyPatch(typeof(ParagonTower), "StartSacrifice")]
		internal static class ParagonTower_StartSacrifice
		{
			[HarmonyPrefix]
			private static void Prefix(ParagonTower __instance)
			{
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				if (TowerModelExt.GetModTower(((TowerBehavior)__instance).tower.towerModel) is TempleBase)
				{
					paragonTower = __instance;
					index = 0;
					Tower towerOnTop = ((TowerBehavior)__instance).tower.GetTowerOnTop();
					if (towerOnTop != null)
					{
						Vector2 val = ((CommonBehaviorProxy<ITowerBehavior>)(object)((TowerBehavior)__instance).tower).Position.ToVector2();
						towerOnTop.PositionTower(new Vector2(val.x, val.y + 10f), true);
					}
				}
			}

			[HarmonyPostfix]
			private static void Postfix()
			{
				paragonTower = null;
			}
		}

		[HarmonyPatch(typeof(TowerManager), "TowerSacrificed")]
		internal static class TowerManager_TowerSacrificed
		{
			[HarmonyPrefix]
			private static void Prefix(Tower tower)
			{
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0043: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				Tower val = default(Tower);
				if (TowerModelExt.GetModTower(tower.towerModel) is TempleBase && paragonTower != null && Il2CppSystemObjectExt.Is<Tower>(tower.GetTowerOnTop(), ref val))
				{
					Vector2 val2 = ((CommonBehaviorProxy<ITowerBehavior>)(object)((TowerBehavior)paragonTower).tower).Position.ToVector2();
					val.PositionTower(new Vector2(val2.x - 10f + (float)(index * 20), val2.y - 10f), true);
					index++;
				}
			}
		}

		public static int index;

		public static ParagonTower? paragonTower;
	}
	public class TempleBase : ModTower
	{
		public const float Height = 40f;

		public const float Width = 13f;

		public override TowerSet TowerSet => (TowerSet)8;

		public override string BaseTower => TowerType.MonkeyVillage;

		public override ParagonMode ParagonMode => (ParagonMode)2;

		public override int Cost => 500;

		public override string Icon => ((ModContent)this).Name;

		public override string Portrait => ((ModContent)this).Name;

		public override string Description => "Place a tower on top of this to designate it 'The Chosen'.\nBy default, increases The Chosen's range.";

		public override bool IncludeInRogueLegends => true;

		public override void ModifyBaseTowerModel(TowerModel towerModel)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			RectangleFootprintModel val = (RectangleFootprintModel)(object)(towerModel.footprint = (FootprintModel)new RectangleFootprintModel("RectangleFootprintModel_", 40f, 40f, false, false, false));
			TowerModelBehaviorExt.AddBehavior<RectangleFootprintModel>(towerModel, val);
			towerModel.range = 13f;
			TowerModelExt.GetAttackModel(towerModel).range = 13f;
			TowerModelBehaviorExt.AddBehavior<AddMakeshiftAreaModel>(towerModel, GetAreaModel());
			TowerModel tower = Game.instance.model.GetTower(TowerType.SuperMonkey, (towerModel.tier >= 5) ? 5 : 4, 0, 0);
			DisplayModel val3 = ModelExt.Duplicate<DisplayModel>(TowerModelBehaviorExt.GetBehavior<DisplayModel>(tower));
			TowerModelBehaviorExt.RemoveBehaviors<DisplayModel>(towerModel);
			TowerModelBehaviorExt.AddBehavior<DisplayModel>(towerModel, val3);
			((EntityModel)towerModel).display = val3.display;
			RangeSupportModel behavior = TowerModelBehaviorExt.GetBehavior<RangeSupportModel>(towerModel);
			behavior.mutatorId = "TempleBase-Range";
			SupportModelExt.ApplyBuffIcon<TempleBaseBuffIcon>((SupportModel)(object)behavior);
			TowerModelBehaviorExt.RemoveBehavior<TransformTowerXpModel>(towerModel);
		}

		public static AddMakeshiftAreaModel GetAreaModel()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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_0059: Unknown result type (might be due to invalid IL or missing references)
			//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)
			Args val = new Args();
			val.points = (Vector3[])(object)new Vector3[4]
			{
				new Vector3(-13f, -13f, 40f),
				new Vector3(13f, -13f, 40f),
				new Vector3(13f, 13f, 40f),
				new Vector3(-13f, 13f, 40f)
			};
			val.newAreaType = (AreaType)2;
			val.filterInTowerSizes = new string[4] { "small", "medium", "large", "XL" };
			val.ignoreZAxisTowerCollision = true;
			val.destroyTowersOnAreaWhenSold = true;
			val.dontDestroyTowersWhenAreaChanges = true;
			return CreateAddMakeshiftAreaModelExt.Create(val);
		}

		public override bool IsValidCrosspath(params int[] tiers)
		{
			return ModHelper.HasMod("UltimateCrosspathing") || ((ModTower)this).IsValidCrosspath(tiers);
		}
	}
	public class TempleBaseBuffIcon : ModBuffIcon
	{
		public override string Icon => "TempleBase";
	}
	public class TempleBaseMod : BloonsTD6Mod
	{
		public static readonly ModSettingBool NerfedIncome = new ModSettingBool(true)
		{
			description = "Somewhat nerfs the income generation of the Bottom Path Upgrades when used with a Support Tower"
		};

		public override void OnTowerCreated(Tower tower, Entity target, Model modelToUse)
		{
			HandleAllModelChanges();
		}

		public override void OnTowerDestroyed(Tower tower)
		{
			HandleAllModelChanges();
		}

		public override void OnTowerUpgraded(Tower tower, string upgradeName, TowerModel newBaseTowerModel)
		{
			HandleAllModelChanges();
		}

		private static void HandleAllModelChanges()
		{
			if ((Object)(object)InGame.instance == (Object)null)
			{
				return;
			}
			UnityToSimulation bridge = InGame.instance.bridge;
			Simulation val = ((bridge != null) ? bridge.Simulation : null);
			if (val == null)
			{
				return;
			}
			IEnumerable<Tower> enumerable = from model in Il2CppGenericIEnumerableExt.ToList<Tower>(val.factory.GetUncast<Tower>())
				where TowerModelExt.GetModTower(model.towerModel) is TempleBase
				select model;
			foreach (Tower item in enumerable)
			{
				HandleSacAttacks(item);
				EnforceOneTowerPolicy(item);
				EmbiggenTempleTemples(item);
			}
		}

		private static void HandleSacAttacks(Tower tower)
		{
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			Tower towerOnTop = tower.GetTowerOnTop();
			bool isParagon = tower.towerModel.isParagon;
			int num = (isParagon ? 6 : ((Il2CppArrayBase<int>)(object)tower.towerModel.tiers)[2]);
			List<TempleBaseSacAttack> content = ModContent.GetContent<TempleBaseSacAttack>();
			List<TowerSet> list = new List<TowerSet>();
			if (isParagon)
			{
				list.AddRange(from t in tower.GetAllTowersOnTop()
					select t.towerModel.towerSet);
			}
			else if (towerOnTop != null)
			{
				list.Add(towerOnTop.towerModel.towerSet);
			}
			foreach (TempleBaseSacAttack item in content)
			{
				if (towerOnTop == null || item.Tier != num || !list.Contains(item.TowerSet))
				{
					item.Remove(tower);
				}
				else
				{
					item.Apply(tower);
				}
			}
		}

		private static void EnforceOneTowerPolicy(Tower tower)
		{
			Tower towerOnTop = tower.GetTowerOnTop();
			TowerModel val = ((Il2CppObjectBase)((Mutable)tower).rootModel).Cast<TowerModel>();
			bool flag = TowerModelBehaviorExt.GetBehavior<AddMakeshiftAreaModel>(val) != null;
			bool flag2 = towerOnTop != null && !TowerModelBehaviorExt.HasBehavior<MonkeyTempleModel>(towerOnTop.towerModel);
			if (flag2 == flag)
			{
				val = ModelExt.Duplicate<TowerModel>(val);
				if (flag)
				{
					TowerModelBehaviorExt.RemoveBehavior<AddMakeshiftAreaModel>(val);
				}
				else
				{
					TowerModelBehaviorExt.AddBehavior<AddMakeshiftAreaModel>(val, TempleBase.GetAreaModel());
				}
				((Mutable)tower).UpdateRootModel((Model)(object)val);
			}
		}

		private static void EmbiggenTempleTemples(Tower tower)
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected O, but got Unknown
			Tower towerOnTop = tower.GetTowerOnTop();
			bool flag = towerOnTop != null && TowerModelBehaviorExt.HasBehavior<MonkeyTempleModel>(towerOnTop.towerModel);
			float num = InGame.instance.bridge.Model.globalTowerScale * (flag ? 1.2f : 1f);
			if (((CommonBehaviorProxy<ITowerBehavior>)(object)tower).Scale.X != num)
			{
				((CommonBehaviorProxy<ITowerBehavior>)(object)tower).Scale = new Vector3Boxed(num, num, num);
			}
		}
	}
	public class VengefulTempleBaseBuffIcon : ModBuffIcon
	{
		public override string Icon => "VengefulTempleBase-Portrait";
	}
}
namespace TempleBase.Upgrades
{
	public abstract class TempleBaseUpgrade : ModUpgrade<TempleBase>
	{
		public const string TheTower = "The Chosen";

		public override string Icon => ((ModContent)this).Name;

		public override SpriteReference IconReference => ((ModContent)this).GetSpriteReferenceOrDefault(((ModUpgrade)this).Icon);

		protected static TowerModel SunTemple => Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0);

		protected static TowerModel SunGod => Game.instance.model.GetTower(TowerType.SuperMonkey, 5, 0, 0);
	}
	public class VengefulTempleBase : ModParagonUpgrade<TempleBase>
	{
		public override int Cost => 600000;

		public override string DisplayName => "Vengeful Temple Base";

		public override bool RemoveAbilities => false;

		public override string Description => "The Chosens combine forces atop this ancient monument to unbridled vengeance.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			towerModel.range = 20f;
			DisplayModel behavior = TowerModelBehaviorExt.GetBehavior<DisplayModel>(towerModel);
			PrefabReference val = CosmeticHelper.SwapDarkTempleAsset(behavior.display);
			PrefabReference display = (behavior.display = val);
			((EntityModel)towerModel).display = display;
			ParagonTowerModel behavior2 = TowerModelBehaviorExt.GetBehavior<ParagonTowerModel>(towerModel);
			foreach (AssetPathModel item in (Il2CppArrayBase<AssetPathModel>)(object)behavior2.displayDegreePaths)
			{
				item.assetPath = val;
			}
			behavior2.effectDuringModel.assetId = val;
			behavior2.endEffectModel.assetId = val;
			foreach (SupportModel behavior7 in TowerModelBehaviorExt.GetBehaviors<SupportModel>(towerModel))
			{
				SupportModelExt.ApplyBuffIcon<VengefulTempleBaseBuffIcon>(behavior7);
			}
			VengefulTempleBaseBuffIcon instance = ModContent.GetInstance<VengefulTempleBaseBuffIcon>();
			DiscountZoneModel behavior3 = TowerModelBehaviorExt.GetBehavior<DiscountZoneModel>(towerModel);
			((TowerBehaviorBuffModel)behavior3).buffLocsName = ((ModBuffIcon)instance).Icon;
			((TowerBehaviorBuffModel)behavior3).buffIconName = ((ModContent)instance).Id;
			DamageSupportModel behavior4 = TowerModelBehaviorExt.GetBehavior<DamageSupportModel>(towerModel);
			behavior4.mutatorId += "Vengeful";
			AbilityModel behavior5 = TowerModelBehaviorExt.GetBehavior<AbilityModel>(towerModel);
			behavior5.icon = ((ModUpgrade)this).IconReference;
			ActivateRangeSupportZoneModel behavior6 = AbilityModelBehaviorExt.GetBehavior<ActivateRangeSupportZoneModel>(behavior5);
			behavior6.mutatorId += "Vengeful";
		}
	}
}
namespace TempleBase.Upgrades.Top
{
	public class Daybreak : TempleBaseUpgrade
	{
		[HarmonyPatch(typeof(MutatorTower), "Mutate")]
		internal static class DamageSupport_Mutate
		{
			[HarmonyPostfix]
			private static void Postfix(MutatorTower __instance, Model model)
			{
				//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ed: Expected O, but got Unknown
				//IL_020e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0215: Expected O, but got Unknown
				if (!((BehaviorMutator)__instance).id.Contains("Daybreak"))
				{
					return;
				}
				DamageModel val = default(DamageModel);
				DamageModifierModel val4 = default(DamageModifierModel);
				foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(model.GetDescendants<ProjectileModel>()))
				{
					if (!ProjectileModelBehaviorExt.HasBehavior<DamageModel>(item, ref val))
					{
						continue;
					}
					ProjectileModel val2 = ModelExt.Duplicate<ProjectileModel>(TowerModelExt.GetWeapon(Game.instance.model.GetTower(TowerType.BombShooter, 0, 0, 0)).projectile);
					PrefabReference val3 = ((Il2CppArrayBase<WeaponModel>)(object)TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunGod).weapons)[0].projectile.display;
					if (((BehaviorMutator)__instance).id.Contains("Vengeful"))
					{
						val3 = CosmeticHelper.SwapDarkTempleAsset(val3);
					}
					CreateProjectileOnContactModel behavior = ProjectileModelBehaviorExt.GetBehavior<CreateProjectileOnContactModel>(val2);
					EffectModel effectModel = ProjectileModelBehaviorExt.GetBehavior<CreateEffectOnContactModel>(val2).effectModel;
					effectModel.assetId = val3;
					effectModel.lifespan /= 20f;
					behavior.projectile.pierce = 5f + item.pierce;
					if (((BehaviorMutator)__instance).id.Contains("Vengeful"))
					{
						ProjectileModelExt.GetDamageModel(behavior.projectile).damage = val.damage * 2f;
					}
					else
					{
						ProjectileModelExt.GetDamageModel(behavior.projectile).damage = 1f + val.damage;
					}
					ProjectileModelExt.GetDamageModel(behavior.projectile).immuneBloonProperties = (BloonProperties)0;
					foreach (Model item2 in (Il2CppArrayBase<Model>)(object)item.behaviors)
					{
						if (Il2CppSystemObjectExt.Is<DamageModifierModel>((Il2CppObjectBase)(object)item2, ref val4))
						{
							ProjectileModelBehaviorExt.AddBehavior<DamageModifierModel>(behavior.projectile, ModelExt.Duplicate<DamageModifierModel>(val4));
						}
					}
					CreateProjectileOnExhaustFractionModel val5 = new CreateProjectileOnExhaustFractionModel("CreateProjectileOnExhaustFractionModel_", behavior.projectile, behavior.emission, 0.01f, 1f, true, false, false);
					ProjectileModelBehaviorExt.AddBehavior<CreateProjectileOnExhaustFractionModel>(item, val5);
					CreateEffectOnExhaustFractionModel val6 = new CreateEffectOnExhaustFractionModel("", effectModel, 0f, (Fullscreen)0, 0.01f, 1f, false);
					ProjectileModelBehaviorExt.AddBehavior<CreateEffectOnExhaustFractionModel>(item, val6);
				}
			}
		}

		public override int Path => 0;

		public override int Tier => 5;

		public override int Cost => 90000;

		public override string Description => "The power of the sun in the palm of your hand...";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			TowerModelBehaviorExt.GetBehavior<DamageSupportModel>(towerModel).mutatorId = ((ModContent)this).Id + (towerModel.isParagon ? "Paragon" : "");
		}
	}
	public class PiercingLight : TempleBaseUpgrade
	{
		public override int Path => 0;

		public override int Tier => 1;

		public override int Cost => 750;

		public override string Description => "Increases The Chosen's pierce by 2.";

		public override string Icon => "68a4ad3c4022d418b99518023976fd6b";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			PierceSupportModel val = new PierceSupportModel("PierceSupportModel_TempleBase", true, 2f, ((ModContent)this).Id, new Il2CppReferenceArray<TowerFilterModel>(0L), false, "", "");
			SupportModelExt.ApplyBuffIcon<TempleBaseBuffIcon>((SupportModel)(object)val);
			TowerModelBehaviorExt.AddBehavior<PierceSupportModel>(towerModel, val);
		}
	}
	public class SolarEruption : TempleBaseUpgrade
	{
		[HarmonyPatch(typeof(MutatorTower), "Mutate")]
		internal static class DamageSupport_Mutate
		{
			[HarmonyPostfix]
			private static void Postfix(MutatorTower __instance, Model model)
			{
				//IL_0133: Unknown result type (might be due to invalid IL or missing references)
				//IL_013a: Expected O, but got Unknown
				//IL_015b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0162: Expected O, but got Unknown
				if (!((BehaviorMutator)__instance).id.Contains("SolarEruption"))
				{
					return;
				}
				DamageModel val = default(DamageModel);
				foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(model.GetDescendants<ProjectileModel>()))
				{
					if (ProjectileModelBehaviorExt.HasBehavior<DamageModel>(item, ref val))
					{
						ProjectileModel val2 = ModelExt.Duplicate<ProjectileModel>(TowerModelExt.GetWeapon(Game.instance.model.GetTower(TowerType.BombShooter, 0, 0, 0)).projectile);
						PrefabReference display = ((Il2CppArrayBase<WeaponModel>)(object)TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunTemple).weapons)[0].projectile.display;
						CreateProjectileOnContactModel behavior = ProjectileModelBehaviorExt.GetBehavior<CreateProjectileOnContactModel>(val2);
						EffectModel effectModel = ProjectileModelBehaviorExt.GetBehavior<CreateEffectOnContactModel>(val2).effectModel;
						effectModel.assetId = display;
						effectModel.lifespan /= 20f;
						behavior.projectile.pierce = 5f + item.pierce / 2f;
						ProjectileModelExt.GetDamageModel(behavior.projectile).damage = val.damage;
						ProjectileModelExt.GetDamageModel(behavior.projectile).immuneBloonProperties = (BloonProperties)0;
						CreateProjectileOnExhaustFractionModel val3 = new CreateProjectileOnExhaustFractionModel("CreateProjectileOnExhaustFractionModel_", behavior.projectile, behavior.emission, 0.01f, 1f, true, false, false);
						ProjectileModelBehaviorExt.AddBehavior<CreateProjectileOnExhaustFractionModel>(item, val3);
						CreateEffectOnExhaustFractionModel val4 = new CreateEffectOnExhaustFractionModel("", effectModel, 0f, (Fullscreen)0, 0.01f, 1f, false);
						ProjectileModelBehaviorExt.AddBehavior<CreateEffectOnExhaustFractionModel>(item, val4);
					}
				}
			}
		}

		public override int Path => 0;

		public override int Tier => 4;

		public override int Cost => 9000;

		public override string Description => "The Chosen's damaging projectiles cause explosions on first contact with Bloons.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			TowerModelBehaviorExt.GetBehavior<DamageSupportModel>(towerModel).mutatorId = ((ModContent)this).Id;
		}
	}
	public class SolarMauler : TempleBaseUpgrade
	{
		public override int Path => 0;

		public override int Tier => 3;

		public override int Cost => 3000;

		public override string Description => "The Chosen does further increased damage to Moab class bloons.";

		public override string Icon => "4f11d9b6f8bd4ec4fb1ef1cde5baf163";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			DamageModifierForTagModel val = new DamageModifierForTagModel("DamageModifierForTagModel_", "Moabs", 1.1f, 1f, false, true, false);
			DamageModifierSupportModel val2 = new DamageModifierSupportModel("DamageModifierSupportModel_", true, ((ModContent)this).Id, new Il2CppReferenceArray<TowerFilterModel>(0L), false, (DamageModifierModel)(object)val, false, 0f, false);
			SupportModelExt.ApplyBuffIcon<TempleBaseBuffIcon>((SupportModel)(object)val2);
			((Model)val2).AddChildDependant<DamageModifierForTagModel>(val);
			TowerModelBehaviorExt.AddBehavior<DamageModifierSupportModel>(towerModel, val2);
		}
	}
	public class SunBurn : TempleBaseUpgrade
	{
		public override int Path => 0;

		public override int Tier => 2;

		public override int Cost => 1500;

		public override string Description => "Increases the damage of The Chosen by 1";

		public override string Icon => "54fb88eeeb1c54d749d5c19bbcb67125";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			DamageSupportModel val = new DamageSupportModel("DamageSupportModel_TempleBase", true, 1f, ((ModContent)this).Id, new Il2CppReferenceArray<TowerFilterModel>(0L), false, false, 0f);
			SupportModelExt.ApplyBuffIcon<TempleBaseBuffIcon>((SupportModel)(object)val);
			TowerModelBehaviorExt.AddBehavior<DamageSupportModel>(towerModel, val);
		}
	}
}
namespace TempleBase.Upgrades.Mid
{
	public class AvatarOfSol : TempleBaseUpgrade
	{
		[HarmonyPatch(typeof(RangeMutator), "Mutate")]
		internal static class RangeMutator_Mutate
		{
			[HarmonyPostfix]
			private static void Postfix(RangeMutator __instance, Model model)
			{
				TowerModel towerModel = default(TowerModel);
				if (!((BehaviorMutator)__instance).id.Contains("AvatarOfSol") || !Il2CppSystemObjectExt.Is<TowerModel>((Il2CppObjectBase)(object)model, ref towerModel) || towerModel.isSubTower)
				{
					return;
				}
				AttackModel val = ModelExt.Duplicate<AttackModel>(TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunTemple));
				DisplayModelExt.ApplyDisplay<SunHead>(AttackModelBehaviorExt.GetBehavior<DisplayModel>(val));
				AttackModelBehaviorExt.GetBehavior<RotateToTargetModel>(val).onlyRotateDuringThrow = false;
				WeaponModelBehaviorExt.RemoveBehavior<CheckTempleCanFireModel>(((Il2CppArrayBase<WeaponModel>)(object)val.weapons)[0]);
				foreach (TempleTowerMutatorGroupModel item in from groupModel in TowerModelBehaviorExt.GetBehaviors<TempleTowerMutatorGroupModel>(TempleBaseUpgrade.SunTemple)
					where groupModel.towerSet == towerModel.towerSet
					select groupModel)
				{
					item.ApplyToAttack(val);
				}
				TowerModelBehaviorExt.AddBehavior<AttackModel>(towerModel, val);
			}
		}

		private const int Duration = 15;

		private const int Cooldown = 60;

		public override int Path => 1;

		public override int Tier => 4;

		public override int Cost => 20000;

		public override string Description => $"Ability: {"The Chosen"} becomes The Avatar of Sol for {15}s. {60}s cooldown.";

		public override string Icon => "080c12903611a654b8d3281aef7fe553";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Expected O, but got Unknown
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Expected O, but got Unknown
			ActivateRangeSupportZoneModel val = new ActivateRangeSupportZoneModel("ActivateRangeSupportZoneModel_" + ((ModContent)this).Id, ((ModContent)this).Id, true, 0f, 65f, 20f, 99f, false, 15f, new Il2CppReferenceArray<TowerFilterModel>(0L));
			AbilityHelper val2 = new AbilityHelper(((ModContent)this).Name);
			val2.DisplayName = ((NamedModContent)this).DisplayName;
			val2.Description = ((NamedModContent)this).Description;
			val2.Animation = 1;
			val2.IconReference = ((ModUpgrade)this).IconReference;
			val2.Cooldown = 60f;
			val2.Behaviors = (Model[])(object)new Model[2]
			{
				(Model)new CreateSoundOnAbilityModel("", new SoundModel("SoundModel_", TowerModelBehaviorExt.GetBehavior<CreateSoundOnAttachedModel>(TempleBaseUpgrade.SunTemple).sound.assetId), (SoundModel)null, (SoundModel)null),
				(Model)val
			};
			TowerModelBehaviorExt.AddBehavior(towerModel, (ModelHelper)(object)val2);
		}
	}
	public class LetThereBeLight : TempleBaseUpgrade
	{
		[HarmonyPatch(typeof(MutatorTower), "Mutate")]
		internal static class VisibilitySupport_MutatorTower
		{
			[HarmonyPostfix]
			private static void Postfix(MutatorTower __instance, Model model)
			{
				if (((BehaviorMutator)__instance).id.Contains("XRAY"))
				{
					Il2CppGenericIEnumerable.ForEach<AttackModel>(model.GetDescendants<AttackModel>(), (Action<AttackModel>)delegate(AttackModel attackModel)
					{
						attackModel.attackThroughWalls = true;
					});
					Il2CppGenericIEnumerable.ForEach<ProjectileModel>(model.GetDescendants<ProjectileModel>(), (Action<ProjectileModel>)delegate(ProjectileModel projectile)
					{
						projectile.ignoreBlockers = true;
					});
				}
			}
		}

		public override int Path => 1;

		public override int Tier => 2;

		public override int Cost => 1000;

		public override string Description => "Further increases The Chosen's range and allows it to attack through walls.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			RangeSupportModel behavior = TowerModelBehaviorExt.GetBehavior<RangeSupportModel>(towerModel);
			behavior.multiplier *= 2f;
			VisibilitySupportModel behavior2 = TowerModelBehaviorExt.GetBehavior<VisibilitySupportModel>(towerModel);
			behavior2.mutatorId += "XRAY";
		}
	}
	public class SolarFlares : TempleBaseUpgrade
	{
		public override int Path => 1;

		public override int Tier => 1;

		public override int Cost => 500;

		public override string Description => "Allows The Chosen to target Camo Bloons";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			VisibilitySupportModel val = new VisibilitySupportModel("VisibilitySupportModel_TempleBase", true, ((ModContent)this).Id, false, new Il2CppReferenceArray<TowerFilterModel>(0L), "", "", false, false);
			SupportModelExt.ApplyBuffIcon<TempleBaseBuffIcon>((SupportModel)(object)val);
			TowerModelBehaviorExt.AddBehavior<VisibilitySupportModel>(towerModel, val);
		}
	}
	public class SolIncarnate : TempleBaseUpgrade
	{
		[HarmonyPatch(typeof(RangeMutator), "Mutate")]
		internal static class RangeMutator_Mutate
		{
			[HarmonyPostfix]
			private static void Postfix(RangeMutator __instance, Model model)
			{
				TowerModel towerModel = default(TowerModel);
				if (!((BehaviorMutator)__instance).id.Contains("SolIncarnate") || !Il2CppSystemObjectExt.Is<TowerModel>((Il2CppObjectBase)(object)model, ref towerModel) || towerModel.isSubTower)
				{
					return;
				}
				PrefabReference display = AttackModelBehaviorExt.GetBehavior<DisplayModel>(TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunTemple)).display;
				AttackModel val = ModelExt.Duplicate<AttackModel>(TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunGod));
				DisplayModel behavior = AttackModelBehaviorExt.GetBehavior<DisplayModel>(val);
				if (((BehaviorMutator)__instance).id.Contains("Vengeful"))
				{
					DisplayModelExt.ApplyDisplay<VengefulSunHead>(behavior);
				}
				else
				{
					behavior.display = display;
				}
				WeaponModel obj = ((Il2CppArrayBase<WeaponModel>)(object)val.weapons)[0];
				obj.ejectZ /= 2f;
				AttackModelBehaviorExt.GetBehavior<RotateToTargetModel>(val).onlyRotateDuringThrow = false;
				ProjectileModel projectile = ((Il2CppArrayBase<WeaponModel>)(object)val.weapons)[0].projectile;
				projectile.radius *= 1.5f;
				projectile.scale *= 1.25f;
				WeaponModelBehaviorExt.RemoveBehavior<CheckTempleCanFireModel>(((Il2CppArrayBase<WeaponModel>)(object)val.weapons)[0]);
				foreach (TempleTowerMutatorGroupModel behavior2 in TowerModelBehaviorExt.GetBehaviors<TempleTowerMutatorGroupModel>(TempleBaseUpgrade.SunTemple))
				{
					behavior2.ApplyToAttack(val);
				}
				foreach (TempleTowerMutatorGroupModel item in from groupModel in TowerModelBehaviorExt.GetBehaviors<TempleTowerMutatorGroupModel>(TempleBaseUpgrade.SunGod)
					where groupModel.towerSet == towerModel.towerSet
					select groupModel)
				{
					item.ApplyToAttack(val);
				}
				if (((BehaviorMutator)__instance).id.Contains("Vengeful"))
				{
					PrefabReference val2 = CosmeticHelper.SwapDarkTempleAsset(projectile.display);
					PrefabReference display2 = (ProjectileModelBehaviorExt.GetBehavior<DisplayModel>(projectile).display = val2);
					projectile.display = display2;
					DamageModel damageModel = ProjectileModelExt.GetDamageModel(projectile);
					damageModel.damage *= 2f;
				}
				TowerModelBehaviorExt.AddBehavior<AttackModel>(towerModel, val);
			}
		}

		private const int Duration = 15;

		private const int Cooldown = 45;

		public override int Path => 1;

		public override int Tier => 5;

		public override int Cost => 70000;

		public override string Description => $"Ability: {"The Chosen"} becomes Sol Incarnate for {15}s. {45}s cooldown.";

		public override string Icon => "a04463dfa8e4c704c8b660dd6e5d64b4";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			AbilityModel ability = TowerModelExt.GetAbility(towerModel);
			((Model)ability).name = "AbilityModel_" + ((ModContent)this).Name;
			ability.description = ((NamedModContent)this).Description;
			ability.displayName = ((NamedModContent)this).DisplayName;
			ability.icon = ((ModUpgrade)this).IconReference;
			ability.Cooldown = 45f;
			ActivateRangeSupportZoneModel behavior = AbilityModelBehaviorExt.GetBehavior<ActivateRangeSupportZoneModel>(ability);
			behavior.mutatorId = ((ModContent)this).Id;
			behavior.lifespan = 15f;
		}
	}
	public class SunBeams : TempleBaseUpgrade
	{
		public override int Path => 1;

		public override int Tier => 3;

		public override int Cost => 2000;

		public override string Description => "The Chosen can damage all Bloon types.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			DamageTypeSupportModel val = new DamageTypeSupportModel("DamageTypeSupportModel_TempleBase", true, ((ModContent)this).Id, (BloonProperties)0, new Il2CppReferenceArray<TowerFilterModel>(0L), "", "");
			SupportModelExt.ApplyBuffIcon<TempleBaseBuffIcon>((SupportModel)(object)val);
			TowerModelBehaviorExt.AddBehavior<DamageTypeSupportModel>(towerModel, val);
		}
	}
}
namespace TempleBase.Upgrades.Bot
{
	public class LightOnCash : TempleBaseUpgrade
	{
		public override int Path => 2;

		public override int Tier => 2;

		public override int Cost => 750;

		public override string Description => "Reduces the cost of The Chosen's upgrades by 5%.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			TempleBaseBuffIcon instance = ModContent.GetInstance<TempleBaseBuffIcon>();
			DiscountZoneModel val = new DiscountZoneModel("", 0.05f, 1, ((ModContent)this).Id, false, 5, 0, ((ModBuffIcon)instance).Icon, ((ModContent)instance).Id, "", "", false, false, false);
			TowerModelBehaviorExt.AddBehavior<DiscountZoneModel>(towerModel, val);
		}
	}
	public class SpeedOfLight : TempleBaseUpgrade
	{
		public override int Path => 2;

		public override int Tier => 1;

		public override int Cost => 500;

		public override string Description => "Increases The Chosen's attack speed.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			RateSupportModel val = new RateSupportModel("RateSupportModel_TempleBase", 0.85f, true, ((ModContent)this).Id, false, 0, new Il2CppReferenceArray<TowerFilterModel>(0L), "", "", false, (DisplayModel)null);
			SupportModelExt.ApplyBuffIcon<TempleBaseBuffIcon>((SupportModel)(object)val);
			TowerModelBehaviorExt.AddBehavior<RateSupportModel>(towerModel, val);
		}
	}
	public class TempleBlessings : TempleBaseUpgrade
	{
		public override int Path => 2;

		public override int Tier => 4;

		public override int Cost => 50000;

		public override string Description => "Activate the rest of the Sun Temple sacrifice attacks for the The Chosen's tower set.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
		}
	}
	public class TempleBoons : TempleBaseUpgrade
	{
		public override int Path => 2;

		public override int Tier => 3;

		public override int Cost => 20000;

		public override string Description => "Activate some of the Sun Temple sacrifice attacks for the The Chosen's tower set.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
		}
	}
	public class TempleGodsends : TempleBaseUpgrade
	{
		public override int Path => 2;

		public override int Tier => 5;

		public override int Cost => 100000;

		public override string Description => "Activate the full True Sun God sacrifice attacks for The Chosen's tower set.";

		public override void ApplyUpgrade(TowerModel towerModel)
		{
		}
	}
}
namespace TempleBase.SacrificeAttacks
{
	public abstract class TempleBaseSacAttack : ModContent
	{
		public abstract TowerSet TowerSet { get; }

		public abstract int Tier { get; }

		protected List<TowerBehaviorModel> Behaviors { get; private set; } = null;

		protected static TowerModel SunTemple => Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0);

		protected static TowerModel SunGod => Game.instance.model.GetTower(TowerType.SuperMonkey, 5, 0, 0);

		public sealed override void Register()
		{
			Behaviors = GetBehaviors().ToList();
			for (int i = 0; i < Behaviors.Count; i++)
			{
				((Model)Behaviors[i]).name = ((ModContent)this).Id + "-" + i;
			}
		}

		public void Remove(Tower tower)
		{
			TowerModel val = ((Il2CppObjectBase)((Mutable)tower).rootModel).Cast<TowerModel>();
			bool flag = false;
			for (Model val2 = ((IEnumerable<Model>)((EntityModel)val).behaviors).FirstOrDefault((Func<Model, bool>)((Model model) => model.name.Contains(((ModContent)this).Id))); val2 != null; val2 = ((IEnumerable<Model>)((EntityModel)val).behaviors).FirstOrDefault((Func<Model, bool>)((Model model) => model.name.Contains(((ModContent)this).Id))))
			{
				if (!flag)
				{
					val = ModelExt.Duplicate<TowerModel>(val);
					flag = true;
				}
				TowerModelBehaviorExt.RemoveBehavior<Model>(val, val2);
			}
			if (flag)
			{
				val.UpdateTargetProviders();
				((Mutable)tower).UpdateRootModel((Model)(object)val);
				OnUpdate(tower);
			}
		}

		public void Apply(Tower tower)
		{
			TowerModel val = ((Il2CppObjectBase)((Mutable)tower).rootModel).Cast<TowerModel>();
			bool flag = false;
			foreach (TowerBehaviorModel behavior in Behaviors)
			{
				Model val2 = ((IEnumerable<Model>)((EntityModel)val).behaviors).FirstOrDefault((Func<Model, bool>)((Model model) => model.name.Contains(((Model)behavior).name)));
				if (val2 == null)
				{
					if (!flag)
					{
						val = ModelExt.Duplicate<TowerModel>(val);
						flag = true;
					}
					val2 = (Model)(object)ModelExt.Duplicate<TowerBehaviorModel>(behavior);
					TowerModelBehaviorExt.AddBehavior<Model>(val, val2);
				}
			}
			if (flag)
			{
				val.UpdateTargetProviders();
				((Mutable)tower).UpdateRootModel((Model)(object)val);
				OnUpdate(tower);
			}
		}

		protected static void OnUpdate(Tower tower)
		{
			Simulation simulation = InGame.instance.bridge.Simulation;
			Il2CppGenericIEnumerable.ForEach<Tower>(simulation.factory.GetUncast<Tower>(), (Action<Tower>)delegate(Tower t)
			{
				//IL_0002: 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)
				if (((CommonBehaviorProxy<ITowerBehavior>)(object)t).ParentId == ((RootObject)tower).Id)
				{
					simulation.DestroyTower(t, t.owner);
				}
			});
		}

		protected TempleTowerMutatorGroupModel GetSacrificeEffect(TowerModel towerModel, int cost)
		{
			return TowerModelBehaviorExt.GetBehaviors<TempleTowerMutatorGroupModel>(towerModel).First((TempleTowerMutatorGroupModel model) => model.towerSet == TowerSet && model.cost == cost);
		}

		protected abstract IEnumerable<TowerBehaviorModel> GetBehaviors();
	}
}
namespace TempleBase.SacrificeAttacks.Support
{
	public class Support3 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)8;

		public override int Tier => 3;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 20001)).GetDescendant<RateSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<PierceSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<RangeSupportModel>()).FixedSacSupport();
			if (ModSettingBool.op_Implicit(TempleBaseMod.NerfedIncome))
			{
				yield return (TowerBehaviorModel)(object)ModelExt.Duplicate<PerRoundCashBonusTowerModel>(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant<PerRoundCashBonusTowerModel>());
			}
			else
			{
				yield return (TowerBehaviorModel)(object)ModelExt.Duplicate<PerRoundCashBonusTowerModel>(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 15001)).GetDescendant<PerRoundCashBonusTowerModel>());
			}
		}
	}
	public class Support4 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)8;

		public override int Tier => 4;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<PierceSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<RangeSupportModel>()).FixedSacSupport();
			if (ModSettingBool.op_Implicit(TempleBaseMod.NerfedIncome))
			{
				yield return (TowerBehaviorModel)(object)ModelExt.Duplicate<PerRoundCashBonusTowerModel>(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 15001)).GetDescendant<PerRoundCashBonusTowerModel>());
			}
			else
			{
				yield return (TowerBehaviorModel)(object)ModelExt.Duplicate<PerRoundCashBonusTowerModel>(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<PerRoundCashBonusTowerModel>());
			}
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<RateSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<DamageSupportModel>()).FixedSacSupport();
		}
	}
	public class Support5 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)8;

		public override int Tier => 5;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<PierceSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<RangeSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)ModelExt.Duplicate<PerRoundCashBonusTowerModel>(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<PerRoundCashBonusTowerModel>());
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<RateSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<DamageSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 30001)).GetDescendant<PierceSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 30001)).GetDescendant<RangeSupportModel>()).FixedSacSupport();
			if (!ModSettingBool.op_Implicit(TempleBaseMod.NerfedIncome))
			{
				yield return (TowerBehaviorModel)(object)ModelExt.Duplicate<PerRoundCashBonusTowerModel>(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant<PerRoundCashBonusTowerModel>());
			}
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant<RateSupportModel>()).FixedSacSupport();
			yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant<DamageSupportModel>()).FixedSacSupport();
		}
	}
	public class Support6 : Support5
	{
		public override TowerSet TowerSet => (TowerSet)8;

		public override int Tier => 6;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			return from model in base.GetBehaviors()
				select model.Paragon<TowerBehaviorModel>();
		}
	}
}
namespace TempleBase.SacrificeAttacks.Primary
{
	public class Primary3 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Tier => 3;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Primary4 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Tier => 4;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Primary5 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Tier => 5;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Primary6 : Primary5
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Tier => 6;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			return from model in base.GetBehaviors()
				select model.Paragon<TowerBehaviorModel>();
		}
	}
}
namespace TempleBase.SacrificeAttacks.Military
{
	public class Military3 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Tier => 3;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Military4 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Tier => 4;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Military5 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Tier => 5;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Military6 : Military5
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Tier => 6;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			return from model in base.GetBehaviors()
				select model.Paragon<TowerBehaviorModel>();
		}
	}
}
namespace TempleBase.SacrificeAttacks.Magic
{
	public class Magic3 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Tier => 3;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 20001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Magic4 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Tier => 4;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 35001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Magic5 : TempleBaseSacAttack
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Tier => 5;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 35001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 35001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant<AttackModel>().FixedSacAttack();
			yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant<AttackModel>().FixedSacAttack();
		}
	}
	public class Magic6 : Magic5
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Tier => 6;

		protected override IEnumerable<TowerBehaviorModel> GetBehaviors()
		{
			return from model in base.GetBehaviors()
				select model.Paragon<TowerBehaviorModel>();
		}
	}
}
namespace TempleBase.Displays
{
	public class SunHead : ModDisplay
	{
		public override PrefabReference BaseDisplayReference => AttackModelBehaviorExt.GetBehavior<DisplayModel>(TowerModelExt.GetAttackModel(Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0))).display;

		public override float Scale => 0.85f;
	}
	public class VengefulSunHead : ModDisplay
	{
		public override PrefabReference BaseDisplayReference => AttackModelBehaviorExt.GetBehavior<DisplayModel>(TowerModelExt.GetAttackModel(Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0))).display;

		public override void ModifyDisplayNode(UnityDisplayNode node)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			((ModDisplay)this).SetMeshTexture(node, ((ModContent)this).Name);
			((ModDisplay)this).SetMeshOutlineColor(node, new Color(90f, 90f, 95f));
		}
	}
}