示例#1
0
    private void onUpdateLabel(DefaultLabelController labelController, EncounterTrackable encounter,
                               PickupObject item)
    {
        NoBrainJsonItem noBrainJsonItem;
        var             success = NoBrain.jsonItemDict.TryGetValue(item.PickupObjectId, out noBrainJsonItem);

        if (!success)
        {
            return;
        }

        // Text change
        var newText = labelController.label.Text;
        var indexOf = newText.IndexOf(SEPARATOR_TEXT) + SEPARATOR_TEXT.Length;

        if (indexOf == -1)
        {
            newText = "ERROR FINDING SEPARATOR";
        }
        else
        {
            newText  = newText.Substring(0, indexOf);
            newText += getTextForPage(labelController, encounter, item);
        }
        labelController.label.Text = newText;
//        NoBrain.LogFine("NoBrainBehaviour updating text to: " + newText);

        // Layouting
        labelController.label.AutoHeight = true;
        labelController.label.Invalidate();
        labelController.panel.FitToContents();
        labelController.panel.Invalidate();
        labelController.Trigger();
    }
示例#2
0
 /// <summary>
 /// Gets the item unlocked by <paramref name="blueprintTrackable"/>
 /// </summary>
 /// <param name="blueprintTrackable">Target blueprint</param>
 /// <returns>The item unlocked by <paramref name="blueprintTrackable"/> or <see langword="null"/> if it didn't find it</returns>
 public static PickupObject GetBlueprintUnlockedItem(EncounterTrackable blueprintTrackable)
 {
     for (int i = 0; i < PickupObjectDatabase.Instance.Objects.Count; i++)
     {
         PickupObject pickupObject = PickupObjectDatabase.Instance.Objects[i];
         if (pickupObject)
         {
             EncounterTrackable encounterTrackable = pickupObject.encounterTrackable;
             if (encounterTrackable)
             {
                 string itemkey = encounterTrackable.journalData.PrimaryDisplayName;
                 if (itemkey.Equals(blueprintTrackable.journalData.PrimaryDisplayName, StringComparison.OrdinalIgnoreCase))
                 {
                     string itemkey2 = encounterTrackable.journalData.NotificationPanelDescription;
                     if (itemkey2.Equals(blueprintTrackable.journalData.NotificationPanelDescription, StringComparison.OrdinalIgnoreCase))
                     {
                         string itemkey3 = encounterTrackable.journalData.AmmonomiconFullEntry;
                         if (itemkey3.Equals(blueprintTrackable.journalData.AmmonomiconFullEntry, StringComparison.OrdinalIgnoreCase))
                         {
                             string sprite = encounterTrackable.journalData.AmmonomiconSprite;
                             if (sprite.Equals(blueprintTrackable.journalData.AmmonomiconSprite, StringComparison.OrdinalIgnoreCase))
                             {
                                 return(pickupObject);
                             }
                         }
                     }
                 }
             }
         }
     }
     return(null);
 }
示例#3
0
    private void onNewLabel(DefaultLabelController labelController, EncounterTrackable encounter,
                            PickupObject item)
    {
        if (ITEM_BLACKLIST.Contains(item.PickupObjectId))
        {
            return;
        }

        // add padding fix behaviour that only updates position and not the padding
        labelController.gameObject.AddComponent <PositionUpdater>();

        // Text change
        var newText = labelController.label.Text;

        newText += SEPARATOR_TEXT;
        newText += getTextForPage(labelController, encounter, item);
        labelController.label.Text = newText;

        // Layouting
        labelController.enabled          = false;
        labelController.label.TextScale  = 2f;
        labelController.label.AutoHeight = true;
        labelController.label.WordWrap   = true;
        labelController.label.Width      = Screen.width / 3f;
        labelController.label.Padding    = new RectOffset(6, 6, 0, 0);
        labelController.label.Invalidate();
        labelController.panel.FitToContents();
        labelController.panel.Invalidate();
        labelController.Trigger();
    }
示例#4
0
        public static void SetupUnlockOnFlag(this PickupObject self, GungeonFlags flag, bool requiredFlagValue) //thanks SpAPI
        {
            EncounterTrackable encounterTrackable = self.encounterTrackable;
            bool flag2 = encounterTrackable.prerequisites == null;

            if (flag2)
            {
                encounterTrackable.prerequisites    = new DungeonPrerequisite[1];
                encounterTrackable.prerequisites[0] = new DungeonPrerequisite
                {
                    prerequisiteType = DungeonPrerequisite.PrerequisiteType.FLAG,
                    requireFlag      = requiredFlagValue,
                    saveFlagToCheck  = flag
                };
            }
            else
            {
                encounterTrackable.prerequisites = encounterTrackable.prerequisites.Concat(new DungeonPrerequisite[]
                {
                    new DungeonPrerequisite
                    {
                        prerequisiteType = DungeonPrerequisite.PrerequisiteType.FLAG,
                        requireFlag      = requiredFlagValue,
                        saveFlagToCheck  = flag
                    }
                }).ToArray <DungeonPrerequisite>();
            }
            EncounterDatabaseEntry entry = EncounterDatabase.GetEntry(encounterTrackable.EncounterGuid);
            bool flag3 = !string.IsNullOrEmpty(entry.ProxyEncounterGuid);

            if (flag3)
            {
                entry.ProxyEncounterGuid = "";
            }
            bool flag4 = entry.prerequisites == null;

            if (flag4)
            {
                entry.prerequisites    = new DungeonPrerequisite[1];
                entry.prerequisites[0] = new DungeonPrerequisite
                {
                    prerequisiteType = DungeonPrerequisite.PrerequisiteType.FLAG,
                    requireFlag      = requiredFlagValue,
                    saveFlagToCheck  = flag
                };
            }
            else
            {
                entry.prerequisites = entry.prerequisites.Concat(new DungeonPrerequisite[]
                {
                    new DungeonPrerequisite
                    {
                        prerequisiteType = DungeonPrerequisite.PrerequisiteType.FLAG,
                        requireFlag      = requiredFlagValue,
                        saveFlagToCheck  = flag
                    }
                }).ToArray <DungeonPrerequisite>();
            }
        }
