public void ModelColorTableResolver(int type, TowerModel tower, Models.LISFileReader lisFile)
        {
            Dictionary <int, LISFileItem> NODE_ID_TO_ITEM = lisFile.ITEM_DICTIONARY;
            int TYPE_ID = lisFile.param.SpecialTypeId;

            switch (type)
            {
            case 0:
                GetTemperatureColorTable(tower, NODE_ID_TO_ITEM);
                break;

            case 1:
                GetDisplacementColorTable(tower, NODE_ID_TO_ITEM, TYPE_ID);
                break;

            case 2:
                GetStressColorTable(tower, NODE_ID_TO_ITEM, TYPE_ID);
                break;

            case 3:
                GetStrainColorTable(tower, NODE_ID_TO_ITEM, TYPE_ID);
                break;

            case 4:
                GetPlasticStrainColorTable(tower, NODE_ID_TO_ITEM, TYPE_ID);
                break;
            }

            // assign new elem-color table
            tower.SetColorGen(ColorGen);
        }
Esempio n. 2
0
        public static void MOABAssassin(TowerModel model)
        {
            var realProjectile = model.GetWeapon().projectile.GetBehavior <CreateProjectileOnContactModel>()
                                 .projectile;

            realProjectile.GetBehaviors <DamageModifierForTagModel>().First(m => m.tag == "Moabs").damageAddative += 18;
        }
Esempio n. 3
0
        /// <summary>
        /// Get the number position of this TowerModel in the list of all tower models
        /// </summary>
        public static int?GetIndex(this TowerModel towerModel)
        {
            List <TowerDetailsModel> allTowers = Game.instance.model.towerSet.ToList();
            TowerDetailsModel        detail    = allTowers.FirstOrDefault(towerDetail => towerDetail.towerId == towerModel.baseId);

            return(allTowers.IndexOf(detail));
        }
Esempio n. 4
0
        public static void GrandSaboteur(TowerModel model)
        {
            BloonSabotage(model);
            model.range += 10;

            List <string[]> tags = new List <string[]>
            {
                new [] { "Moab" },
                new [] { "Bfb" },
                new [] { "Zomg" },
                new [] { "Ddt" },
                new [] { "Bad" },
            };

            foreach (var weaponModel in model.GetWeapons())
            {
                for (var i = 0; i < tags.Count; i++)
                {
                    var t        = tags[i];
                    var behavior = new DamageModifierForTagModel("DamageModifierForTagModel_" + i, t[0], 1.0f,
                                                                 10 * (i + 1), false, false)
                    {
                        tags = t
                    };
                    weaponModel.projectile.AddBehavior(behavior);
                    weaponModel.projectile.pierce += 10;

                    weaponModel.projectile.GetDamageModel().damageTypes = new Il2CppStringArray(new[] { "Normal" });
                }
            }
        }
Esempio n. 5
0
        public static void SpiritoftheForest(TowerModel model)
        {
            JunglesBounty(model);
            var lives = new BonusLivesPerRoundModel("BonusLivesPerRoundModel", 25, 1f, "9bef6b3a7356f834eb953cc79622cdef");

            model.AddBehavior(lives);
        }
Esempio n. 6
0
 internal static void Postfix(Tower tower, TowerModel def, string __state)
 {
     if (__state != null)
     {
         MelonMain.PerformHook(mod => mod.OnTowerUpgraded(tower, __state, def));
     }
 }
 internal static void Postfix(Tower tower, TowerModel def, string __state)
 {
     if (__state != null)
     {
         MelonMain.DoPatchMethods(mod => mod.OnTowerUpgraded(tower, __state, def));
     }
 }
