From 909e3a44687ff19cdd3bce6dd8cef63a248ce560 Mon Sep 17 00:00:00 2001 From: Commander-Cat101 Date: Mon, 15 Sep 2025 22:27:36 +1200 Subject: [PATCH 1/2] add some decals --- Assets/CamoDecal.png | Bin 0 -> 11320 bytes Assets/DefaultTemplate.cstmbln | 153 ++++++++++++++++++ Assets/HorizontalSplitDecal.png | Bin 0 -> 9410 bytes Assets/HorizontalStripesDecal.png | Bin 0 -> 9864 bytes Assets/VerticalSplitDecal.png | Bin 0 -> 10451 bytes Assets/VerticalStripesDecal.png | Bin 0 -> 13643 bytes BloonFactory.csproj | 6 + Categories/BehaviorsCategory.cs | 2 +- CustomBloon.cs | 2 + .../BloonTextureModuleProperty.cs | 6 +- Modules/Actions/SpawnBloonsActionModule.cs | 28 +++- Modules/Behaviors/AddChildrenModule.cs | 51 ++++++ Modules/Core/BloonModule.cs | 1 - Modules/Display/DecalModule.cs | 23 ++- Modules/Display/SimpleDisplayModule.cs | 16 +- Modules/Tags/FortifiedTagModule.cs | 2 +- .../Triggers/HealthPercentTriggerModule.cs | 6 +- SerializationHandler.cs | 20 ++- UI/BloonBrowserUI.cs | 19 --- UI/EditSelectorUI.cs | 2 - 20 files changed, 286 insertions(+), 51 deletions(-) create mode 100644 Assets/CamoDecal.png create mode 100644 Assets/DefaultTemplate.cstmbln create mode 100644 Assets/HorizontalSplitDecal.png create mode 100644 Assets/HorizontalStripesDecal.png create mode 100644 Assets/VerticalSplitDecal.png create mode 100644 Assets/VerticalStripesDecal.png create mode 100644 Modules/Behaviors/AddChildrenModule.cs delete mode 100644 UI/BloonBrowserUI.cs diff --git a/Assets/CamoDecal.png b/Assets/CamoDecal.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1197ddc23cb6228a156c948e83fc321e79a47a GIT binary patch literal 11320 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 uOY> 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 JYLu+s{~uue=z;(M literal 0 HcmV?d00001 diff --git a/Assets/VerticalSplitDecal.png b/Assets/VerticalSplitDecal.png new file mode 100644 index 0000000000000000000000000000000000000000..69dfbfcc9b90e1adbcb53b1ec7c3031f6f72e1d7 GIT binary patch literal 10451 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 F@;^ZM*TDb) literal 0 HcmV?d00001 diff --git a/Assets/VerticalStripesDecal.png b/Assets/VerticalStripesDecal.png new file mode 100644 index 0000000000000000000000000000000000000000..d7208382e3fd11427e03ddcf0b375df1e484f553 GIT binary patch literal 13643 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 embedded + + + + + + ..\..\SteamLibrary\steamapps\common\BloonsTD6\Mods\FactoryCore.dll diff --git a/Categories/BehaviorsCategory.cs b/Categories/BehaviorsCategory.cs index c8492f2..c40a010 100644 --- a/Categories/BehaviorsCategory.cs +++ b/Categories/BehaviorsCategory.cs @@ -12,6 +12,6 @@ internal class BehaviorsCategory : Category { public override string Name => "Behaviors"; - public override Type[] Modules => [typeof(DamageReductionModule), typeof(QuickEntryModule), typeof(SpeedUpNearbyBloonsModule), typeof(CashOnPopModule)]; + public override Type[] Modules => [typeof(DamageReductionModule), typeof(QuickEntryModule), typeof(SpeedUpNearbyBloonsModule), typeof(CashOnPopModule), typeof(AddChildrenModule)]; } } diff --git a/CustomBloon.cs b/CustomBloon.cs index abbcf2a..513615b 100644 --- a/CustomBloon.cs +++ b/CustomBloon.cs @@ -8,8 +8,10 @@ using Il2CppAssets.Scripts.Models.Rounds; using Il2CppNinjaKiwi.Common.ResourceUtils; using MelonLoader; +using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; diff --git a/ModuleProperties/BloonTextureModuleProperty.cs b/ModuleProperties/BloonTextureModuleProperty.cs index c2db424..b90fd37 100644 --- a/ModuleProperties/BloonTextureModuleProperty.cs +++ b/ModuleProperties/BloonTextureModuleProperty.cs @@ -12,6 +12,7 @@ using UnityEngine; using UnityEngine.Assertions; using static Il2CppNinjaKiwi.GUTS.Models.BossRushRandomizerSettings; +using TaskScheduler = BTD_Mod_Helper.Api.TaskScheduler; namespace BloonFactory.ModuleProperties { @@ -32,7 +33,10 @@ public override ModHelperPanel GetVisual(ModHelperPanel root) { UpdateImage(image); })); - UpdateImage(image); + TaskScheduler.ScheduleTask(() => + { + UpdateImage(image); + }, ScheduleType.WaitForFrames, 5); return panel; } diff --git a/Modules/Actions/SpawnBloonsActionModule.cs b/Modules/Actions/SpawnBloonsActionModule.cs index 8f5edab..c73fc55 100644 --- a/Modules/Actions/SpawnBloonsActionModule.cs +++ b/Modules/Actions/SpawnBloonsActionModule.cs @@ -6,6 +6,8 @@ using Il2CppAssets.Scripts.Models.Bloons.Behaviors; using Il2CppAssets.Scripts.Unity; using Il2CppInterop.Runtime.InteropTypes.Arrays; +using MelonLoader; +using System; using System.Linq; namespace BloonFactory.Modules.Actions @@ -15,9 +17,15 @@ internal class SpawnBloonsActionModule : Module public override string Name => "Spawn Bloons"; public override void GetModuleProperties() { - AddProperty(new EnumModuleProperty("Bloon", Game.instance.model.bloons.Select(a => a.name).ToArray(), 0)); + AddProperty(new EnumModuleProperty("Bloon", Game.instance.model.bloons.Select(a => a.name).ToArray(), 0, new Action((value) => + { + SetValue(Game.instance.model.bloons[GetValue("Bloon")].id, "BloonId"); + }))); AddProperty(new IntModuleProperty("Count", 10, 0, int.MaxValue)); AddProperty(new FloatModuleProperty("Distance Ahead", 45, float.MinValue, float.MaxValue)); + + if (!HasValue("BloonId")) + SetValue(Game.instance.model.bloons[0].id, "BloonId"); } public override void GetLinkNodes() { @@ -26,9 +34,21 @@ public override void GetLinkNodes() public override void ProcessModule() { - var trigger = GetInputValue("Trigger"); - trigger.bloonModel.AddBehavior(new SpawnBloonsActionModel("SpawnBloonsActionModel", Id.ToString(), Game.instance.model.bloons[GetValue("Bloon")].id, GetValue("Count"), 0.02f - , GetValue("Distance Ahead"), 0, 0, new Il2CppStringArray(["BloonariusAttackSpew"]), new Il2CppStringArray(["BloonariusAttackSpewMoab"]), 1.5f, false, "Bloonarius")); + try + { + var trigger = GetInputValue("Trigger"); + string id = GetValue("BloonId"); + + if (!Game.instance.model.bloons.Any(a => a.id == id)) + return; + + trigger.bloonModel.AddBehavior(new SpawnBloonsActionModel("SpawnBloonsActionModel", Id.ToString(), id, GetValue("Count"), 0.02f + , GetValue("Distance Ahead"), 0, 0, new Il2CppStringArray(["BloonariusAttackSpew"]), new Il2CppStringArray(["BloonariusAttackSpewMoab"]), 1.5f, false, "Bloonarius")); + } + catch (Exception ex) + { + MelonLogger.Error($"Failed to add action. {ex}"); + } } } diff --git a/Modules/Behaviors/AddChildrenModule.cs b/Modules/Behaviors/AddChildrenModule.cs new file mode 100644 index 0000000..db17046 --- /dev/null +++ b/Modules/Behaviors/AddChildrenModule.cs @@ -0,0 +1,51 @@ +using BloonFactory.LinkTypes; +using BTD_Mod_Helper.Extensions; +using FactoryCore.API; +using FactoryCore.API.ModuleProperties; +using FactoryCore.API.ModuleValues; +using Il2CppAssets.Scripts.Models.Bloons; +using Il2CppAssets.Scripts.Models.Bloons.Behaviors; +using Il2CppAssets.Scripts.Unity; +using Il2CppInterop.Runtime.InteropTypes.Arrays; +using MelonLoader; +using System; +using System.Linq; +using static Il2CppNinjaKiwi.GUTS.Models.BossRushRandomizerSettings; + +namespace BloonFactory.Modules.Behaviors +{ + internal class AddChildrenModule : Module + { + public override string Name => "Add Children"; + public override void GetModuleProperties() + { + AddProperty(new EnumModuleProperty("Bloon", Game.instance.model.bloons.Select(a => a.name).ToArray(), 0, new Action((value) => + { + SetValue(Game.instance.model.bloons[GetValue("Bloon")].id, "BloonId"); + }))); + AddProperty(new IntModuleProperty("Count", 10, 0, int.MaxValue)); + + if (!HasValue("BloonId")) + SetValue("", "BloonId"); + } + public override void GetLinkNodes() + { + AddInput("Bloon"); + } + + public override void ProcessModule() + { + try + { + string id = GetValue("BloonId"); + if (Game.instance.model.bloons.Any(a => a.id == id)) + GetInputValue("Bloon").AddToChildren(id, GetValue("Count")); + } + catch (Exception ex) + { + MelonLogger.Error($"Failed to add action. {ex}"); + } + + } + } +} diff --git a/Modules/Core/BloonModule.cs b/Modules/Core/BloonModule.cs index 7d4e2e2..1c57c30 100644 --- a/Modules/Core/BloonModule.cs +++ b/Modules/Core/BloonModule.cs @@ -21,7 +21,6 @@ internal class BloonModule : Module public RoundSetModel currentRoundSet; public override void GetModuleProperties() { - AddProperty(new StringModuleProperty("Name", "Custom Bloon", 20)); AddProperty(new IntModuleProperty("Health", 1, 1, int.MaxValue)); AddProperty(new FloatModuleProperty("Speed", 25, 1, float.MaxValue)); AddProperty(new IntModuleProperty("Damage", 1, 1, int.MaxValue)); diff --git a/Modules/Display/DecalModule.cs b/Modules/Display/DecalModule.cs index bb3401a..d63f5ae 100644 --- a/Modules/Display/DecalModule.cs +++ b/Modules/Display/DecalModule.cs @@ -14,15 +14,19 @@ namespace BloonFactory.Modules.Display { internal class DecalModule : Module { - public static string[] FileNameFromDecal => ["FortifiedDecal"]; + public static string[] FileNameFromDecal => ["FortifiedDecal", "CamoDecal", "HorizontalStripesDecal", "VerticalStripesDecal", "HorizontalSplitDecal", "VerticalSplitDecal"]; public override string Name => "Decal"; + + BloonTexture bloonTexture; public override void GetLinkNodes() { AddInput("Texture"); + AddOutput("Texture", () => bloonTexture); } public override void GetModuleProperties() { - AddProperty(new EnumModuleProperty("Decal", ["Fortified"], 0)); + AddProperty(new EnumModuleProperty("Decal", ["Fortified", "Camo", "Horizontal Stripes", "Vertical Stripes", "Horizontal Split", "Vertical Split"], 0)); + AddProperty(new ColorModuleProperty("Color", Color.white, false)); } public override void ProcessModule() { @@ -30,17 +34,28 @@ public override void ProcessModule() if (texture.texture == null) return; + Color color = GetValue("Color"); var decalTexture = ModContent.GetTexture(FileNameFromDecal[GetValue("Decal")]); for (int x = 0; x < decalTexture.width; x++) { for (int y = 0; y < decalTexture.height; y++) { - Color decalColor = decalTexture.GetPixel(x, y); + Color decalColor = decalTexture.GetPixel(x, y) * color; Color textureColor = texture.texture.GetPixel(x, y); - texture.texture.SetPixel(x, y, decalColor.a < 0.1f ? textureColor : decalColor); + texture.texture.SetPixel(x, y, OverlayColor(textureColor, decalColor)); } } texture.texture.Apply(); + + bloonTexture = texture; + GetOutputsModules("Texture").ProcessAll(); + } + public Color OverlayColor(Color baseColor, Color overlayColor) + { + float a = overlayColor.a; + var color = overlayColor; + color.a = 1; + return Color.Lerp(baseColor, color, a); } } } diff --git a/Modules/Display/SimpleDisplayModule.cs b/Modules/Display/SimpleDisplayModule.cs index 8579b94..0b5ec81 100644 --- a/Modules/Display/SimpleDisplayModule.cs +++ b/Modules/Display/SimpleDisplayModule.cs @@ -17,7 +17,6 @@ internal class SimpleDisplayModule : Module internal BloonTexture bloonTexture; public override void GetLinkNodes() { - AddInput("Visuals"); AddOutput("Texture", () => bloonTexture); } @@ -34,18 +33,13 @@ public override void ProcessModule() } public Texture2D GenerateTexture() { + var outputs = GetOutputsModules("Texture"); + bloonTexture = new BloonTexture(); - var outputs = GetOutputsModules("Texture"); - if (outputs.Count != 0) - { - outputs.ProcessAll(); - } - else - { - var baseBloon = ModContent.GetTexture("BaseBloon"); - bloonTexture.texture = baseBloon; - } + var baseBloon = ModContent.GetTexture("BaseBloon"); + bloonTexture.texture = baseBloon; + outputs.ProcessAll(); return bloonTexture.texture; } } diff --git a/Modules/Tags/FortifiedTagModule.cs b/Modules/Tags/FortifiedTagModule.cs index 1ac8930..5d32ad4 100644 --- a/Modules/Tags/FortifiedTagModule.cs +++ b/Modules/Tags/FortifiedTagModule.cs @@ -12,7 +12,7 @@ namespace BloonFactory.Modules.Tags { internal class FortifiedTagModule : Module { - public override string Name => "Camo Tag"; + public override string Name => "Fortified Tag"; public override void GetModuleProperties() { diff --git a/Modules/Triggers/HealthPercentTriggerModule.cs b/Modules/Triggers/HealthPercentTriggerModule.cs index a6d8235..493494c 100644 --- a/Modules/Triggers/HealthPercentTriggerModule.cs +++ b/Modules/Triggers/HealthPercentTriggerModule.cs @@ -4,6 +4,7 @@ using FactoryCore.API.ModuleValues; using Il2CppAssets.Scripts.Models.Bloons.Behaviors; using Il2CppInterop.Runtime.InteropTypes.Arrays; +using MelonLoader; using System; using System.Collections.Generic; using System.Linq; @@ -18,7 +19,6 @@ internal class HealthPercentTriggerModule : TriggerModule public override void GetModuleProperties() { - AddProperty(new FloatModuleProperty("Interval", 5, 0, float.MaxValue)); AddProperty(new IntSliderModuleProperty("Percentage", 50, 0, 100)); } @@ -30,7 +30,9 @@ public override void GetLinkNodes() public override void ProcessModule() { var guids = new Il2CppStringArray(GetOutputsModules("Trigger").AsGuids()); - currentModel.AddBehavior(new HealthPercentTriggerModel("HealthPercentTriggerModel", false, new float[GetValue("Percentage") / 100], guids, true)); + + float value = (float)GetValue("Percentage") / 100; + currentModel.AddBehavior(new HealthPercentTriggerModel("HealthPercentTriggerModel", false, new float[] { value }, guids, true)); GetOutputsModules("Trigger").ProcessAll(); } diff --git a/SerializationHandler.cs b/SerializationHandler.cs index 3c6f8dc..a0671bb 100644 --- a/SerializationHandler.cs +++ b/SerializationHandler.cs @@ -1,14 +1,17 @@ using BloonFactory.Modules.Core; +using BTD_Mod_Helper; +using BTD_Mod_Helper.Api; +using BTD_Mod_Helper.Extensions; using FactoryCore.API; using Il2CppSystem.Security.Cryptography; +using MelonLoader; using MelonLoader.Utils; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Reflection; namespace BloonFactory { @@ -53,7 +56,7 @@ internal static void LoadAllTemplates() var template = LoadTemplate(path); if (!Templates.Any(a => a.Guid == template.Guid)) { - template.LoadModules(); + template.SetReferences(); Templates.Add(template); } } @@ -62,9 +65,16 @@ internal static void LoadAllTemplates() internal static BloonTemplate CreateTemplate(string name) { EnsureFolderExists(); + foreach (string thing in Assembly.GetCallingAssembly().GetManifestResourceNames()) + { + MelonLogger.Msg(thing); + } + var template = JsonConvert.DeserializeObject(Assembly.GetCallingAssembly().GetEmbeddedText("DefaultTemplate" + FileExtention), Settings); - var template = new BloonTemplate() { IsLoaded = false, Guid = Guid.NewGuid(), Name = name }; - template.AddModule(new BloonModule()); + template.IsLoaded = false; + template.Name = name; + template.Guid = Guid.NewGuid(); + template.SetReferences(); SaveTemplate(template); Templates.Add(template); return template; diff --git a/UI/BloonBrowserUI.cs b/UI/BloonBrowserUI.cs deleted file mode 100644 index e200a61..0000000 --- a/UI/BloonBrowserUI.cs +++ /dev/null @@ -1,19 +0,0 @@ -using BTD_Mod_Helper.Api; -using BTD_Mod_Helper.Api.Legends; -using Il2CppAssets.Scripts.Unity.UI_New.ChallengeEditor; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BloonFactory.UI -{ - internal class BloonBrowserUI : ModGameMenu - { - public override bool OnMenuOpened(Il2CppSystem.Object data) - { - - } - } -} diff --git a/UI/EditSelectorUI.cs b/UI/EditSelectorUI.cs index d32dbfe..50307b2 100644 --- a/UI/EditSelectorUI.cs +++ b/UI/EditSelectorUI.cs @@ -73,8 +73,6 @@ public void CreateExtraContent(ModHelperPanel root) })); newBloon.AddText(new Info("Text", 0, 0, 700, 250), "Create", 120); - //var openBrowser = panel.AddButton(new Info("BloonDownloader", 0, 0, 0, 0)) - bottomGroupAnimator = panel.AddComponent(); bottomGroupAnimator.runtimeAnimatorController = Animations.PopupAnim; bottomGroupAnimator.speed = .55f; From 2d540784aa7584882db95f6730126951725a59b1 Mon Sep 17 00:00:00 2001 From: Commander-Cat101 Date: Tue, 16 Sep 2025 20:28:44 +1200 Subject: [PATCH 2/2] import button --- SerializationHandler.cs | 23 ++++++++++++++++------- UI/BloonEditorUI.cs | 3 +++ UI/EditSelectorUI.cs | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/SerializationHandler.cs b/SerializationHandler.cs index a0671bb..17217b2 100644 --- a/SerializationHandler.cs +++ b/SerializationHandler.cs @@ -37,7 +37,11 @@ internal static void SaveTemplate(BloonTemplate template) var path = Path.Combine(FolderDirectory, template.Guid.ToString() + FileExtention); File.WriteAllText(path, content); } - internal static BloonTemplate LoadTemplate(string path) + internal static bool ContainGuid(Guid guid) + { + return Templates.Any(a => a.Guid == guid); + } + internal static BloonTemplate GetTemplateFromPath(string path) { EnsureFolderExists(); @@ -47,18 +51,23 @@ internal static BloonTemplate LoadTemplate(string path) var content = JsonConvert.DeserializeObject(File.ReadAllText(path), Settings); return content; } + internal static void LoadTemplate(BloonTemplate template) + { + if (!ContainGuid(template.Guid)) + { + template.SetReferences(); + Templates.Add(template); + } + + } internal static void LoadAllTemplates() { EnsureFolderExists(); foreach (var path in Directory.GetFiles(FolderDirectory).Where(f => f.EndsWith(".cstmbln"))) { - var template = LoadTemplate(path); - if (!Templates.Any(a => a.Guid == template.Guid)) - { - template.SetReferences(); - Templates.Add(template); - } + var template = GetTemplateFromPath(path); + LoadTemplate(template); } HasLoaded = true; } diff --git a/UI/BloonEditorUI.cs b/UI/BloonEditorUI.cs index 8e65022..c7cb9ad 100644 --- a/UI/BloonEditorUI.cs +++ b/UI/BloonEditorUI.cs @@ -1,4 +1,5 @@ using BloonFactory.Categories; +using BloonFactory.Modules.Core; using FactoryCore.API; using FactoryCore.UI; using System; @@ -13,6 +14,8 @@ internal class BloonEditorUI : EditorUI { public override List Categories => [new TagsCategory(), new BehaviorsCategory(), new TriggerCategory(), new ActionCategory(), new DisplayCategory(), new SpawningCategory() ]; + public override Type CenteredModule => typeof(BloonModule); + public override void SaveTemplate() { SerializationHandler.SaveTemplate((BloonTemplate)Template); diff --git a/UI/EditSelectorUI.cs b/UI/EditSelectorUI.cs index 50307b2..4d7b44f 100644 --- a/UI/EditSelectorUI.cs +++ b/UI/EditSelectorUI.cs @@ -9,9 +9,12 @@ using Il2CppAssets.Scripts.Unity.UI_New.Main.PowersSelect; using Il2CppAssets.Scripts.Unity.UI_New.Popups; using Il2CppAssets.Scripts.Unity.UI_New.Settings; +using Il2CppNewtonsoft.Json; using Il2CppNinjaKiwi.Common; +using NfdSharp; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -47,14 +50,14 @@ public void CreateMainContent(ModHelperPanel root) mainPanelAnimator = panel.AddComponent(); mainPanelAnimator.runtimeAnimatorController = Animations.PopupAnim; mainPanelAnimator.speed = .55f; - mainPanelAnimator.Play("PopupSlideIn"); + mainPanelAnimator.Play("PopupScaleIn"); AddContent(); } public void CreateExtraContent(ModHelperPanel root) { var panel = root.AddPanel(new Info("Panel", InfoPreset.FillParent)); - var newBloon = panel.AddButton(new Info("CreateNewBloon", 0, 250, 800, 300, new Vector2(0.5f, 0)), VanillaSprites.GreenBtnLong, new Action(() => + var newBloon = panel.AddButton(new Info("CreateNewBloon", 450, 250, 800, 300, new Vector2(0.5f, 0)), VanillaSprites.GreenBtnLong, new Action(() => { MenuManager.instance.buttonClickSound.Play("ClickSounds"); PopupScreen.instance.SafelyQueue(screen => screen.ShowSetNamePopup("Create Bloon", "Name of bloon to create.\n", new Action(name => @@ -73,10 +76,34 @@ public void CreateExtraContent(ModHelperPanel root) })); newBloon.AddText(new Info("Text", 0, 0, 700, 250), "Create", 120); + var importBloon = panel.AddButton(new Info("ImportBloon", -450, 250, 800, 300, new Vector2(0.5f, 0)), VanillaSprites.GreenBtnLong, new Action(() => + { + MenuManager.instance.buttonClickSound.Play("ClickSounds"); + + FileDialogHelper.PrepareNativeDlls(); + + if (Nfd.OpenDialog("cstmbln", "", out string path) == Nfd.NfdResult.NFD_OKAY) + { + try + { + var template = SerializationHandler.GetTemplateFromPath(path); + if (SerializationHandler.ContainGuid(template.Guid)) + return; + SerializationHandler.LoadTemplate(template); + SerializationHandler.SaveTemplate(template); + } + catch + { + PopupScreen.instance.SafelyQueue(screen => screen.ShowPopup(PopupScreen.Placement.menuCenter, "Failed Import.", "Failed to import bloon.", null, "Ok", null, null, Popup.TransitionAnim.Scale)); + } + } + })); + importBloon.AddText(new Info("Text", 0, 0, 700, 250), "Import", 120); + bottomGroupAnimator = panel.AddComponent(); bottomGroupAnimator.runtimeAnimatorController = Animations.PopupAnim; bottomGroupAnimator.speed = .55f; - bottomGroupAnimator.Play("PopupScaleIn"); + bottomGroupAnimator.Play("PopupSlideIn"); } public void AddContent() {