示例#5
0
        /// <summary>
        /// Creates a new <c>EncounterDatabaseEntry</c>.
        /// </summary>
        /// <returns>The new encounter database entry.</returns>
        /// <param name="enc_track">Encounter trackable object.</param>
        /// <param name="path">String to set as the asset path.</param>
        public static EncounterDatabaseEntry CreateEncounterDatabaseEntry(EncounterTrackable enc_track, string path)
        {
            var enc_entry = new EncounterDatabaseEntry(enc_track);

            enc_entry.path      = path;
            enc_entry.unityGuid = enc_entry.myGuid = enc_track.EncounterGuid;

            return(enc_entry);
        }
        public new void OnEnteredRange(PlayerController interactor)
        {
            if (!this)
            {
                return;
            }
            SpriteOutlineManager.RemoveOutlineFromSprite(base.sprite, false);
            SpriteOutlineManager.AddOutlineToSprite(base.sprite, Color.white);
            Vector3            offset    = new Vector3(base.sprite.GetBounds().max.x + 0.1875f, base.sprite.GetBounds().min.y, 0f);
            EncounterTrackable component = this.item.GetComponent <EncounterTrackable>();
            string             arg       = (!(component != null)) ? this.item.DisplayName : component.journalData.GetPrimaryDisplayName(false);
            string             text      = this.ModifiedPrice.ToString();

            if (this.m_baseParentShop != null)
            {
                if (this.CurrencyType == CustomShopItemController.ShopCurrencyType.META_CURRENCY)
                {
                    text += "[sprite \"hbux_text_icon\"]";
                }
                else if (this.CurrencyType == CustomShopItemController.ShopCurrencyType.COINS)
                {
                    text += "[sprite \"ui_coin\"]";
                }
                else if (this.CurrencyType == CustomShopItemController.ShopCurrencyType.KEYS)
                {
                    text += "[sprite \"ui_key\"]";
                }
                else if (this.CurrencyType == CustomShopItemController.ShopCurrencyType.BLANKS)
                {
                    text += "[sprite \"ui_blank\"]";
                }
                else if (this.CurrencyType == CustomShopItemController.ShopCurrencyType.CUSTOM)
                {
                    text += "[sprite \"" + customPriceSprite + "\"]";
                }
                else
                {
                    text += "[sprite \"ui_coin\"]";
                }
            }
            string text2;

            if ((this.m_baseParentShop && (this.m_baseParentShop.IsCapableOfBeingStolenFrom) || interactor.IsCapableOfStealing) && this.m_baseParentShop.canBeRobbed)
            {
                text2 = string.Format("[color red]{0}: {1} {2}[/color]", arg, text, StringTableManager.GetString("#STEAL"));
            }
            else
            {
                text2 = string.Format("{0}: {1}", arg, text);
            }
            GameObject gameObject          = GameUIRoot.Instance.RegisterDefaultLabel(base.transform, offset, text2);
            dfLabel    componentInChildren = gameObject.GetComponentInChildren <dfLabel>();

            componentInChildren.ColorizeSymbols = false;
            componentInChildren.ProcessMarkup   = true;
        }
 public void Interact(PlayerController player)
 {
     if (player != null)
     {
         GameObject         gameObject = UnityEngine.Object.Instantiate <GameObject>(ETGMod.Databases.Items["TakeableEnemy"].gameObject, Vector2.zero, Quaternion.identity);
         TakeableEnemy      component  = gameObject.GetComponent <TakeableEnemy>();
         EncounterTrackable component2 = component.GetComponent <EncounterTrackable>();
         if (component2 != null)
         {
             component2.DoNotificationOnEncounter = false;
         }
         component.suppressPickupVFX = true;
         component.Pickup(player);
         component.enemyguid = base.aiActor.EnemyGuid;
         component.DelayedInitialization();
         component.sprite.SetSprite(base.sprite.Collection, base.sprite.spriteId);
         component.encounterTrackable.journalData.PrimaryDisplayName           = base.encounterTrackable.journalData.PrimaryDisplayName;
         component.encounterTrackable.journalData.NotificationPanelDescription = base.encounterTrackable.journalData.NotificationPanelDescription;
         component.encounterTrackable.journalData.AmmonomiconFullEntry         = base.encounterTrackable.journalData.AmmonomiconFullEntry;
         Destroy(base.gameObject);
     }
 }
示例#8
0
    private string getTextForPage(DefaultLabelController labelController, EncounterTrackable encounter,
                                  PickupObject item)
    {
        string pageDescription;
        string text = "";

        var itemDictSuccess = NoBrain.jsonItemDict.TryGetValue(item.PickupObjectId, out var noBrainJsonItem);

        var passiveActiveString = item is PassiveItem ? "Passive" : "Active";

        text = "[color #7d7d7d]";
        if (NoBrain.SHOW_ITEM_IDS)
        {
            text += " " + item.PickupObjectId;
        }
        text += " " + item.quality.getUISpriteString()
                + " " + passiveActiveString
                + "[/color]";

        if (currentPage == PAGE_AMMO || !itemDictSuccess)
        {
            pageDescription = "Ammonomicon";
            var ammonomiconFullEntry = encounter.journalData.GetAmmonomiconFullEntry(false, false);
            if (ammonomiconFullEntry.Length > 0)
            {
                text += "\n[color #a0a0a0]" + ammonomiconFullEntry.TrimEnd()
                        + "[/color]";
            }
        }
        else if (currentPage == PAGE_DESC)
        {
            pageDescription = "Description";
            text           += "\n[color #a0a0a0]" + noBrainJsonItem.desc + "[/color]";
        }
        else if (currentPage == PAGE_STATS)
        {
            pageDescription = "Stats";
            text           += "\n[color #a0a0a0]" + noBrainJsonItem.stats + "[/color]";
        }
        else if (currentPage == PAGE_SYNERGIES)
        {
            pageDescription = "Synergies";
            var synergySuccess = NoBrain.synergyDict.TryGetValue(item.PickupObjectId, out var synergyList);
            if (synergySuccess)
            {
                foreach (var advancedSynergyEntry in synergyList)
                {
                    var mandatoryItemString = advancedSynergyEntry.getMandatoryString();
                    var optionalItemString  = advancedSynergyEntry.getOptionalString();
                    text += "\n[color #98FAFF]" + advancedSynergyEntry.getName()
                            + "[/color] " + advancedSynergyEntry.NumberObjectsRequired
                            + " of (" + mandatoryItemString + ") [" + optionalItemString + "]";
                }
                text += "";
            }
            else
            {
                text = "\nNo Synergies found.";
            }
        }
        else
        {
            pageDescription = "ERROR";
            text            = "INVALID PAGE";
        }

        if (!itemDictSuccess)
        {
            // skip footer, only one page available
            return(text);
        }

        return(text + "\n[color #3f704d]" + pageDescription + "(" + (currentPage + 1) + "/"
               + PAGE_LENGTH + ") Press " + reloadSpriteTag + "[/color]");
    }
示例#9
0
 /// <summary>
 /// Adds a new translation for <paramref name="track"/>'s long description.
 /// </summary>
 /// <param name="track">The <see cref="EncounterTrackable"/> to add the translation to.</param>
 /// <param name="language">The language to which the translation will be applied.</param>
 /// <param name="translation">The translated text.</param>
 public static void TranslateLongDescription(this EncounterTrackable track, StringTableManager.GungeonSupportedLanguages language, string translation)
 {
     AddTranslation(language, track.journalData.AmmonomiconFullEntry, translation, StringTableType.Items);
 }
示例#10
0
 /// <summary>
 /// Adds a new translation for <paramref name="track"/>'s short description.
 /// </summary>
 /// <param name="track">The <see cref="EncounterTrackable"/> to add the translation to.</param>
 /// <param name="language">The language to which the translation will be applied.</param>
 /// <param name="translation">The translated text.</param>
 public static void TranslateShortDescription(this EncounterTrackable track, StringTableManager.GungeonSupportedLanguages language, string translation)
 {
     AddTranslation(language, track.journalData.NotificationPanelDescription, translation, StringTableType.Items);
 }
示例#11
0
 /// <summary>
 /// Adds a new translation for <paramref name="track"/>'s name.
 /// </summary>
 /// <param name="track">The <see cref="EncounterTrackable"/> to add the translation to.</param>
 /// <param name="language">The language to which the translation will be applied.</param>
 /// <param name="translation">The translated text.</param>
 public static void TranslateName(this EncounterTrackable track, StringTableManager.GungeonSupportedLanguages language, string translation)
 {
     AddTranslation(language, track.journalData.PrimaryDisplayName, translation, StringTableType.Items);
 }