Esempio n. 8
0
        public static void GroundZero(TowerModel model)
        {
            var ability       = model.GetAbilites()[0];
            var abilityAttack = ability.GetBehavior <ActivateAttackModel>().attacks[0].Duplicate();
            var abilityWeapon = abilityAttack.weapons[0];

            var effectModel = ability.GetBehavior <CreateEffectOnAbilityModel>().effectModel.Duplicate();

            effectModel.scale             = .5f;
            effectModel.useCenterPosition = false;

            var effectBehavior =
                new CreateEffectOnExhaustFractionModel("CreateEffectOnExhaustFractionModel_GroundZero", "", effectModel, 0, false, 1.0f, -1f, false);

            abilityWeapon.projectile.AddBehavior(effectBehavior);
            abilityWeapon.rate = 6;
            abilityWeapon.projectile.GetDamageModel().damage = 100;
            abilityWeapon.projectile.radius = 100;

            var airBehavior = model.GetAttackModels()[0].weapons[0].GetBehavior <FireFromAirUnitModel>();

            abilityWeapon.behaviors = new Il2CppReferenceArray <WeaponBehaviorModel>(new WeaponBehaviorModel[] { airBehavior });

            var sound         = ability.GetBehavior <CreateSoundOnAbilityModel>().sound;
            var soundBehavior =
                new CreateSoundOnProjectileExhaustModel("CreateSoundOnProjectileExhaustModel_GroundZero", sound, sound, sound, sound, sound);

            abilityWeapon.projectile.AddBehavior(soundBehavior);

            model.AddBehavior(abilityAttack);
        }
Esempio n. 9
0
        public static void PlasmaMonkeyFanClub(TowerModel model)
        {
            model.GetWeapon().rate *= 0.03f / .475f;
            model.range += 20;
            model.GetAttackModels()[0].range += 20;

            ProjectileModel plasmaModel =
                Game.instance.model.GetTower(SuperMonkey, 2, 0, 0).GetWeapon().projectile;

            foreach (var weaponProjectile in model.GetAllProjectiles())
            {
                if (weaponProjectile.display == null)
                {
                    continue;
                }
                weaponProjectile.display = plasmaModel.display;
                weaponProjectile.GetBehavior <DisplayModel>().display = plasmaModel.display;
                weaponProjectile.GetDamageModel().damage     += 2;
                weaponProjectile.GetDamageModel().damageTypes = new Il2CppStringArray(new[] { "Plasma" });
                weaponProjectile.pierce += 5;


                weaponProjectile.GetBehavior <TravelStraitModel>().lifespan       *= 2f;
                weaponProjectile.GetBehavior <TravelStraitModel>().lifespanFrames *= 2;
            }
        }
Esempio n. 10
0
 public static void GlueStorm(TowerModel model)
 {
     GlueStrike(model);
     model.range *= 2;
     model.GetAttackModels()[0].range *= 2;
     model.GetWeapon().rate /= 2f;
 }
Esempio n. 11
0
        public static void SpecialPoperations(TowerModel model)
        {
            var ability  = model.GetAbilites()[1];
            var behavior = new ActivateAbilityOnRoundStartModel("ActivateAbilityOnRoundStartModel_SpecialPoperations", ability.Duplicate());

            ability.enabled = false;
            model.AddBehavior(behavior);

            var specialPops = model.GetAbilites()[2];

            model.behaviors = model.behaviors.RemoveItem(specialPops);

            var marine = specialPops.GetBehavior <FindDeploymentLocationModel>().towerModel;

            var weapon = marine.GetAttackModels()[0].weapons[0].Duplicate();

            var airBehavior = model.GetAttackModels()[0].weapons[0].GetBehavior <FireFromAirUnitModel>();

            weapon.behaviors = new Il2CppReferenceArray <WeaponBehaviorModel>(new WeaponBehaviorModel[] { airBehavior });

            weapon.ejectX = weapon.ejectY = weapon.ejectZ = 0;

            weapon.emission = model.GetWeapon().emission.Duplicate();
            weapon.emission.Cast <EmissionWithOffsetsModel>().throwMarkerOffsetModels =
                new Il2CppReferenceArray <ThrowMarkerOffsetModel>(new[]
            {
                weapon.emission.Cast <EmissionWithOffsetsModel>().throwMarkerOffsetModels[0]
            });
            weapon.emission.Cast <EmissionWithOffsetsModel>().throwMarkerOffsetModels[0].ejectX = 0;
            weapon.emission.Cast <EmissionWithOffsetsModel>().projectileCount = 1;

            model.GetAttackModels()[0].AddWeapon(weapon);
        }
