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));
}
}
}