示例#12
0
        public override void Start()
        {
            try
            {
                FakePrefabHooks.Init();
                ItemBuilder.Init();
                PlayerEventAdder.Init();
                UnlockHookInators.AddHooks();

                MagmaticBlood.Init();
                MimicSkin.Init();             //Added to the doc
                SaplingBullets.Init();        //Added to the doc
                SlightlyLargerBullets.Init(); //Added to the doc
                WarriorsSyringe.Init();       //Added to the doc
                VultureFeather.Init();        //Added to the doc
                StraponRPG.Init();            //Added to the doc
                Jeremy.Init();                //Added to the doc
                Gasoline.Init();              //Added to the doc
                CatSnack.Init();              //Added to the doc
                ClassicCatSnack.Init();
                JunkSynthesizer.Init();

                WyrmBlood.Init(); //Added to the doc

                //GreenCandy.Init();
                //KeyCandy.Init();
                //GoldenCandy.Init();
                //BlueCandy.Init();
                //RedCandy.Init();
                //HeartCandy.Init();
                //MonsterCandy.Init();
                ImprovedCandies.CandiesInit();
                ImprovedCandies.PositiveEffectsInit();
                //TrickOTreater.Init(); //Added to the doc

                BlackSkull.Init();
                StoneSword.Init();
                StoneAmmolet.Init();
                Randy.Init();

                BeeGun.Add();
                //BloodyCannon.Add();
                //WindStaff.Add();
                RedAndWhite.Add();
                RoyalShotgun.Add();
                //Shotstool.Add();
                RescueRanger.Add();
                NuclearShotgun.Add();
                NuclearAmmoPickup.Init();
                SweeperGun.Add();
                MaliciousRailcannon.Add();
                Superbug.Add();

                PetrifyingMirror.Init();
                EnchantedTome.Init();
                BronzeKey.Init();
                StackOfCash.Init();
                ExecutionShells.Init();
                BloodBullets.Init();
                HoodedShells.Init();
                ClockworkCog.Init();
                HighPriestCloak.Init();
                LuckyCoin.Init();
                LuckyHorseshoe.Init();
                ToxicFungus.Init();
                PurpleGuonStone.Init();
                GarbageBin.Init();
                ColdAmmo.Init();
                MaidenPlating.Init();
                PlagueBullets.Init();
                CrownOfBlood.Init();
                GalacticChest.Init();
                Bravery.Init();
                RaidersAxe.Init();
                BulletSynthesizer.Init();
                ElectricRounds.Init();
                ThunderRounds.Init();
                ToxicHoneycomb.Init();

                BoomerangBullets.Init();
                OilyGreaves.Init();
                ShadyChest.Init();
                //CandyBag.Init();
                MinerHelmet.Init();
                Depthmeter.Init();
                Smore.Init();
                KeyDoubler.Init();
                BlankDoubler.Init();
                CursedCandle.Init();
                MyNameIsYoshikageKira.Init();
                MythrilBullets.Init();
                Charcoal.Init();
                CodexUmbra.Init();
                BloodyDice.Init();
                StarFruit.Init();
                HeartyKey.Init();
                DeadlyKnife.Init();
                Overloader.Init();
                Sushi.Init();
                AmmoEnhancer.Init();
                BanditHat.Init();
                Ushanka.Init();
                BigBoom.Init();
                Seashell.Init();
                //GoldenBox.Init();
                CobaltCoin.Init();

                RingOfWealth.Init();
                QuartzCrystal.Init();
                DeadRinger.Init();
                RoyalCapacitator.Init();
                Cookbook.Init();
                ParrotsFeather.Init();

                Soulbauble.Init();
                FlameWisp.Init();

                CatsEye.Init();
                GunPermit.Init();
                DormantStabiliser.Init();
                CaveCarrot.Init();

                BlueAlbum.Init();

                DoubleABattery.Init();
                ScarecrowsHead.Init();
                OnyxBracelet.Init();
                LemonPig.Init();

                IfritsHorn.Init();
                EnderHelmet.Init();
                BabyGoodRobot.Init();
                CaptainsBrooch.Init();
                SoulInator.Init();

                TwoOfHearts.Init();
                ParasiticFungus.Init();
                ExperimentalRocketLauncher.Init();

                AbyssalShield.Init();

                //Coil.Init();

                //Restock.Init();
                //ChainOfBeing.Init();
                //RangeCrystal.Init();
                //BloodyLockpick.Init();
                //Bitey.Init();
                //JestersHat.Init();
                //PrismaticLexicon.Init();
                //GhoulBullets.Init();

                IncubusStartingPassive.Init();
                IncubusStartingActive.Init();

                /*BlueExplosive.Init();
                 * RedExplosive.Init();
                 * WhiteExplosive.Init();
                 * SwarmSneak.Init();
                 * YVSwarmPickup.Init();
                 * WhiteDamageUp.Init();
                 * Drone.Init();*/

                ETGModConsole.Commands.AddGroup("psmdebug", delegate(string[] args)
                {
                    Log("Please specify a command.", TEXT_COLOR);
                });
                ETGModConsole.Commands.GetGroup("psmdebug").AddUnit("guaranteeproc", delegate(string[] args)
                {
                    DebugChance = !DebugChance;
                    Log($"Guarantee Proc is now: {DebugChance}", TEXT_COLOR);
                });
                ETGModConsole.Commands.GetGroup("psmdebug").AddUnit("unlocks", delegate(string[] args)
                {
                    int totalItems            = 0;
                    int unlockedItems         = 0;
                    List <PickupObject> list  = new List <PickupObject>();
                    List <PickupObject> list2 = new List <PickupObject>();
                    foreach (PickupObject item in ItemBuilder.AddedItems)
                    {
                        EncounterTrackable trolling = item.GetComponent <EncounterTrackable>();
                        if (trolling && trolling.prerequisites != null && trolling.prerequisites.Length > 0)
                        {
                            totalItems++;
                            if (trolling.PrerequisitesMet())
                            {
                                unlockedItems++;
                                list2.Add(item);
                            }
                            else
                            {
                                list.Add(item);
                            }
                        }
                    }
                    Log($"Unlocked: {unlockedItems}/{totalItems}", TEXT_COLOR);
                    if (list2.Count > 0)
                    {
                        Log("Items Unlocked:", TEXT_COLOR);
                        foreach (PickupObject item in list2)
                        {
                            Log(item.name, TEXT_COLOR);
                        }
                    }
                    if (list.Count > 0)
                    {
                        Log("Items Left:", TEXT_COLOR);
                        foreach (PickupObject item in list)
                        {
                            Log($"{item.name}: {Unlocks[item.PickupObjectId]}", TEXT_COLOR);
                        }
                    }
                });
                ETGModConsole.Commands.GetGroup("psmdebug").AddUnit("getcustommaximums", delegate(string[] args)
                {
                    Log($"Most Damage Had: {DaveAPIManager.GetPlayerMaximum(CustomTrackedMaximums.MAXIMUM_DAMAGE)}", TEXT_COLOR);
                    Log($"Most Health Had: {DaveAPIManager.GetPlayerMaximum(CustomTrackedMaximums.MAXIMUM_HEALTH)}", TEXT_COLOR);
                    Log($"Most Money Had: {DaveAPIManager.GetPlayerMaximum(CustomTrackedMaximums.MOST_MONEY)}", TEXT_COLOR);
                });
            }
            catch (Exception ex)
            {
                itemsLoad = $"{ex}";
            }

            ETGMod.StartGlobalCoroutine(IfOtherModsExist());
        }
        public static IEnumerator HandleOpenAmmonomiconHook(Action <AmmonomiconController, bool, bool, EncounterTrackable> orig, AmmonomiconController self, bool isDeath, bool isShortAnimation, EncounterTrackable targetTrackable)
        {
            List <AmmonomiconFrameDefinition> TargetAnimationFrames = self.OpenAnimationFrames;

            if (!isShortAnimation || isDeath)
            {
                if (isShortAnimation)
                {
                    TargetAnimationFrames = new List <AmmonomiconFrameDefinition>();
                    for (int i = 0; i < 9; i++)
                    {
                        TargetAnimationFrames.Add(self.OpenAnimationFrames[i]);
                    }
                    for (int j = 23; j < self.OpenAnimationFrames.Count; j++)
                    {
                        TargetAnimationFrames.Add(self.OpenAnimationFrames[j]);
                    }
                    AkSoundEngine.PostEvent("Play_UI_ammonomicon_open_01", self.gameObject);
                }
                else
                {
                    AkSoundEngine.PostEvent("Play_UI_ammonomicon_intro_01", self.gameObject);
                }

                float animationTime     = (float)GetAnimationLength.Invoke(self, new object[] { TargetAnimationFrames });
                float elapsed           = 0f;
                int   currentFrameIndex = 0;
                float nextFrameTime     = TargetAnimationFrames[0].frameTime * (float)GLOBAL_ANIMATION_SCALE.GetValue(self);
                SetFrame.Invoke(self, new object[] { TargetAnimationFrames[0] });
                while (elapsed < animationTime)
                {
                    elapsed += GameManager.INVARIANT_DELTA_TIME;
                    if (elapsed >= animationTime)
                    {
                        break;
                    }
                    if (elapsed >= nextFrameTime)
                    {
                        currentFrameIndex++;
                        nextFrameTime += TargetAnimationFrames[currentFrameIndex].frameTime * (float)GLOBAL_ANIMATION_SCALE.GetValue(self);
                        SetFrame.Invoke(self, new object[] { TargetAnimationFrames[currentFrameIndex] });
                    }
                    while (!((bool)m_applicationFocus.GetValue(self)))
                    {
                        yield return(null);
                    }
                    yield return(null);
                }
            }

            SetFrame.Invoke(self, new object[] { TargetAnimationFrames[TargetAnimationFrames.Count - 1] });
            if (isDeath)
            {
                ((AmmonomiconInstanceManager)m_AmmonomiconInstance.GetValue(self)).OpenDeath();
            }
            else
            {
                ((AmmonomiconInstanceManager)m_AmmonomiconInstance.GetValue(self)).Open();
            }

            if (targetTrackable != null)
            {
                AmmonomiconPokedexEntry pokedexEntry = self.CurrentLeftPageRenderer.GetPokedexEntry(targetTrackable);
                if (pokedexEntry != null)
                {
                    Debug.Log("GET INFO SUCCESS");
                    pokedexEntry.ForceFocus();
                }
            }
            m_isPageTransitioning.SetValue(self, false);
            HandleQueuedUnlocks.Invoke(self, new object[] { });
            yield break;
        }