Esempio n. 12
0
        public static void AbsoluteZero(TowerModel model)
        {
            var realSlow = model.GetBehavior <SlowBloonsZoneModel>();

            var totem = Game.instance.model.GetTowerFromId("NaturesWardTotem");

            var slow = totem.GetBehaviors <SlowBloonsZoneModel>().First(b => !b.name.Contains("NonMoabs")).Duplicate();

            slow.zoneRadius             = realSlow.zoneRadius;
            slow.bindRadiusToTowerRange = true;
            slow.radiusOffset           = realSlow.radiusOffset;
            slow.mutator.Cast <SlowBloonsZoneModel.Mutator>().speedScale -= .1f;


            model.AddBehavior(slow);

            var buff = new RateSupportModel("RateSupportZoneModel_AbilityChoice", 2f / 3f, true, "AbsoluteZeroRateBuff2", false, 1,
                                            new Il2CppReferenceArray <TowerFilterModel>(
                                                new TowerFilterModel[]
            {
                new FilterInBaseTowerIdModel("FilterInBaseTowerIdModel_",
                                             new Il2CppStringArray(new [] { IceMonkey }))
            }
                                                )
                                            , "", "");

            buff.showBuffIcon         = false;
            buff.appliesToOwningTower = true;
            model.AddBehavior(buff);
        }
        public void ModelParameterResolver(int type, TowerModel tower, Models.LISFileReader lisFile)
        {
            Dictionary <int, LISFileItem> NODE_ID_TO_ITEM = lisFile.ITEM_DICTIONARY;
            int TYPE_ID = lisFile.param.SpecialTypeId;

            switch (type)
            {
            case 0:
                break;

            case 1:
                SetDisplacementModelParamters(tower, NODE_ID_TO_ITEM, TYPE_ID);
                break;

            case 2:
                SetStrainModelParamters(tower, NODE_ID_TO_ITEM, TYPE_ID);
                break;

            case 3:
                break;

            case 4:
                break;
            }
        }
        public void GetStressColorTable(TowerModel tower, Dictionary <int, LISFileItem> NODE_ID_TO_ITEM, int TYPE_ID)
        {
            foreach (ListElemBase elem in tower.ElemList)
            {
                double AVE_TEMP = 0.0;
                int    cnt      = 0;
                for (int i = 0; i < 8; i++)
                {
                    if (NODE_ID_TO_ITEM.ContainsKey(elem.Elem_Nodes[i]))
                    {
                        ListNodeBase node    = tower.NodeList[tower.NodeElemTable[elem.Elem_Nodes[i]]];
                        LISFileItem  lisItem = NODE_ID_TO_ITEM[elem.Elem_Nodes[i]];

                        AVE_TEMP += lisItem.VAL[TYPE_ID];
                        cnt++;
                    }
                }
                if (cnt != 0)
                {
                    AVE_TEMP /= cnt;
                }
                ColorGen.AddElemPropertyValue(AVE_TEMP, elem.Elem_Number);
            }
            ColorGen.SetElemPropertyMinMaxValue();
            ColorGen.SetGivenColorTable();
            ColorGen.SetDivisionValues();
        }
