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 CardMonkey;
using CardMonkey.Displays.Projectiles;
using CardMonkey.Upgrades.MiddlePath;
using Il2Cpp;
using Il2CppAssets.Scripts.Models;
using Il2CppAssets.Scripts.Models.Effects;
using Il2CppAssets.Scripts.Models.GenericBehaviors;
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.Behaviors.Emissions;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Emissions.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Filters;
using Il2CppAssets.Scripts.Models.Towers.Projectiles;
using Il2CppAssets.Scripts.Models.Towers.Projectiles.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Weapons;
using Il2CppAssets.Scripts.Models.Towers.Weapons.Behaviors;
using Il2CppAssets.Scripts.Simulation.SMath;
using Il2CppAssets.Scripts.Unity;
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 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(CardMonkeyMod), "Card Monkey", "1.2.19", "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("CardMonkey")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+5be57b3cf4fe933c09a3b144f040af2430ddffcf")]
[assembly: AssemblyProduct("CardMonkey")]
[assembly: AssemblyTitle("CardMonkey")]
[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 CardMonkey
{
public class CardMonkey : ModTower
{
public override TowerSet TowerSet => (TowerSet)1;
public override string BaseTower => TowerType.DartMonkey;
public override int Cost => 400;
public override string Description => "Throws playing cards at Bloons";
public override ParagonMode ParagonMode => (ParagonMode)2;
public override ModSettingHotkey Hotkey => CardMonkeyMod.CardMonkeyHotkey;
public override bool IncludeInRogueLegends => true;
public override void ModifyBaseTowerModel(TowerModel towerModel)
{
towerModel.range += 10f;
AttackModel attackModel = TowerModelExt.GetAttackModel(towerModel);
attackModel.range += 10f;
ProjectileModel projectile = ((Il2CppArrayBase<WeaponModel>)(object)attackModel.weapons)[0].projectile;
ProjectileModelExt.ApplyDisplay<RedCardDisplay>(projectile);
projectile.pierce += 2f;
}
public override int GetTowerIndex(List<TowerDetailsModel> towerSet)
{
return towerSet.First((TowerDetailsModel model) => model.towerId == TowerType.BoomerangMonkey).towerIndex + 1;
}
public override bool IsValidCrosspath(params int[] tiers)
{
return ModHelper.HasMod("UltimateCrosspathing") || ((ModTower)this).IsValidCrosspath(tiers);
}
}
public class CardMonkeyMod : BloonsTD6Mod
{
public static readonly ModSettingHotkey CardMonkeyHotkey = new ModSettingHotkey((KeyCode)119, (HotkeyModifier)1)
{
icon = ModContent.GetTextureGUID<CardMonkeyMod>("CardMonkey-Icon")
};
}
public static class ModHelperData
{
public const string WorksOnVersion = "54.0";
public const string Version = "1.2.19";
public const string Name = "Card Monkey";
public const string Description = "Adds in a new custom tower themed around playing cards.";
public const string RepoOwner = "doombubbles";
public const string PrevRepoName = "card-monkey";
public const string RepoName = "CardMonkey";
public const string Icon = "CardMonkey-Icon.png";
}
}
namespace CardMonkey.Upgrades
{
public class GodKingOfSpades : ModParagonUpgrade<CardMonkey>
{
public override int Cost => 400000;
public override string Description => "Sometimes the hand of fate must be forced...";
public override string DisplayName => "God-King of Spades";
public override void ApplyUpgrade(TowerModel towerModel)
{
}
}
}
namespace CardMonkey.Upgrades.TopPath
{
public class FourOfAKind : ModUpgrade<CardMonkey>
{
public override int Path => 0;
public override int Tier => 3;
public override int Cost => 1000;
public override string DisplayName => "Four of a Kind";
public override string Description => "Throws four cards at a time";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
TowerModelExt.GetWeapon(tower).emission = (EmissionModel)new ArcEmissionModel("ArcEmissionModel_", 4, 0f, 20f, (Il2CppReferenceArray<EmissionBehaviorModel>)null, false, false);
}
}
public class Pair : ModUpgrade<CardMonkey>
{
public override int Path => 0;
public override int Tier => 1;
public override int Cost => 500;
public override string Description => "Throws two cards at a time";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
TowerModelExt.GetWeapon(tower).emission = (EmissionModel)new ArcEmissionModel("ArcEmissionModel_", 2, 0f, 10f, (Il2CppReferenceArray<EmissionBehaviorModel>)null, false, false);
}
}
public class RoyalFlush : ModUpgrade<CardMonkey>
{
public override int Path => 0;
public override int Tier => 5;
public override int Cost => 20000;
public override int Priority => -2;
public override string Description => "Cards do 10, 11, 12, 13 and 14 damage.";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
tower.range += 10f;
AttackModel attackModel = TowerModelExt.GetAttackModel(tower);
attackModel.range += 10f;
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(tower))
{
DamageModel damageModel = ProjectileModelExt.GetDamageModel(weapon.projectile);
damageModel.damage += 10f;
}
}
}
public class StraightFlush : ModUpgrade<CardMonkey>
{
public override int Path => 0;
public override int Tier => 4;
public override int Cost => 4000;
public override int Priority => -1;
public override string Description => "Throws 5 cards at a time. Cards do 1, 2, 3, 4 and 5 damage.";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Expected O, but got Unknown
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Expected O, but got Unknown
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(tower))
{
weapon.emission = (EmissionModel)new EmissionWithOffsetsModel("EmissionWithOffsetsModel_", Il2CppReferenceArray<ThrowMarkerOffsetModel>.op_Implicit((ThrowMarkerOffsetModel[])(object)new ThrowMarkerOffsetModel[1]
{
new ThrowMarkerOffsetModel("ThrowMarkerOffsetModel_", -4f, 0f, 0f, 0f)
}), 1, false, (Il2CppReferenceArray<EmissionBehaviorModel>)null, 0f, false);
for (int i = 1; i <= 4; i++)
{
WeaponModel val = ModelExt.Duplicate<WeaponModel>(weapon);
DamageModel damageModel = ProjectileModelExt.GetDamageModel(val.projectile);
damageModel.damage += (float)i;
ThrowMarkerOffsetModel obj = ((Il2CppArrayBase<ThrowMarkerOffsetModel>)(object)((Il2CppObjectBase)val.emission).Cast<EmissionWithOffsetsModel>().throwMarkerOffsetModels)[0];
obj.ejectX += (float)(i * 2);
AttackModelExt.AddWeapon(TowerModelExt.GetAttackModel(tower), val);
}
}
}
}
public class ThreeOfAKind : ModUpgrade<CardMonkey>
{
public override int Path => 0;
public override int Tier => 2;
public override int Cost => 700;
public override string DisplayName => "Three of a Kind";
public override string Description => "Throws three cards at a time";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
TowerModelExt.GetWeapon(tower).emission = (EmissionModel)new ArcEmissionModel("ArcEmissionModel_", 3, 0f, 15f, (Il2CppReferenceArray<EmissionBehaviorModel>)null, false, false);
}
}
}
namespace CardMonkey.Upgrades.MiddlePath
{
public class AceInTheHole : ModUpgrade<CardMonkey>
{
public override int Path => 1;
public override int Tier => 4;
public override int Cost => 4440;
public override string DisplayName => "Ace in the Hole";
public override string Description => "Ability: Throws a super powerful Ace card that seeks Bloons along the track.";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Expected O, but got Unknown
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Expected O, but got Unknown
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0146: Expected O, but got Unknown
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Expected O, but got Unknown
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
//IL_01a5: Expected O, but got Unknown
ActivateAttackModel val = new ActivateAttackModel("ActivateAttackModel_AceInTheHole", 0f, true, new Il2CppReferenceArray<AttackModel>(1L), true, false, false, false, false, false);
AttackModel val2 = (((Il2CppArrayBase<AttackModel>)(object)val.attacks)[0] = ModelExt.Duplicate<AttackModel>(TowerModelExt.GetAttackModel(Game.instance.model.GetTower(TowerType.BoomerangMonkey, 4, 0, 0))));
AttackModel val4 = val2;
((Model)val).AddChildDependant<AttackModel>(val4);
val4.behaviors = Il2CppReferenceArrayExt.RemoveItemOfType<Model, TargetCloseModel>(Il2CppReferenceArrayExt.RemoveItemOfType<Model, TargetLastModel>(Il2CppReferenceArrayExt.RemoveItemOfType<Model, TargetStrongModel>(Il2CppReferenceArrayExt.RemoveItemOfType<Model, RotateToTargetModel>(val4.behaviors))));
TargetFirstModel behavior = AttackModelBehaviorExt.GetBehavior<TargetFirstModel>(val4);
behavior.isSelectable = false;
val4.targetProvider = (TargetSupplierModel)(object)behavior;
val4.range = 2000f;
val4.attackThroughWalls = true;
WeaponModel val5 = ((Il2CppArrayBase<WeaponModel>)(object)val4.weapons)[0];
EmissionModelBehaviorExt.AddBehavior<EmissionRotationOffBloonDirectionModel>(val5.emission, new EmissionRotationOffBloonDirectionModel("", false, false));
ProjectileModel projectile = val5.projectile;
ProjectileModelExt.ApplyDisplay<AceInTheHoleAbilityDisplay>(projectile);
projectile.pierce = 1000f;
ProjectileModelBehaviorExt.RemoveBehavior<RotateModel>(projectile);
ProjectileModelBehaviorExt.GetBehavior<RetargetOnContactModel>(projectile).distance = 2000f;
ProjectileModelExt.GetDamageModel(projectile).damage = 20f;
ProjectileModelExt.GetDamageModel(projectile).immuneBloonProperties = (BloonProperties)0;
ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(projectile, new DamageModifierForTagModel("DamageModifierForTagModel_Ceramic", "Ceramic", 1f, 30f, false, false, false));
ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(projectile, new DamageModifierForTagModel("DamageModifierForTagModel_Fortified", "Fortified", 1f, 30f, false, false, false));
ProjectileModelBehaviorExt.GetBehavior<TravelStraitModel>(projectile).Speed = 500f;
ProjectileModelBehaviorExt.GetBehavior<TravelStraitModel>(projectile).Lifespan = 5f;
projectile.hasDamageModifiers = true;
AbilityHelper val6 = new AbilityHelper("AceInTheHole");
val6.DisplayName = "Ace in the Hole";
val6.Description = "Throws a super powerful Ace card that seeks Bloons along the track.";
val6.Animation = 1;
val6.IconReference = ((ModContent)this).GetSpriteReference(((ModUpgrade)this).Icon);
val6.Cooldown = 44f;
val6.Behaviors = (Model[])(object)new Model[1] { (Model)val };
TowerModelBehaviorExt.AddBehavior(tower, (ModelHelper)(object)val6);
}
}
public class AceOfSpades : ModUpgrade<CardMonkey>
{
public override int Path => 1;
public override int Tier => 5;
public override int Cost => 44440;
public override int Priority => -3;
public override string DisplayName => "Ace of Spades";
public override string Description => "Aces are even more deadly, dealing extreme damage to MOAB class bloons.";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Expected O, but got Unknown
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
//IL_01bf: Expected O, but got Unknown
tower.range += 10f;
AttackModel attackModel = TowerModelExt.GetAttackModel(tower);
attackModel.range += 10f;
foreach (ProjectileModel item in from weaponModel in TowerModelExt.GetWeapons(tower)
select weaponModel.projectile)
{
DamageModel damageModel = ProjectileModelExt.GetDamageModel(item);
damageModel.damage += 3f;
foreach (DamageModifierForTagModel behavior in ProjectileModelBehaviorExt.GetBehaviors<DamageModifierForTagModel>(item))
{
behavior.damageAddative += 42f;
}
ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(item, new DamageModifierForTagModel("DamageModifierForTagModel_Moabs", "Moabs", 1f, 45f, false, false, false));
ProjectileModelExt.ApplyDisplay<AceOfSpadesCardDisplay>(item);
}
AbilityModel ability = TowerModelExt.GetAbility(tower);
ability.resetCooldownOnTierUpgrade = true;
ability.icon = ((ModContent)this).GetSpriteReference(((ModUpgrade)this).Icon);
ProjectileModel descendant = ((Model)ability).GetDescendant<ProjectileModel>();
ProjectileModelExt.ApplyDisplay<AceOfSpadesAbilityDisplay>(descendant);
ProjectileModelExt.GetDamageModel(descendant).damage = 1000f;
descendant.pierce = 10000f;
foreach (DamageModifierForTagModel behavior2 in ProjectileModelBehaviorExt.GetBehaviors<DamageModifierForTagModel>(descendant))
{
behavior2.damageAddative = 2000f;
}
ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(descendant, new DamageModifierForTagModel("DamageModifierForTagModel_Moabs", "Moabs", 1f, 2000f, false, false, false));
descendant.hasDamageModifiers = true;
}
}
public class AcesWild : ModUpgrade<CardMonkey>
{
public override int Path => 1;
public override int Tier => 3;
public override int Cost => 1500;
public override string DisplayName => "Aces Wild";
public override string Description => "Powerful Ace cards do more damage, further increased against Ceramic and Fortified Bloons.";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Expected O, but got Unknown
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Expected O, but got Unknown
foreach (ProjectileModel item in from weaponModel in TowerModelExt.GetWeapons(tower)
select weaponModel.projectile)
{
DamageModel damageModel = ProjectileModelExt.GetDamageModel(item);
float damage = damageModel.damage;
damageModel.damage = damage + 1f;
ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(item, new DamageModifierForTagModel("", "Ceramic", 1f, 3f, false, false, false));
ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(item, new DamageModifierForTagModel("", "Fortified", 1f, 3f, false, false, false));
ProjectileModelExt.ApplyDisplay<WildAceCardDisplay>(item);
item.hasDamageModifiers = true;
}
}
}
public class CutTheDeck : ModUpgrade<CardMonkey>
{
public override int Path => 1;
public override int Tier => 1;
public override int Cost => 400;
public override string DisplayName => "Cut the Deck";
public override string Description => "Cards have increased pierce";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(tower))
{
if (tower.tier == 5)
{
ProjectileModel projectile = weapon.projectile;
projectile.pierce += 30f;
}
else
{
ProjectileModel projectile2 = weapon.projectile;
projectile2.pierce += 3f;
}
}
}
}
public class WildCards : ModUpgrade<CardMonkey>
{
public override int Path => 1;
public override int Tier => 2;
public override int Cost => 1000;
public override string Description => "Cards can damage all Bloon types";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(tower))
{
ProjectileModelExt.GetDamageModel(weapon.projectile).immuneBloonProperties = (BloonProperties)0;
ProjectileModelExt.ApplyDisplay<RedWildCardDisplay>(weapon.projectile);
}
}
}
}
namespace CardMonkey.Upgrades.BottomPath
{
public class CardCounting : ModUpgrade<CardMonkey>
{
public override int Path => 2;
public override int Tier => 1;
public override int Cost => 300;
public override string Description => "Throws cards faster";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(tower))
{
weapon.Rate *= 0.666666f;
}
}
}
public class MarkedCards : ModUpgrade<CardMonkey>
{
public override int Path => 2;
public override int Tier => 4;
public override int Cost => 2500;
public override string Description => "Attacks extra fast permanently and with bigger range";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
tower.range += 15f;
AttackModel attackModel = TowerModelExt.GetAttackModel(tower);
attackModel.range += 15f;
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(tower))
{
weapon.Rate *= 0.5f;
}
}
}
public class SleightOfHand : ModUpgrade<CardMonkey>
{
public override int Path => 2;
public override int Tier => 2;
public override int Cost => 350;
public override string DisplayName => "Sleight of Hand";
public override string Description => "Can attack Camo Bloons";
public override string Portrait => "CardMonkey-Portrait";
public override int Priority => -1;
public override void ApplyUpgrade(TowerModel tower)
{
Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)tower).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel model)
{
model.isActive = false;
});
}
}
public class StackedDeck : ModUpgrade<CardMonkey>
{
public override int Path => 2;
public override int Tier => 3;
public override int Cost => 750;
public override string Description => "Attacks extra fast at the start of the round";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
if (tower.tier == 3)
{
StartOfRoundRateBuffModel val = ModelExt.Duplicate<StartOfRoundRateBuffModel>(TowerModelBehaviorExt.GetBehavior<StartOfRoundRateBuffModel>(Game.instance.model.GetTower(TowerType.SpikeFactory, 0, 0, 2)));
val.modifier = 0.5f;
val.duration = 10f;
TowerModelBehaviorExt.AddBehavior<StartOfRoundRateBuffModel>(tower, val);
}
}
}
public class TwistOfFate : ModUpgrade<CardMonkey>
{
public override int Path => 2;
public override int Tier => 5;
public override int Cost => 50000;
public override string DisplayName => "Twist of Fate";
public override string Description => "Cards can explode, stun Bloons, and make Bloons give extra money.";
public override string Portrait => "CardMonkey-Portrait";
public override void ApplyUpgrade(TowerModel tower)
{
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
//IL_023a: Expected O, but got Unknown
//IL_0270: Unknown result type (might be due to invalid IL or missing references)
//IL_0277: Expected O, but got Unknown
//IL_028f: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: Expected O, but got Unknown
//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
//IL_02a9: Expected O, but got Unknown
tower.range += 10f;
AttackModel attackModel = TowerModelExt.GetAttackModel(tower);
attackModel.range += 10f;
WeaponModel weapon = TowerModelExt.GetWeapon(tower);
WeaponModel val = ModelExt.Duplicate<WeaponModel>(weapon);
((Model)val).name = "WeaponModel_GoldCard";
TowerModel tower2 = Game.instance.model.GetTower(TowerType.Alchemist, 0, 0, 4);
IncreaseBloonWorthModel val2 = ModelExt.Duplicate<IncreaseBloonWorthModel>(((Model)TowerModelExt.GetAttackModels(tower2)[1]).GetDescendant<IncreaseBloonWorthModel>());
FilterOutTagModel filter = ModelExt.Duplicate<FilterOutTagModel>(((Model)tower2).GetDescendant<FilterOutTagModel>());
val2.filter = (FilterModel)(object)filter;
val.projectile.collisionPasses = Il2CppStructArray<int>.op_Implicit(new int[2] { -1, 0 });
ProjectileModelBehaviorExt.AddBehavior<IncreaseBloonWorthModel>(val.projectile, val2);
if (((Il2CppArrayBase<string>)(object)tower.appliedUpgrades).Contains(ModContent.UpgradeID<WildCards>()))
{
ProjectileModelExt.ApplyDisplay<GoldWildCardDisplay>(val.projectile);
}
else
{
ProjectileModelExt.ApplyDisplay<GoldCardDisplay>(val.projectile);
}
AttackModelExt.AddWeapon(TowerModelExt.GetAttackModel(tower), val);
WeaponModel val3 = ModelExt.Duplicate<WeaponModel>(weapon);
((Model)val3).name = "WeaponModel_Blue_card";
TowerModel tower3 = Game.instance.model.GetTower(TowerType.BombShooter, 4, 0, 0);
SlowModel val4 = ModelExt.Duplicate<SlowModel>(((Model)tower3).GetDescendant<SlowModel>());
SlowModifierForTagModel val5 = ModelExt.Duplicate<SlowModifierForTagModel>(((Model)tower3).GetDescendant<SlowModifierForTagModel>());
val3.projectile.collisionPasses = Il2CppStructArray<int>.op_Implicit(new int[2] { -1, 0 });
ProjectileModelBehaviorExt.AddBehavior<SlowModel>(val3.projectile, val4);
ProjectileModelBehaviorExt.AddBehavior<SlowModifierForTagModel>(val3.projectile, val5);
if (((Il2CppArrayBase<string>)(object)tower.appliedUpgrades).Contains(ModContent.UpgradeID<WildCards>()))
{
ProjectileModelExt.ApplyDisplay<BlueWildCardDisplay>(val3.projectile);
}
else
{
ProjectileModelExt.ApplyDisplay<BlueCardDisplay>(val3.projectile);
}
val3.Rate *= 1.2f;
AttackModelExt.AddWeapon(TowerModelExt.GetAttackModel(tower), val3);
ProjectileModel val6 = ModelExt.Duplicate<ProjectileModel>(TowerModelExt.GetWeapon(Game.instance.model.GetTower(TowerType.BombShooter, 3, 0, 0)).projectile);
CreateProjectileOnContactModel behavior = ProjectileModelBehaviorExt.GetBehavior<CreateProjectileOnContactModel>(val6);
CreateSoundOnProjectileCollisionModel behavior2 = ProjectileModelBehaviorExt.GetBehavior<CreateSoundOnProjectileCollisionModel>(val6);
CreateEffectOnContactModel behavior3 = ProjectileModelBehaviorExt.GetBehavior<CreateEffectOnContactModel>(val6);
CreateProjectileOnExhaustFractionModel val7 = new CreateProjectileOnExhaustFractionModel("CreateProjectileOnExhaustFractionModel_", behavior.projectile, behavior.emission, 1f, 1f, true, false, false);
ProjectileModelBehaviorExt.AddBehavior<CreateProjectileOnExhaustFractionModel>(weapon.projectile, val7);
CreateSoundOnProjectileExhaustModel val8 = new CreateSoundOnProjectileExhaustModel("CreateSoundOnProjectileExhaustModel_", behavior2.sound1, behavior2.sound2, behavior2.sound3, behavior2.sound4, behavior2.sound5);
ProjectileModelBehaviorExt.AddBehavior<CreateSoundOnProjectileExhaustModel>(weapon.projectile, val8);
CreateEffectOnExhaustedModel val9 = new CreateEffectOnExhaustedModel("CreateEffectOnExhaustedModel_", new PrefabReference(""), 0f, (Fullscreen)0, false, behavior3.effectModel);
ProjectileModelBehaviorExt.AddBehavior<CreateEffectOnExhaustedModel>(weapon.projectile, val9);
weapon.Rate *= 0.8f;
}
}
}
namespace CardMonkey.Displays
{
public class CardMonkeyBaseDisplay : ModTowerDisplay<CardMonkey>
{
public override string BaseDisplay => ((ModDisplay)this).GetDisplay(TowerType.BoomerangMonkey, 0, 0, 0);
public override bool UseForTower(params int[] tiers)
{
return tiers.Sum() == 0;
}
public override void ModifyDisplayNode(UnityDisplayNode node)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
((ModDisplay)this).SetMeshOutlineColor(node, new Color(0.28627452f, 35f / 51f, 0.20392157f));
RendererExt.AdjustHSV(UnityDisplayNodeExt.GetRenderer(node, "FlatSkin", true), 56f, 0.3f, 0.9f, (Color?)new Color(1f, 0.95686275f, 0f), 0.4f);
UnityDisplayNodeExt.RemoveBone(node, "SuperMonkeyRig:Dart", false);
}
}
public class CardMonkeyMultiDisplay : ModTowerDisplay<CardMonkey>
{
private readonly int[] t = Array.Empty<int>();
public override string Name => "CardMonkeyMultiDisplay-" + ArrayExt.Printed(t);
public override string BaseDisplay => ((ModDisplay)this).GetDisplay(TowerType.BoomerangMonkey, t[0], t[1], t[2]);
public CardMonkeyMultiDisplay()
{
}
public CardMonkeyMultiDisplay(int[] tiers)
{
t = tiers;
}
public override IEnumerable<ModContent> Load()
{
for (int i = 0; i <= 2; i++)
{
for (int j = 0; j <= 2; j++)
{
for (int k = 0; k <= 2; k++)
{
int[] tiers = new int[3] { i, j, k };
if (ArrayExt.IsValid(tiers))
{
yield return (ModContent)(object)new CardMonkeyMultiDisplay(tiers);
}
}
}
}
}
public override bool UseForTower(params int[] tiers)
{
if (t.Sum() == 0)
{
return tiers.Max() < 5;
}
return false;
}
public override void ModifyDisplayNode(UnityDisplayNode node)
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
RendererExt.AdjustHSV(UnityDisplayNodeExt.GetRenderer(node, "FlatSkin", true), 56f, 0.3f, 0.9f, (Color?)new Color(1f, 0.95686275f, 0f), 0.4f);
((ModDisplay)this).SetMeshOutlineColor(node, new Color(0.28627452f, 35f / 51f, 0.20392157f));
UnityDisplayNodeExt.RemoveBone(node, "SuperMonkeyRig:Dart", false);
}
}
public class CardMonkeyParagonDisplay : ModTowerDisplay<CardMonkey>
{
public override float Scale => 0.75f + (float)((ModTowerDisplay)this).ParagonDisplayIndex * 0.025f;
public override string BaseDisplay => AttackModelBehaviorExt.GetBehavior<DisplayModel>(TowerModelExt.GetAttackModel(Game.instance.model.GetTower(TowerType.SuperMonkey, 5, 0, 0))).display.AssetGUID;
public override int ParagonDisplayIndex { get; }
public override string Name => "CardMonkeyParagonDisplay" + ((ModTowerDisplay)this).ParagonDisplayIndex;
public CardMonkeyParagonDisplay()
{
}
public CardMonkeyParagonDisplay(int i)
{
ParagonDisplayIndex = i;
}
public override bool UseForTower(params int[] tiers)
{
return ((ModTowerDisplay)this).IsParagon(tiers);
}
public override IEnumerable<ModContent> Load()
{
for (int i = 0; i < 5; i++)
{
yield return (ModContent)(object)new CardMonkeyParagonDisplay(i);
}
}
public override void ModifyDisplayNode(UnityDisplayNode node)
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
((ModDisplay)this).SetMeshTexture(node, "CardMonkeyParagonDisplay");
((ModDisplay)this).SetMeshOutlineColor(node, new Color(16f / 85f, 0f, 0.4745098f));
}
}
}
namespace CardMonkey.Displays.Tier5
{
public class AceOfSpadesDisplay : ModTowerDisplay<CardMonkey>
{
public override string BaseDisplay => ((ModDisplay)this).GetDisplay(TowerType.BoomerangMonkey, 5, 0, 0);
public override bool UseForTower(params int[] tiers)
{
return tiers[1] == 5;
}
public override void ModifyDisplayNode(UnityDisplayNode node)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
UnityDisplayNodeExt.RemoveBone(node, "SuperMonkeyRig:Dart", false);
((ModDisplay)this).SetMeshTexture(node, "AceOfSpadesCape", 1);
((ModDisplay)this).SetMeshOutlineColor(node, new Color(0f, 0f, 0f), 1);
((ModDisplay)this).SetMeshTexture(node, "AceOfSpadesDisplay", 2);
((ModDisplay)this).SetMeshOutlineColor(node, new Color(0f, 0f, 0f), 2);
}
}
public class RoyalFlushDisplay : ModTowerDisplay<CardMonkey>
{
public override string BaseDisplay => ((ModDisplay)this).GetDisplay(TowerType.Alchemist, 0, 0, 5);
public override bool UseForTower(params int[] tiers)
{
return tiers[0] == 5;
}
public override void ModifyDisplayNode(UnityDisplayNode node)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
UnityDisplayNodeExt.RemoveBone(node, "AlchemistRig:Propjectile_R", false);
((ModDisplay)this).SetMeshTexture(node, "RoyalFlushDisplay", 0);
((ModDisplay)this).SetMeshOutlineColor(node, new Color(0.28627452f, 35f / 51f, 0.20392157f), 0);
((ModDisplay)this).SetMeshTexture(node, "RoyalFlushDisplay", 1);
((ModDisplay)this).SetMeshOutlineColor(node, new Color(0.28627452f, 35f / 51f, 0.20392157f), 1);
}
}
public class TFDisplay : ModTowerDisplay<CardMonkey>
{
public override string BaseDisplay => ((ModDisplay)this).GetDisplay(TowerType.BoomerangMonkey, 0, 0, 4);
public override float Scale => 1.15f;
public override bool UseForTower(params int[] tiers)
{
return tiers[2] == 5;
}
public override void ModifyDisplayNode(UnityDisplayNode node)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
UnityDisplayNodeExt.RemoveBone(node, "SuperMonkeyRig:Dart", false);
((ModDisplay)this).SetMeshTexture(node, ((ModContent)this).Name, 1);
((ModDisplay)this).SetMeshOutlineColor(node, new Color(0.28627452f, 35f / 51f, 0.20392157f), 1);
}
}
}
namespace CardMonkey.Displays.Projectiles
{
public class RedCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class BlueCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class GoldCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class RedWildCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class GoldWildCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class BlueWildCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class WildAceCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class AceInTheHoleAbilityDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override float Scale => 2f;
public override Vector3 PositionOffset => new Vector3(0f, 5f, 0f);
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, "WildAceCardDisplay");
}
}
public class AceOfSpadesCardDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class AceOfSpadesAbilityDisplay : ModDisplay
{
public override string BaseDisplay => "9dccc16d26c1c8a45b129e2a8cbd17ba";
public override float Scale => 2f;
public override Vector3 PositionOffset => new Vector3(0f, 5f, 0f);
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, "AceOfSpadesCardDisplay");
}
}
}