示例#14
0
        public static void SetupUnlockOnStat(this PickupObject self, TrackedStats stat, DungeonPrerequisite.PrerequisiteOperation operation, int comparisonValue)
        {
            EncounterTrackable encounterTrackable = self.encounterTrackable;
            bool flag = encounterTrackable.prerequisites == null;

            if (flag)
            {
                encounterTrackable.prerequisites    = new DungeonPrerequisite[1];
                encounterTrackable.prerequisites[0] = new DungeonPrerequisite
                {
                    prerequisiteType      = DungeonPrerequisite.PrerequisiteType.COMPARISON,
                    prerequisiteOperation = operation,
                    statToCheck           = stat,
                    comparisonValue       = (float)comparisonValue
                };
            }
            else
            {
                encounterTrackable.prerequisites = encounterTrackable.prerequisites.Concat(new DungeonPrerequisite[]
                {
                    new DungeonPrerequisite
                    {
                        prerequisiteType      = DungeonPrerequisite.PrerequisiteType.COMPARISON,
                        prerequisiteOperation = operation,
                        statToCheck           = stat,
                        comparisonValue       = (float)comparisonValue
                    }
                }).ToArray <DungeonPrerequisite>();
            }
            EncounterDatabaseEntry entry = EncounterDatabase.GetEntry(encounterTrackable.EncounterGuid);
            bool flag2 = !string.IsNullOrEmpty(entry.ProxyEncounterGuid);

            if (flag2)
            {
                entry.ProxyEncounterGuid = "";
            }
            bool flag3 = entry.prerequisites == null;

            if (flag3)
            {
                entry.prerequisites    = new DungeonPrerequisite[1];
                entry.prerequisites[0] = new DungeonPrerequisite
                {
                    prerequisiteType      = DungeonPrerequisite.PrerequisiteType.COMPARISON,
                    prerequisiteOperation = operation,
                    statToCheck           = stat,
                    comparisonValue       = (float)comparisonValue
                };
            }
            else
            {
                entry.prerequisites = entry.prerequisites.Concat(new DungeonPrerequisite[]
                {
                    new DungeonPrerequisite
                    {
                        prerequisiteType      = DungeonPrerequisite.PrerequisiteType.COMPARISON,
                        prerequisiteOperation = operation,
                        statToCheck           = stat,
                        comparisonValue       = (float)comparisonValue
                    }
                }).ToArray <DungeonPrerequisite>();
            }
        }
 private static void WindowFunction(int windowID)
 {
     if (windowID == 0)
     {
         GUILayout.BeginArea(new Rect(5f, 15f, 290f, 400f));
         GUILayout.Label(string.Format("Current Actor Name: {0}", GameManager.Instance.PrimaryPlayer.ActorName), new GUILayoutOption[0]);
         GUILayout.Label(string.Format("Current Gun Name: {0}", GameManager.Instance.PrimaryPlayer.CurrentGun.name), new GUILayoutOption[0]);
         if (GUILayout.Button(string.Format("Stealthed {0}", GameManager.Instance.PrimaryPlayer.IsStealthed ? "On" : "Off"), new GUILayoutOption[0]))
         {
             if (GameManager.Instance.PrimaryPlayer.IsStealthed)
             {
                 GameManager.Instance.PrimaryPlayer.gameActor.SetIsStealthed(false, "box");
             }
             else
             {
                 GameManager.Instance.PrimaryPlayer.gameActor.SetIsStealthed(true, "box");
             }
         }
         if (GUILayout.Button(string.Format("Clear Floor", new object[0]), new GUILayoutOption[0]))
         {
             GameManager.Instance.Dungeon.FloorCleared();
         }
         if (GUILayout.Button(string.Format("Heal All Players", new object[0]), new GUILayoutOption[0]))
         {
             for (int i = 0; i < GameManager.Instance.AllPlayers.Length; i++)
             {
                 if (GameManager.Instance.AllPlayers[i].healthHaver.IsAlive)
                 {
                     GameManager.Instance.AllPlayers[i].healthHaver.FullHeal();
                 }
             }
         }
         if (GUILayout.Button(string.Format("Change to Random Gun", new object[0]), new GUILayoutOption[0]))
         {
             GameManager.Instance.PrimaryPlayer.inventory.AddGunToInventory(PickupObjectDatabase.GetRandomGun(), true);
         }
         if (GUILayout.Button(string.Format("Add 100 currency", new object[0]), new GUILayoutOption[0]))
         {
             GameStatsManager.Instance.RegisterStatChange(TrackedStats.META_CURRENCY, 100f);
             GameManager.Instance.PrimaryPlayer.carriedConsumables.Currency += 100;
         }
         if (GUILayout.Button(string.Format("Unlimited Ammo {0}", ModMenu.unlimAmmo ? "On" : "Off"), new GUILayoutOption[0]))
         {
             ModMenu.unlimAmmo = !ModMenu.unlimAmmo;
         }
         if (GUILayout.Button(string.Format("Destroy Enemy Bullets", new object[0]), new GUILayoutOption[0]))
         {
             SilencerInstance.DestroyBulletsInRange(GameManager.Instance.PrimaryPlayer.transform.PositionVector2(), 100f, true, false, null, false, null, false, null);
         }
         if (GUILayout.Button(string.Format("Teleport Hax {0}", ModMenu.teleportHax ? "On" : "Off"), new GUILayoutOption[0]))
         {
             ModMenu.teleportHax = !ModMenu.teleportHax;
         }
         if (GUILayout.Button(string.Format("Spawn Currency", new object[0]), new GUILayoutOption[0]))
         {
             LootEngine.SpawnCurrency(GameManager.Instance.PrimaryPlayer.CenterPosition, 1000, false);
         }
         if (GUILayout.Button(string.Format("Can always steal {0}", ModMenu.canAlwaysSteal ? "On" : "Off"), new GUILayoutOption[0]))
         {
             ModMenu.canAlwaysSteal = !ModMenu.canAlwaysSteal;
         }
         if (GUILayout.Button(string.Format("Add Ammo Automatically {0}", ModMenu.addAmmoAutomatically ? "On" : "Off"), new GUILayoutOption[0]))
         {
             ModMenu.addAmmoAutomatically = !ModMenu.addAmmoAutomatically;
         }
         if (GUILayout.Button(string.Format("Auto Heal {0}", ModMenu.autoHeal ? "On" : "Off"), new GUILayoutOption[0]))
         {
             ModMenu.autoHeal = !ModMenu.autoHeal;
         }
         if (GUILayout.Button(string.Format("Increase Base Ammo", new object[0]), new GUILayoutOption[0]))
         {
             GameManager.Instance.PrimaryPlayer.CurrentGun.SetBaseMaxAmmo(10000);
         }
         GUILayout.EndArea();
     }
     if (windowID == 1)
     {
         GUILayout.BeginArea(new Rect(5f, 15f, 290f, 400f));
         ModMenu.scrollViewVector = GUILayout.BeginScrollView(ModMenu.scrollViewVector, new GUILayoutOption[]
         {
             GUILayout.Width(280f),
             GUILayout.Height(380f)
         });
         if (GameManager.Instance.PrimaryPlayer.inventory.AllGuns != null)
         {
             for (int j = 0; j < GameManager.Instance.PrimaryPlayer.inventory.AllGuns.Count; j++)
             {
                 if (GUILayout.Button(string.Format("Get Ammo for {0}", GameManager.Instance.PrimaryPlayer.inventory.AllGuns[j].DisplayName), ModMenu.BtnStyle, new GUILayoutOption[0]))
                 {
                     GameManager.Instance.PrimaryPlayer.inventory.AllGuns[j].GainAmmo(1000);
                 }
                 GUILayout.Label(string.Concat(new object[]
                 {
                     "Gun Name: ",
                     GameManager.Instance.PrimaryPlayer.inventory.AllGuns[j].name,
                     "\nDisplay Name: ",
                     GameManager.Instance.PrimaryPlayer.inventory.AllGuns[j].DisplayName,
                     "\nGun Ammo: ",
                     GameManager.Instance.PrimaryPlayer.inventory.AllGuns[j].ammo,
                     "\n================"
                 }), new GUILayoutOption[0]);
             }
         }
         GUILayout.EndScrollView();
         GUILayout.EndArea();
     }
     if (windowID == 2)
     {
         GUILayout.BeginArea(new Rect(5f, 15f, 490f, 400f));
         ModMenu.scrollViewVector2 = GUILayout.BeginScrollView(ModMenu.scrollViewVector2, new GUILayoutOption[]
         {
             GUILayout.Width(480f),
             GUILayout.Height(380f)
         });
         int count = PickupObjectDatabase.Instance.Objects.Count;
         for (int k = 0; k < PickupObjectDatabase.Instance.Objects.Count; k++)
         {
             if (PickupObjectDatabase.Instance.Objects[k] != null && PickupObjectDatabase.Instance.Objects[k] is Gun)
             {
                 EncounterTrackable component = PickupObjectDatabase.Instance.Objects[k].GetComponent <EncounterTrackable>();
                 if (component && component.PrerequisitesMet())
                 {
                     if (GUILayout.Button(string.Format("Add {0} to your Inventory", PickupObjectDatabase.Instance.Objects[k].DisplayName), ModMenu.BtnStyle, new GUILayoutOption[0]))
                     {
                         GameManager.Instance.PrimaryPlayer.inventory.AddGunToInventory(PickupObjectDatabase.Instance.Objects[k] as Gun, true);
                     }
                     GUILayout.Label(string.Concat(new object[]
                     {
                         "Gun Name: ",
                         PickupObjectDatabase.Instance.Objects[k].name,
                         "\nDisplay Name: ",
                         PickupObjectDatabase.Instance.Objects[k].DisplayName,
                         "\nItem Quality: ",
                         PickupObjectDatabase.Instance.Objects[k].quality.ToString(),
                         "\n================"
                     }), new GUILayoutOption[0]);
                 }
             }
         }
         GUILayout.EndScrollView();
         GUILayout.EndArea();
     }
     if (windowID == 3)
     {
         GUILayout.BeginArea(new Rect(5f, 15f, 490f, 400f));
         ModMenu.scrollViewVector3 = GUILayout.BeginScrollView(ModMenu.scrollViewVector3, new GUILayoutOption[]
         {
             GUILayout.Width(480f),
             GUILayout.Height(380f)
         });
         for (int l = 0; l < PickupObjectDatabase.Instance.Objects.Count; l++)
         {
             if (PickupObjectDatabase.Instance.Objects[l] != null && PickupObjectDatabase.Instance.Objects[l] is PassiveItem)
             {
                 EncounterTrackable component2 = PickupObjectDatabase.Instance.Objects[l].GetComponent <EncounterTrackable>();
                 if (component2 && component2.PrerequisitesMet())
                 {
                     if (GUILayout.Button(string.Format("Add {0} to your Inventory", PickupObjectDatabase.Instance.Objects[l].DisplayName), ModMenu.BtnStyle, new GUILayoutOption[0]))
                     {
                         GameManager.Instance.PrimaryPlayer.AcquirePassiveItem(PickupObjectDatabase.Instance.Objects[l] as PassiveItem);
                     }
                     GUILayout.Label(string.Concat(new object[]
                     {
                         "Item Name: ",
                         PickupObjectDatabase.Instance.Objects[l].name,
                         "\nDisplay Name: ",
                         PickupObjectDatabase.Instance.Objects[l].DisplayName,
                         "\n================"
                     }), new GUILayoutOption[0]);
                 }
             }
         }
         GUILayout.EndScrollView();
         GUILayout.EndArea();
     }
 }