Esempio n. 15
0
        /// <summary>
        /// Return the UpgradeModel for a specific upgrade path/tier
        /// </summary>
        /// <param name="path"></param>
        /// <param name="tier"></param>
        public static UpgradeModel GetUpgrade(this TowerModel towerModel, int path, int tier)
        {
            if (path < 0 || tier < 0)
            {
                return(null);
            }

            int tier1 = (path == 0) ? tier : 0;
            int tier2 = (path == 1) ? tier : 0;
            int tier3 = (path == 2) ? tier : 0;


            TowerModel tempTower = Game.instance?.model?.GetTower(towerModel.GetBaseId(), tier1, tier2, tier3);

            if (tempTower is null)
            {
                return(null);
            }

            const int           offset          = 1;
            List <UpgradeModel> appliedUpgrades = tempTower.GetAppliedUpgrades();
            UpgradeModel        results         =
                appliedUpgrades.FirstOrDefault(model => model.path == path && model.tier == (tier - offset));

            return(null);
        }
Esempio n. 16
0
        public static void TechTerror(TowerModel model)
        {
            var ability       = model.GetAbilites()[0];
            var abilityAttack = ability.GetBehavior <ActivateAttackModel>().attacks[0].Duplicate();
            var abilityWeapon = abilityAttack.weapons[0];

            var effect = ability.GetBehavior <CreateEffectOnAbilityModel>().effectModel;

            abilityWeapon.projectile.display = effect.assetId;
            var effectBehavior =
                new CreateEffectOnExhaustFractionModel("CreateEffectOnExhaustFractionModel_Annihilation", "", effect, 0, false, 1.0f, -1f, false);

            abilityWeapon.projectile.AddBehavior(effectBehavior);

            /*
             * var sound = ability.GetBehavior<CreateSoundOnAbilityModel>().sound;
             * var soundBehavior =
             *  new CreateSoundOnProjectileExhaustModel("AbilityChoice", sound, sound, sound, sound, sound);
             * abilityWeapon.projectile.AddBehavior(soundBehavior);
             */

            abilityWeapon.projectile.GetDamageModel().damage /= 20;
            abilityWeapon.rate = 2.25f;

            abilityAttack.range             = abilityWeapon.projectile.radius - 10;
            abilityAttack.fireWithoutTarget = false;

            model.AddBehavior(abilityAttack);
        }
Esempio n. 17
0
 public static void AskApplyToTower(Tower tower, string upgradeName, TowerModel newBaseTowerModel)
 {
     if (!InGame.instance.IsCoop || tower.owner == Game.instance.nkGI.PeerID)
     {
         PopupScreen.instance.ShowPopup(PopupScreen.Placement.inGameCenter,
                                        "Ability Choice (Can't be Undone)",
                                        $"Do you want to forego the {upgradeName} ability to instead get \"{AllUpgrades[upgradeName]}\"",
                                        new Action(() =>
         {
             EnableForTower(tower, newBaseTowerModel);
             if (InGame.instance.IsCoop && Game.instance.nkGI != null)
             {
                 Game.instance.nkGI.SendMessage("Enable: " + tower.Id, null, "AbilityChoice");
             }
         }), "Yes",
                                        new Action(() =>
         {
             DisableForTower(tower);
             if (InGame.instance.IsCoop && Game.instance.nkGI != null)
             {
                 Game.instance.nkGI.SendMessage("Disable: " + tower.Id, null, "AbilityChoice");
             }
         }), "No", Popup.TransitionAnim.Scale
                                        );
     }
     else
     {
         CoOpTowerModelCache[tower.Id] = newBaseTowerModel;
     }
 }