示例#16
0
        private static void BuildWestBrosBossPrefab(AssetBundle assetBundle, out GameObject outObject, WestBros whichBro, bool isSmiley, tk2dSpriteCollectionData sourceSpriteCollection, tk2dSpriteAnimation sourceAnimations, bool keepIntroDoer = false)
        {
            GameObject prefab = ExpandCustomEnemyDatabase.GetOfficialEnemyByGuid(isSmiley
                ? "ea40fcc863d34b0088f490f4e57f8913"              // Smiley
                : "c00390483f394a849c36143eb878998f").gameObject; // Shades

            outObject = UnityEngine.Object.Instantiate(prefab, Vector3.zero, Quaternion.identity);

            try
            {
                string name = $"West Bros {whichBro}";

                outObject.SetActive(false);
                outObject.name = name;

                AIActor actor = outObject.GetComponent <AIActor>();

                actor.healthHaver.overrideBossName = "Western Bros";

                actor.EnemyId   = UnityEngine.Random.Range(100000, 999999);
                actor.ActorName = name;

                EncounterTrackable Encounterable = outObject.GetComponent <EncounterTrackable>();

                switch (whichBro)
                {
                case WestBros.Angel:
                    actor.EnemyGuid             = "275354563e244f558be87fcff4b07f9f";
                    Encounterable.EncounterGuid = "7d6e1faf682d4402b29535020313f383";
                    break;

                case WestBros.Nome:
                    actor.EnemyGuid             = "3a1a33a905bb4b669e7d798f20674c4c";
                    Encounterable.EncounterGuid = "78cb8889dc884dd9b3aafe64558d858e";
                    break;

                case WestBros.Tuc:
                    actor.EnemyGuid             = "d2e7ea9ea9a444cebadd3bafa0832cd1";
                    Encounterable.EncounterGuid = "1df53371ce084dafb46f6bcd5a6c1c5f";
                    break;
                }

                // TODO at some distant point in time
                Encounterable.journalData.PrimaryDisplayName           = name;
                Encounterable.journalData.NotificationPanelDescription = name;
                Encounterable.journalData.AmmonomiconFullEntry         = name;

                // x BroController
                // x BulletBroDeathController
                // x BulletBrosIntroDoer
                // x BulletBroSeekTargetBehavior // movement behaviour
                //   BulletBroRepositionBehavior // completely unused

                var oldBroController = outObject.GetComponent <BroController>();
                var newBroController = outObject.AddComponent <ExpandWesternBroController>();

                newBroController.enrageAnim          = oldBroController.enrageAnim;
                newBroController.enrageAnimTime      = oldBroController.enrageAnimTime;
                newBroController.enrageHealToPercent = oldBroController.enrageHealToPercent;
                newBroController.overheadVfx         = oldBroController.overheadVfx;
                newBroController.postEnrageMoveSpeed = oldBroController.postEnrageMoveSpeed;

                newBroController.whichBro = whichBro;
                newBroController.postSecondEnrageMoveSpeed = newBroController.postEnrageMoveSpeed;

                UnityEngine.Object.Destroy(oldBroController);

                UnityEngine.Object.Destroy(outObject.GetComponent <BulletBroDeathController>());
                outObject.AddComponent <ExpandWesternBroDeathController>();

                var newMovementBehavior = new ExpandWesternBroSeekTargetBehavior();
                var oldMovementBehavior = actor.behaviorSpeculator.MovementBehaviors.First() as BulletBroSeekTargetBehavior;

                newMovementBehavior.CustomRange     = oldMovementBehavior.CustomRange;
                newMovementBehavior.PathInterval    = oldMovementBehavior.PathInterval;
                newMovementBehavior.StopWhenInRange = oldMovementBehavior.StopWhenInRange;

                actor.behaviorSpeculator.MovementBehaviors = new List <MovementBehaviorBase>()
                {
                    newMovementBehavior
                };

                // only smiley has a bossIntroDoer, so the stuff after this would null reference if done with shade
                if (isSmiley)
                {
                    if (!keepIntroDoer)
                    {
                        UnityEngine.Object.Destroy(outObject.GetComponent <BulletBrosIntroDoer>());
                        UnityEngine.Object.Destroy(outObject.GetComponent <GenericIntroDoer>());
                    }
                    else
                    {
                        // BulletBrosIntroDoer is a SpecificIntroDoer; it does not inherent from GenericIntroDoer, it requires it to be present
                        BulletBrosIntroDoer bulletBrosIntroDoer = outObject.GetComponent <BulletBrosIntroDoer>();

                        // destroy it so we can add our own
                        UnityEngine.Object.Destroy(bulletBrosIntroDoer);

                        GenericIntroDoer genericIntroDoer = outObject.GetComponent <GenericIntroDoer>();

                        genericIntroDoer.portraitSlideSettings.bossNameString     = "Western Bros";
                        genericIntroDoer.portraitSlideSettings.bossSubtitleString = "Triple Tap";
                        genericIntroDoer.portraitSlideSettings.bossQuoteString    = string.Empty;

                        genericIntroDoer.portraitSlideSettings.bossArtSprite = assetBundle.LoadAsset <Texture2D>("WesternBrosBossCard");

                        genericIntroDoer.triggerType     = GenericIntroDoer.TriggerType.PlayerEnteredRoom;
                        genericIntroDoer.OnIntroFinished = () => { };

                        ExpandWesternBroIntroDoer specificIntroDoer = outObject.AddComponent <ExpandWesternBroIntroDoer>();
                    }
                }

                var animationsAsset = assetBundle.LoadAsset <GameObject>($"WestBrosAnimations_{whichBro}");

                List <tk2dSpriteAnimationClip> animationClips = new List <tk2dSpriteAnimationClip>();

                foreach (tk2dSpriteAnimationClip clip in sourceAnimations.clips)
                {
                    if (clip.name.StartsWith($"{whichBro.ToString().ToLower()}_"))
                    {
                        animationClips.Add(ExpandUtility.DuplicateAnimationClip(clip));
                    }
                }

                List <tk2dSpriteAnimationClip> clipsToAdd = new List <tk2dSpriteAnimationClip>();

                foreach (tk2dSpriteAnimationClip clip in animationClips)
                {
                    clip.name = clip.name.Replace($"{whichBro.ToString().ToLower()}_", string.Empty);

                    clip.name = clip.name.Replace("dash_front", "dash_forward");
                    clip.name = clip.name.Replace("move_front", "move_forward");

                    if (clip.name.EndsWith("_prime"))
                    {
                        clip.frames[5].eventAudio   = "Play_ENM_bullet_dash_01";
                        clip.frames[5].triggerEvent = true;
                    }
                    else if (clip.name.StartsWith("move_"))
                    {
                        clip.frames[2].eventAudio   = "PLay_FS_ENM";
                        clip.frames[2].triggerEvent = true;
                    }
                    else if (clip.name == "anger")
                    {
                        // we change the west bros anger animation from a loop to a loop section so the anger SFX only plays once.
                        // to do this we simply clone every frame once and make it loop at the first copied frame.

                        var angerFrames = clip.frames.ToList();

                        foreach (var frame in clip.frames)
                        {
                            tk2dSpriteAnimationFrame clonedFrame = new tk2dSpriteAnimationFrame();

                            ExpandUtility.ReflectionShallowCopyFields(clonedFrame, frame, BindingFlags.Public | BindingFlags.Instance);

                            angerFrames.Add(clonedFrame);
                        }

                        // it's important to do this before changing clip.frames
                        clip.loopStart              = clip.frames.Length;
                        clip.frames                 = angerFrames.ToArray();
                        clip.wrapMode               = tk2dSpriteAnimationClip.WrapMode.LoopSection;
                        clip.frames[0].eventAudio   = "Play_BOSS_bulletbros_anger_01";
                        clip.frames[0].triggerEvent = true;
                    }
                    else if (clip.name == "death_right")
                    {
                        clip.name = "die";

                        tk2dSpriteAnimationClip dieFrontRight = ExpandUtility.DuplicateAnimationClip(clip);
                        dieFrontRight.name = "die_front_right";
                        clipsToAdd.Add(dieFrontRight);
                    }
                    else if (clip.name == "death_left")
                    {
                        clip.name = "die_left";

                        tk2dSpriteAnimationClip dieFrontLeft = ExpandUtility.DuplicateAnimationClip(clip);
                        dieFrontLeft.name = "die_front_left";
                        clipsToAdd.Add(dieFrontLeft);
                    }
                    else if (clip.name == "idle_front")
                    {
                        clip.name = "idle";

                        tk2dSpriteAnimationClip bigShot = ExpandUtility.DuplicateAnimationClip(clip);
                        bigShot.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once;
                        bigShot.name     = "big_shot";
                        clipsToAdd.Add(bigShot);

                        tk2dSpriteAnimationClip charge = ExpandUtility.DuplicateAnimationClip(clip);
                        charge.wrapMode = tk2dSpriteAnimationClip.WrapMode.Loop;
                        charge.name     = "charge";
                        clipsToAdd.Add(charge);

                        // not really necessary since it's nuked from the animator further down
                        tk2dSpriteAnimationClip appear = ExpandUtility.DuplicateAnimationClip(clip);
                        appear.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once;
                        appear.name     = "appear";
                        clipsToAdd.Add(appear);

                        tk2dSpriteAnimationClip introGunToggle = ExpandUtility.DuplicateAnimationClip(clip);
                        introGunToggle.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once;
                        introGunToggle.name     = "intro2";
                        clipsToAdd.Add(introGunToggle);

                        introGunToggle.frames[0].eventInfo    = "guntoggle";
                        introGunToggle.frames[0].triggerEvent = true;
                    }
                    else if (clip.name == "summon")
                    {
                        clip.name     = "whistle";
                        clip.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once;
                        // the summon vfx don't look right
                        // clip.frames[0].eventVfx = "summon_vfx";
                        // clip.frames[0].triggerEvent = true;
                    }
                    else if (clip.name == "pound")
                    {
                        clip.name = "jump_attack";
                        // Uses modified sound that plays faster on the first half to account for west bros having faster animation.
                        clip.frames[0].eventAudio   = "Play_EX_BOSS_westbros_slam_01";
                        clip.frames[0].triggerEvent = true;
                    }
                    else if (clip.name == "intro")
                    {
                        clip.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once;
                        // this is setup in case we want the intro to continue looping during the boss card instead of the idle animation
                        // requires to change the intro doer so it sets finished to true once it reaches the first loop

                        //if (whichBro == WestBros.Nome)
                        //{
                        //    // nome's intro animation wasn't looping at the end like the others
                        //    var list = clip.frames.ToList();

                        //    list.RemoveAt(20);
                        //    list.RemoveAt(20);

                        //    clip.frames = list.ToArray();

                        //    clip.loopStart = 23;

                        //    clip.frames[23] = clip.frames[0];
                        //    clip.frames[24] = clip.frames[1];
                        //    clip.frames[25] = clip.frames[2];
                        //    clip.frames[26] = clip.frames[3];
                        //}
                        //else if (whichBro == WestBros.Tuc)
                        //{
                        //    // tuc's intro animation was off by one frame compared to the others
                        //    var list = clip.frames.ToList();

                        //    list.RemoveAt(15);

                        //    clip.frames = list.ToArray();

                        //    clip.loopStart = 21;
                        //}
                    }
                }

                animationClips.AddRange(clipsToAdd);

                tk2dSpriteAnimation spriteAnimation = animationsAsset.AddComponent <tk2dSpriteAnimation>();

                spriteAnimation.clips = animationClips.ToArray();

                tk2dSpriteAnimator spriteAnimator = outObject.GetComponent <tk2dSpriteAnimator>();

                spriteAnimator.Library = spriteAnimation;

                tk2dSprite sprite = outObject.GetComponent <tk2dSprite>();
                sprite.SetSprite(sourceSpriteCollection, $"BB_{whichBro.ToString().ToLower()}_idle_front_001");
                sprite.PlaceAtPositionByAnchor(new Vector3(0f, 0f), tk2dBaseSprite.Anchor.LowerCenter);

                AIAnimator animator = outObject.GetComponent <AIAnimator>();
                // removes the 'appear' animation
                animator.OtherAnimations.RemoveAt(0);

                outObject.transform.Find("shadow").localPosition += new Vector3(1.52f, 0.02f, 0);

                var shooter = SetupAIShooter(outObject);
                shooter.handObject = WestBrosHandPrefab.GetComponent <PlayerHandController>();

                DebrisObject hatPrefab = null;

                switch (whichBro)
                {
                case WestBros.Angel:
                    shooter.gunAttachPoint.position = new Vector3(-1.05f, 0.5f);
                    WestBrosAngelGUID = actor.EnemyGuid;
                    hatPrefab         = WestBrosAngelHatPrefab.GetComponent <DebrisObject>();
                    break;

                case WestBros.Nome:
                    shooter.gunAttachPoint.position = new Vector3(-1.05f, 0.4f);
                    WestBrosNomeGUID = actor.EnemyGuid;
                    hatPrefab        = WestBrosNomeHatPrefab.GetComponent <DebrisObject>();
                    break;

                case WestBros.Tuc:
                    shooter.gunAttachPoint.position = new Vector3(-1.05f, 0.5f);
                    WestBrosTucGUID = actor.EnemyGuid;
                    hatPrefab       = WestBrosTucHatPrefab.GetComponent <DebrisObject>();
                    break;
                }

                shooter.equippedGunId = WestBrosRevolverGenerator.GetWestBrosRevolverID(whichBro);

                if (shooter.equippedGunId == -1)
                {
                    ETGModConsole.Log("The West Bros Gun ID should have been set at this point already, but it wasn't. Assigning fallback gun.");
                    shooter.equippedGunId = isSmiley ? 35 : 22;
                }

                var hatLauncher = outObject.GetComponentInChildren <ExplosionDebrisLauncher>();

                // basically changes smiley's debris launcher into shades'
                hatLauncher.specifyArcDegrees = false;
                hatLauncher.minShards         = 1;
                hatLauncher.maxShards         = 1;

                hatLauncher.debrisSources = new DebrisObject[] { hatPrefab };

                // move the ring of bullets spawned by jumping
                var shootPoint = outObject.transform.Find("shoot point");
                shootPoint.position += new Vector3(1.5f, 0);

                // move the actual pixel colliders
                var rigidbody = outObject.GetComponent <SpeculativeRigidbody>();

                foreach (var item in rigidbody.PixelColliders)
                {
                    item.ManualOffsetX = 32;
                    item.Regenerate(outObject.transform);
                }

                // TODO balance
                actor.healthHaver.ForceSetCurrentHealth(600);
                actor.healthHaver.SetHealthMaximum(600);

                actor.RegenerateCache();

                ExpandCustomEnemyDatabase.AddEnemyToDatabase(outObject, actor.EnemyGuid, true);
                FakePrefab.MarkAsFakePrefab(outObject);
                UnityEngine.Object.DontDestroyOnLoad(outObject);
            }
            catch (Exception e)
            {
                ETGModConsole.Log($"Error setting up the western bro {whichBro}: " + e.ToString());
            }
        }