Esempio n. 18
0
        public static void BloonSabotage(TowerModel model)
        {
            model.range += 10;
            var ability       = model.GetAbilites()[0];
            var abilityAttack = ability.GetBehavior <ActivateAttackModel>().attacks[0].Duplicate();
            var abilityWeapon = abilityAttack.weapons[0];
            var slowMutator   = abilityWeapon.projectile.GetBehavior <SlowMinusAbilityDurationModel>().Mutator;

            var dontSlowBadBehavior = abilityWeapon.projectile.GetBehavior <SlowModifierForTagModel>();

            var slowBehavior = new SlowModel("Sabotage", 0f, 2f, slowMutator.mutationId, "", 999,
                                             new Il2CppSystem.Collections.Generic.Dictionary <string, AssetPathModel>(), 0, true, false, null,
                                             false, false)
            {
                mutator = slowMutator
            };


            foreach (var weaponModel in model.GetWeapons())
            {
                weaponModel.projectile.AddBehavior(slowBehavior);
                weaponModel.projectile.AddBehavior(dontSlowBadBehavior);
                weaponModel.projectile.pierce += 5;

                weaponModel.projectile.GetDamageModel().damageTypes = new Il2CppStringArray(new[] { "Normal" });
            }
        }
        public TowerModel CraftsModePreExecutor()
        {
            Models.VTKFormPreExecutor preExecutor = new Models.VTKFormPreExecutor();
            int EnvCheck = preExecutor.FormEnvironmentChecker(CfEnv.paras);

            if (EnvCheck == 1)
            {
                // The Environment Check has been passed
                // First: Build the environment
                if (CfEnv.WorkSpaceInstance.Env.BuildLisFileExecutor(CfEnv.paras) == -1)
                {
                    MessageBox.Show("文件不存在");
                    return(null);
                }

                // Second: Get the model
                TowerModel newTowerModel = preExecutor.TowerModelGetter(CfEnv.WorkSpaceInstance.Env.LisFileExecutor,
                                                                        CfEnv.WorkSpaceInstance.Env.TowerModelList,
                                                                        CfEnv.WorkSpaceInstance.TowerModelInstance,
                                                                        CfEnv.paras);
                return(newTowerModel);
                //BuildForm(newTowerModel);
            }
            else if (EnvCheck == -1)
            {
                return(CfEnv.WorkSpaceInstance.TowerModelInstance);
                //Build Origin model
                //BuildForm(WorkSpaceInstance.TowerModelInstance);
            }
            return(null);
        }
Esempio n. 20
0
        static void spawnTower(Vector3 v3, TowerModel towerModel)
        {
            towerPlaced = false;
            int attempts = 0;

            while (!towerPlaced && attempts < 100)
            {
                {
                    for (int i = -50; i < 200; i++)
                    {
                        try
                        {
                            float y = v3.y * -2.3f;

                            var towerPos = new UnityEngine.Vector2(v3.x, y);
                            InGame.instance.bridge.CreateTowerAt(towerPos, towerModel, i, true, action2);
                            //System.Console.WriteLine(x + " " + y);
                            break;
                        }
                        catch// (System.Exception e2)
                        {
                            //System.Console.WriteLine(e2 + "");
                        }
                    }
                    attempts++;
                }
            }
        }
Esempio n. 21
0
        /// <summary>
        /// (Cross-Game compatible) Return all TowerToSimulations with this TowerModel
        /// </summary>
        public static List <TowerToSimulation> GetAllTowerToSim(this TowerModel towerModel)
        {
            var towers        = InGame.instance?.GetAllTowerToSim();
            var desiredTowers = towers.Where(towerSim => towerSim.Def.name == towerModel.name).ToList();

            return(desiredTowers);
        }
        internal static void Postfix(UpgradeScreen __instance, TowerModel tower, int pathIndex, Il2CppReferenceArray <UpgradeDetails> pathUpgrades)
        {
            var modTower = tower.GetModTower();

            if (modTower != null)
            {
                var portrait       = modTower.PortraitReference;
                var maxPathTier    = modTower.tierMaxes[pathIndex];
                var emptyAbilities = new List <AbilityModel>().Cast <ICollection <AbilityModel> >();
                var upgradeModel   = modTower.dummyUpgrade;
                for (var i = maxPathTier; i < 5; i++)
                {
                    var upgradeDetails = pathUpgrades[i];
                    upgradeDetails.SetUpgrade(tower.baseId, upgradeModel, emptyAbilities, pathIndex, portrait);
                    upgradeDetails.gameObject.SetActive(false);
                }

                if (maxPathTier < 5)
                {
                    var bgLines = __instance.transform.GetComponentFromChildrenByName <RectTransform>($"{pathIndex + 1}");
                    bgLines.GetComponentsInChildren <CanvasRenderer>().Do(renderer =>
                    {
                        renderer.SetAlpha(0);
                    });
                }
            }
        }
Esempio n. 23
0
        /// <summary>
        /// (Cross-Game compatible) Recursively get every WeaponModels this TowerModel has
        /// </summary>
        public static List <WeaponModel> GetWeapons(this TowerModel towerModel)
        {
            List <AttackModel> attackModels = towerModel.GetAttackModels();

            if (attackModels is null)
            {
                return(null);
            }

            if (!attackModels.Any())
            {
                return(new List <WeaponModel>());
            }

            List <WeaponModel> weaponModels = new List <WeaponModel>();

            foreach (AttackModel attackModel in attackModels)
            {
                Il2CppReferenceArray <WeaponModel> weapons = attackModel.weapons;
                if (weapons != null)
                {
                    weaponModels.AddRange(weapons);
                }
            }

            return(weaponModels);
        }
Esempio n. 24
0
        /// <summary>
        /// (Cross-Game compatible) Duplicate this TowerModel with a unique name. Very useful for making custom TowerModels
        /// </summary>
        /// <param name="towerModel"></param>
        /// <param name="newTowerId">Set's the new towerId of this copy. By default the baseId will be set to this as well</param>
        /// <returns></returns>
        internal static TowerModel MakeCopyInternal(TowerModel towerModel, string newTowerId)
        {
            var duplicate = towerModel.Duplicate();

            duplicate.name = newTowerId;
            return(duplicate);
        }
 public WorkSpaceClass()
 {
     NLIST_FILENAME = "";
     ELIST_FILENAME = "";
     TowerModelInstance = new TowerModel();
     ROOT_DIR = "";
 }
Esempio n. 26
0
        private static void AddToDataList(TowerModel towerModel)
        {
            var result = SessionData.CurrentSession.AllTowerData.FirstOrDefault(data => data.TowerModel == towerModel);

            if (result != null)
            {
                return;
            }

            var towerData = new TowerData()
            {
                TowerModel    = towerModel,
                Radius        = towerModel.radius,
                RadiusSquared = towerModel.radiusSquared
            };

            var areaCount = towerModel.areaTypes.Count;

            towerData.AreaTypes = new Il2CppStructArray <AreaType>(areaCount);
            for (int i = 0; i < towerModel.areaTypes.Count; i++)
            {
                var areaType = towerModel.areaTypes[i];
                towerData.AreaTypes[i] = areaType;
            }

            SessionData.CurrentSession.AllTowerData.Add(towerData);
        }
Esempio n. 27
0
        internal static bool Prefix(ref Tower __instance, ref Model modelToUse)
        {
            if (SessionData.CurrentSession.IsCheating)
            {
                return(true);
            }

            var settings = Settings.LoadedSettings;

            /*if (!settings.AllowedTowers.Contains(__instance.towerModel.name))
             *  return;*/

            TowerModel newTower = null;

            for (int i = 0; i < 10; i++)
            {
                newTower = GetNewTower();
                if (newTower != null)
                {
                    break;
                }
            }

            if (newTower != null)
            {
                modelToUse = newTower;
            }

            return(true);
        }
Esempio n. 28
0
        public static int GetCostForThing(TowerModel towerModel)
        {
            var cost = Game.instance.model.GetTowerWithName(towerModel.name).cost;

            foreach (var appliedUpgrade in towerModel.GetAppliedUpgrades())
            {
                cost += appliedUpgrade.cost;
            }

            switch (InGame.instance.SelectedDifficulty)
            {
            case "Easy":
                cost *= .85f;
                break;

            case "Hard":
                cost *= 1.08f;
                break;

            case "Impoppable":
                cost *= 1.2f;
                break;
            }

            cost *= 1 - .05f * towerModel.tier;
            return((int)(5 * Math.Round(cost / 5)));
        }