示例#17
0
        protected override void DoSetup()
        {
            base.m_shopItems = new List <GameObject>();
            List <int> list = new List <int>();
            Func <GameObject, float, float> weightModifier = null;

            if (SecretHandshakeItem.NumActive > 0)
            {
                weightModifier = delegate(GameObject prefabObject, float sourceWeight)
                {
                    PickupObject component10 = prefabObject.GetComponent <PickupObject>();
                    float        num7        = sourceWeight;
                    if (component10 != null)
                    {
                        int quality = (int)component10.quality;
                        num7 *= 1f + (float)quality / 10f;
                    }
                    return(num7);
                };
            }
            bool flag = GameStatsManager.Instance.IsRainbowRun;

            for (int i = 0; i < base.spawnPositions.Length; i++)
            {
                if (flag)
                {
                    base.m_shopItems.Add(null);
                }
                else
                {
                    GameObject gameObject5 = this.shopItems.SubshopSelectByWeightWithoutDuplicatesFullPrereqs(this.m_shopItems, weightModifier, 1, GameManager.Instance.IsSeeded);
                    this.m_shopItems.Add(gameObject5);
                }
            }
            m_itemControllers = new List <ShopItemController>();
            for (int m = 0; m < base.spawnPositions.Length; m++)
            {
                Transform transform = base.spawnPositions[m];
                if (!flag && !(base.m_shopItems[m] == null))
                {
                    PickupObject component4 = base.m_shopItems[m].GetComponent <PickupObject>();
                    if (!(component4 == null))
                    {
                        GameObject gameObject6 = new GameObject("Shop item " + m.ToString());
                        Transform  transform2  = gameObject6.transform;
                        transform2.parent        = transform;
                        transform2.localPosition = Vector3.zero;
                        EncounterTrackable component5 = component4.GetComponent <EncounterTrackable>();
                        if (component5 != null)
                        {
                            GameManager.Instance.ExtantShopTrackableGuids.Add(component5.EncounterGuid);
                        }
                        CustomShopItemController shopItemController = gameObject6.AddComponent <CustomShopItemController>();


                        this.AssignItemFacing(transform, shopItemController);
                        if (!base.m_room.IsRegistered(shopItemController))
                        {
                            base.m_room.RegisterInteractable(shopItemController);
                        }

                        shopItemController.CurrencyType = currencyType;


                        shopItemController.customCanBuy   += CustomCanBuyMethod;
                        shopItemController.customPrice    += CustomPriceMethod;
                        shopItemController.removeCurrency += RemoveCurrencyMethod;

                        shopItemController.OnPurchase += OnPurchaseMethod;
                        shopItemController.OnSteal    += OnStealMethod;

                        shopItemController.customPriceSprite = this.customPriceSprite;

                        shopItemController.Initialize(component4, this);
                        m_itemControllers.Add(shopItemController);
                    }
                }
            }
            bool flag3 = false;

            if (base.shopItemsGroup2 != null && base.spawnPositionsGroup2.Length > 0)
            {
                int count = base.m_shopItems.Count;
                for (int num2 = 0; num2 < base.spawnPositionsGroup2.Length; num2++)
                {
                    if (flag)
                    {
                        base.m_shopItems.Add(null);
                    }
                    else
                    {
                        float num3 = base.spawnGroupTwoItem1Chance;
                        if (num2 == 1)
                        {
                            num3 = base.spawnGroupTwoItem2Chance;
                        }
                        else if (num2 == 2)
                        {
                            num3 = base.spawnGroupTwoItem3Chance;
                        }
                        bool isSeeded = GameManager.Instance.IsSeeded;
                        if (((!isSeeded) ? UnityEngine.Random.value : BraveRandom.GenerationRandomValue()) < num3)
                        {
                            float replaceFirstRewardWithPickup = GameManager.Instance.RewardManager.CurrentRewardData.ReplaceFirstRewardWithPickup;
                            if (!flag3 && ((!isSeeded) ? UnityEngine.Random.value : BraveRandom.GenerationRandomValue()) < replaceFirstRewardWithPickup)
                            {
                                flag3 = true;
                                GameObject item2 = base.shopItems.SelectByWeightWithoutDuplicatesFullPrereqs(base.m_shopItems, weightModifier, GameManager.Instance.IsSeeded);
                                base.m_shopItems.Add(item2);
                            }
                            else if (!GameStatsManager.Instance.IsRainbowRun)
                            {
                                GameObject rewardObjectShopStyle2 = GameManager.Instance.RewardManager.GetRewardObjectShopStyle(GameManager.Instance.PrimaryPlayer, false, false, base.m_shopItems);
                                base.m_shopItems.Add(rewardObjectShopStyle2);
                            }
                            else
                            {
                                base.m_shopItems.Add(null);
                            }
                        }
                        else
                        {
                            base.m_shopItems.Add(null);
                        }
                    }
                }
                for (int num4 = 0; num4 < base.spawnPositionsGroup2.Length; num4++)
                {
                    Transform transform3 = base.spawnPositionsGroup2[num4];
                    if (!flag && !(base.m_shopItems[count + num4] == null))
                    {
                        PickupObject component8 = base.m_shopItems[count + num4].GetComponent <PickupObject>();
                        if (!(component8 == null))
                        {
                            GameObject gameObject8 = new GameObject("Shop 2 item " + num4.ToString());
                            Transform  transform4  = gameObject8.transform;
                            transform4.parent        = transform3;
                            transform4.localPosition = Vector3.zero;
                            EncounterTrackable component9 = component8.GetComponent <EncounterTrackable>();
                            if (component9 != null)
                            {
                                GameManager.Instance.ExtantShopTrackableGuids.Add(component9.EncounterGuid);
                            }
                            CustomShopItemController shopItemController2 = gameObject8.AddComponent <CustomShopItemController>();
                            this.AssignItemFacing(transform3, shopItemController2);
                            if (!base.m_room.IsRegistered(shopItemController2))
                            {
                                base.m_room.RegisterInteractable(shopItemController2);
                            }
                            shopItemController2.Initialize(component8, this);
                            m_itemControllers.Add(shopItemController2);
                        }
                    }
                }
            }

            /*for (int num6 = 0; num6 < m_customShopItemControllers.Count; num6++)
             * {
             *
             *      m_customShopItemControllers[num6].CurrencyType = currencyType;
             *
             *      m_customShopItemControllers[num6].CustomCanBuy += Balls.CustomCanBuy;
             *      m_customShopItemControllers[num6].CustomPrice += Balls.CustomPrice;
             *      m_customShopItemControllers[num6].RemoveCurrency += Balls.RemoveCurrency;
             *      m_customShopItemControllers[num6].customPriceSprite = this.customPriceSprite;
             * }*/
        }