Esempio n. 29
0
        public static void Dreadnought(TowerModel model)
        {
            var attackModel = model.GetAttackModel();
            var flameGrape  = Game.instance.model.GetTower(MonkeyBuccaneer, 0, 2, 0).GetWeapons()[3]
                              .projectile;

            foreach (var projectileModel in attackModel.GetAllProjectiles())
            {
                if (projectileModel.name.Contains("Explosion") || projectileModel.GetDamageModel() == null)
                {
                    continue;
                }


                projectileModel.collisionPasses = flameGrape.collisionPasses;
                projectileModel.AddBehavior(flameGrape.GetBehavior <AddBehaviorToBloonModel>().Duplicate());
                if (model.appliedUpgrades.Contains("Buccaneer-Hot Shot"))
                {
                    projectileModel.GetBehavior <AddBehaviorToBloonModel>().GetBehavior <DamageOverTimeModel>()
                    .triggerImmediate     = true;
                    projectileModel.scale = .5f;
                }
                else
                {
                    projectileModel.scale = .75f;
                }

                projectileModel.display = "c840e245a0b1deb4284cfc3f953e16cf";
                projectileModel.GetDamageModel().damageTypes = new Il2CppStringArray(new[] { "Normal" });
            }
        }
Esempio n. 30
0
        public static void MortarEmpowerment(TowerModel towerModel)
        {
            var sniper      = Game.instance.model.GetTowerFromId(SniperMonkey);
            var attackModel = towerModel.GetAttackModel();

            foreach (var sniperTargetType in sniper.targetTypes)
            {
                towerModel.targetTypes.Add(sniperTargetType);
            }


            var targetSelectedPointModel = attackModel.GetBehavior <TargetSelectedPointModel>();

            attackModel.RemoveBehavior <TargetSelectedPointModel>();
            attackModel.targetProvider = null;

            attackModel.AddBehavior(sniper.GetAttackModel().GetBehavior <TargetFirstModel>().Duplicate());
            attackModel.AddBehavior(sniper.GetAttackModel().GetBehavior <TargetLastModel>().Duplicate());
            attackModel.AddBehavior(sniper.GetAttackModel().GetBehavior <TargetCloseModel>().Duplicate());
            attackModel.AddBehavior(sniper.GetAttackModel().GetBehavior <TargetStrongModel>().Duplicate());

            attackModel.AddBehavior(targetSelectedPointModel);

            towerModel.towerSelectionMenuThemeId = "ActionButton";

            /*var ageModel = towerModel.GetWeapon().projectile.GetBehavior<AgeModel>();
             * if (ageModel != null)
             * {
             *  ageModel.Lifespan /= 2;
             * }*/
        }
    // Use this for initialization
    void Start()
    {
        Instance = this;

        _controllers = new List <IController>();

        Contexts    contexts = Contexts.sharedInstance;
        GameContext context  = contexts.game;

        _rootSystem = new RootSystem(contexts);

        _rootSystem.Initialize();

        HexGenerator.Instance = GetComponent <HexGenerator>();

        PlayerHealthModel = new PlayerHealthModel(20);

        PlayerHealthController PlayerHealthController = new PlayerHealthController
        {
            View       = PlayerHealthView,
            Model      = PlayerHealthModel,
            MainMenuUI = MainMenuUI
        };

        PlayerHealthController.Init();

        AboutController About = new AboutController
        {
            View    = AboutView,
            AboutUI = AboutUI
        };

        About.Init();

        MainMenuController MainMenu = new MainMenuController
        {
            View       = MainMenuView,
            MainMenuUI = MainMenuUI,
            AboutUI    = AboutUI
        };

        MainMenu.Init();

        StartModel = new StartModel();

        StartController start = new StartController
        {
            View  = StartView,
            Model = StartModel
        };

        start.Init();

        CreateMoneyController();

        TowerModel model = CreateTowerController();

        CreateTiles(context, model);
    }