Example #1
0
        private static void ApplyMonsterChanges(ClassicStageInfo self, StageInfo stage)
        {
            var monsters     = self.GetFieldValue <DirectorCardCategorySelection>("monsterCategories");
            var monsterCards = new List <DirectorCardHolder>();

            foreach (var cat in monsters.categories)
            {
                MonsterCategory      monstCat = GetMonsterCategory(cat.name);
                InteractableCategory interCat = GetInteractableCategory(cat.name);
                foreach (var t in cat.cards)
                {
                    monsterCards.Add(new DirectorCardHolder {
                        InteractableCategory = interCat,
                        MonsterCategory      = monstCat,
                        Card = t
                    });
                }
            }
            MonsterActions?.Invoke(monsterCards, stage);
            var monsterBasic = new List <DirectorCard>();
            var monsterSub   = new List <DirectorCard>();
            var monsterChamp = new List <DirectorCard>();

            foreach (var hold in monsterCards)
            {
                switch (hold.MonsterCategory)
                {
                case MonsterCategory.BasicMonsters:
                    monsterBasic.Add(hold.Card);
                    break;

                case MonsterCategory.Champions:
                    monsterChamp.Add(hold.Card);
                    break;

                case MonsterCategory.Minibosses:
                    monsterSub.Add(hold.Card);
                    break;
                }
            }
            for (int i = 0; i < monsters.categories.Length; i++)
            {
                DirectorCardCategorySelection.Category cat = monsters.categories[i];
                switch (cat.name)
                {
                case "Champions":
                    cat.cards = monsterChamp.ToArray();
                    break;

                case "Minibosses":
                    cat.cards = monsterSub.ToArray();
                    break;

                case "Basic Monsters":
                    cat.cards = monsterBasic.ToArray();
                    break;
                }
                monsters.categories[i] = cat;
            }
        }
Example #2
0
            void PopulateScene(On.RoR2.SceneDirector.orig_PopulateScene orig, RoR2.SceneDirector sceneDirector)
            {
                if (Data.modEnabled)
                {
                    sceneDirector.interactableCredit = Mathf.FloorToInt(sceneDirector.interactableCredit * Data.interactableMultiplier);

                    List <SpawnCard> spawnCards     = new List <SpawnCard>();
                    List <string>    spawnCardNames = new List <string>();
                    //spawnCardNames = new List<string>() { "ShrineChance" };
                    //spawnCardNames = new List<string>() { "BrokenDrone1", "BrokenDrone2", "BrokenEmergencyDrone", "BrokenEquipmentDrone", "BrokenFlameDrone", "BrokenMegaDrone", "BrokenMissileDrone", "BrokenTurret1" };
                    //spawnCardNames = new List<string>() { "Duplicator", "DuplicatorLarge", "DuplicatorMilitary", "DuplicatorWild" };
                    //spawnCardNames = new List<string>() { "EquipmentBarrel", "TripleShopEquipment" };

                    RoR2.InteractableSpawnCard[] allInteractables = UnityEngine.Resources.LoadAll <RoR2.InteractableSpawnCard>("SpawnCards/InteractableSpawnCard");
                    foreach (RoR2.InteractableSpawnCard spawnCard in allInteractables)
                    {
                        string interactableName = ItemDropAPIFixes.InteractableCalculator.GetSpawnCardName(spawnCard);
                        if (spawnCardNames.Contains(interactableName))
                        {
                            spawnCards.Add(spawnCard);
                        }
                    }

                    if (spawnCardNames.Count > 0)
                    {
                        DirectorCard[] directorCards = new DirectorCard[spawnCards.Count];
                        for (int cardIndex = 0; cardIndex < spawnCards.Count; cardIndex++)
                        {
                            DirectorCard directorCard = new DirectorCard();
                            directorCard.spawnCard       = spawnCards[cardIndex];
                            directorCard.selectionWeight = 1;
                            directorCards[cardIndex]     = directorCard;
                        }

                        DirectorCardCategorySelection.Category category = new DirectorCardCategorySelection.Category();
                        category.name            = "FORCED";
                        category.cards           = directorCards;
                        category.selectionWeight = 1000;

                        DirectorCardCategorySelection.Category[] categoriesAdjusted = new DirectorCardCategorySelection.Category[ClassicStageInfo.instance.interactableCategories.categories.Length + 1];
                        for (int categoryIndex = 0; categoryIndex < ClassicStageInfo.instance.interactableCategories.categories.Length; categoryIndex++)
                        {
                            categoriesAdjusted[categoryIndex] = ClassicStageInfo.instance.interactableCategories.categories[categoryIndex];
                        }
                        categoriesAdjusted[categoriesAdjusted.Length - 1]           = category;
                        ClassicStageInfo.instance.interactableCategories.categories = categoriesAdjusted;
                    }
                    ;

                    foreach (int key in Data.allDroneIDs.Keys)
                    {
                        if (!Data.itemsToDrop.Contains(key) && !ItemDropAPIFixes.ItemDropAPIFixes.playerInteractables.interactablesInvalid.Contains(Data.allDroneIDs[key]))
                        {
                            ItemDropAPIFixes.ItemDropAPIFixes.playerInteractables.interactablesInvalid.Add(Data.allDroneIDs[key]);
                        }
                    }
                }
                orig(sceneDirector);
            }
Example #3
0
        public static void Init()
        {
            SceneDirector.onGenerateInteractableCardSelection += (director, selection) =>
            {
                DirectorCardCategorySelection.Category dupCategory = selection.categories.FirstOrDefault(x => x.name == "Duplicator");

                if ((dupCategory.cards?.Length ?? 0) > 0)
                {
                    var copyCard      = dupCategory.cards[0];
                    var copySpawnCard = copyCard.spawnCard;

                    SpawnCard spawnCard = ScriptableObject.CreateInstance <SpawnCard>();
                    spawnCard.name = "DuplicatorLunar";
                    spawnCard.directorCreditCost = LunarScrapPlugin.CreditCost.Value;
                    spawnCard.forbiddenFlags     = copySpawnCard.forbiddenFlags;
                    spawnCard.hullSize           = copySpawnCard.hullSize;
                    spawnCard.nodeGraphType      = copySpawnCard.nodeGraphType;
                    spawnCard.occupyPosition     = copySpawnCard.occupyPosition;
                    spawnCard.prefab             = Object.Instantiate(copySpawnCard.prefab);
                    spawnCard.requiredFlags      = copySpawnCard.requiredFlags;
                    spawnCard.sendOverNetwork    = copySpawnCard.sendOverNetwork;

                    var lunarCard = new DirectorCard()
                    {
                        spawnCard               = spawnCard,
                        selectionWeight         = LunarScrapPlugin.SelectionWeight.Value,
                        spawnDistance           = copyCard.spawnDistance,
                        allowAmbushSpawn        = copyCard.allowAmbushSpawn,
                        preventOverhead         = copyCard.preventOverhead,
                        minimumStageCompletions = copyCard.minimumStageCompletions,
                        requiredUnlockableDef   = copyCard.requiredUnlockableDef,
                        forbiddenUnlockableDef  = copyCard.forbiddenUnlockableDef
                    };
                    lunarCard.spawnCard.prefab.transform.SetPositionAndRotation(new UnityEngine.Vector3(0, -1000, 0), new UnityEngine.Quaternion());

                    lunarCard.spawnCard.prefab.GetComponent <PurchaseInteraction>().costType = CostTypeIndex.LunarItemOrEquipment;

                    var shop = lunarCard.spawnCard.prefab.GetComponent <ShopTerminalBehavior>();
                    shop.itemTier  = ItemTier.Lunar;
                    shop.dropTable = ScriptableObject.CreateInstance <LunarDropTable>();

                    var newCardArray = new DirectorCard[dupCategory.cards.Length + 1];
                    dupCategory.cards.CopyTo(newCardArray, 0);
                    newCardArray[newCardArray.Length - 1] = lunarCard;
                    dupCategory.cards = newCardArray;

                    for (int i = 0; i < selection.categories.Length; i++)
                    {
                        if (selection.categories[i].name == "Duplicator")
                        {
                            selection.categories[i] = dupCategory;
                        }
                    }
                }
            };
        }
Example #4
0
        private void AdjustSelectionWeight(DirectorCardCategorySelection.Category category, string cardName, int numberOfPlayers)
        {
            foreach (var card in category.cards)
            {
                if (card.spawnCard.name == cardName)
                {
                    //Scale down the spawnrate as the player# increases. 4 = default, 8 = 50%, 16=25%.
                    var adjustmentConstant = (double)4 / (double)numberOfPlayers;
                    //Then scale again based on config scalar. Config scalar will result in different "true" spawnrates depending on # of players. 2.0 value with 8 players results in 100%; but only 50% with 16.
                    var adjustedWeight = (int)((double)card.selectionWeight * confScalar.Value * (double)adjustmentConstant);

                    if (adjustedWeight < 1)
                    {
                        AddInfoLog($"Set {cardName} = 1 (default) [down from {card.selectionWeight}]");
                        card.selectionWeight = 1;
                    }
                    else
                    {
                        AddInfoLog($"Set {cardName} = {adjustedWeight} [down from {card.selectionWeight}]");
                        card.selectionWeight = adjustedWeight;
                    }
                }
            }
        }
Example #5
0
        private static void ApplyInteractableChanges(ClassicStageInfo self, StageInfo stage)
        {
            var interactables     = self.GetFieldValue <DirectorCardCategorySelection>("interactableCategories");
            var interactableCards = new List <DirectorCardHolder>();

            foreach (var cat in interactables.categories)
            {
                MonsterCategory      monstCat = GetMonsterCategory(cat.name);
                InteractableCategory interCat = GetInteractableCategory(cat.name);
                foreach (var t in cat.cards)
                {
                    interactableCards.Add(new DirectorCardHolder {
                        InteractableCategory = interCat,
                        MonsterCategory      = monstCat,
                        Card = t
                    });
                }
            }
            InteractableActions?.Invoke(interactableCards, stage);
            var interChests  = new List <DirectorCard>();
            var interBarrels = new List <DirectorCard>();
            var interShrines = new List <DirectorCard>();
            var interDrones  = new List <DirectorCard>();
            var interMisc    = new List <DirectorCard>();
            var interRare    = new List <DirectorCard>();
            var interDupe    = new List <DirectorCard>();

            foreach (var hold in interactableCards)
            {
                switch (hold.InteractableCategory)
                {
                case InteractableCategory.None:
                    R2API.Logger.LogWarning("InteractableCategory from DirectorCardHolder is None !");
                    break;

                case InteractableCategory.Chests:
                    interChests.Add(hold.Card);
                    break;

                case InteractableCategory.Barrels:
                    interBarrels.Add(hold.Card);
                    break;

                case InteractableCategory.Drones:
                    interDrones.Add(hold.Card);
                    break;

                case InteractableCategory.Duplicator:
                    interDupe.Add(hold.Card);
                    break;

                case InteractableCategory.Misc:
                    interMisc.Add(hold.Card);
                    break;

                case InteractableCategory.Rare:
                    interRare.Add(hold.Card);
                    break;

                case InteractableCategory.Shrines:
                    interShrines.Add(hold.Card);
                    break;
                }
            }
            for (int i = 0; i < interactables.categories.Length; i++)
            {
                DirectorCardCategorySelection.Category cat = interactables.categories[i];
                switch (cat.name)
                {
                case "Chests":
                    cat.cards = interChests.ToArray();
                    break;

                case "Barrels":
                    cat.cards = interBarrels.ToArray();
                    break;

                case "Shrines":
                    cat.cards = interShrines.ToArray();
                    break;

                case "Drones":
                    cat.cards = interDrones.ToArray();
                    break;

                case "Misc":
                    cat.cards = interMisc.ToArray();
                    break;

                case "Rare":
                    cat.cards = interRare.ToArray();
                    break;

                case "Duplicator":
                    cat.cards = interDupe.ToArray();
                    break;
                }
                interactables.categories[i] = cat;
            }
        }
        private static void ApplyInteractableChanges(ClassicStageInfo self, StageInfo stage)
        {
            var interactables = self.GetFieldValue <DirectorCardCategorySelection>("interactableCategories");
            List <DirectorCardHolder> interactableCards = new List <DirectorCardHolder>();

            for (int i = 0; i < interactables.categories.Length; i++)
            {
                DirectorCardCategorySelection.Category cat = interactables.categories[i];
                MonsterCategory      monstCat = GetMonsterCategory(cat.name);
                InteractableCategory interCat = GetInteractableCategory(cat.name);
                for (int j = 0; j < cat.cards.Length; j++)
                {
                    interactableCards.Add(new DirectorCardHolder
                    {
                        interactableCategory = interCat,
                        monsterCategory      = monstCat,
                        card = cat.cards[j]
                    });
                }
            }

            interactableActions?.Invoke(interactableCards, stage);

            DirectorCard[] interChests  = new DirectorCard[0];
            DirectorCard[] interBarrels = new DirectorCard[0];
            DirectorCard[] interShrines = new DirectorCard[0];
            DirectorCard[] interDrones  = new DirectorCard[0];
            DirectorCard[] interMisc    = new DirectorCard[0];
            DirectorCard[] interRare    = new DirectorCard[0];
            DirectorCard[] interDupe    = new DirectorCard[0];

            for (int i = 0; i < interactableCards.Count; i++)
            {
                DirectorCardHolder hold = interactableCards[i];
                switch (hold.interactableCategory)
                {
                default:
                    Debug.Log("Wtf are you doing...");
                    break;

                case InteractableCategory.Chests:
                    AddToArray <DirectorCard>(ref interChests, hold.card);
                    break;

                case InteractableCategory.Barrels:
                    AddToArray <DirectorCard>(ref interBarrels, hold.card);
                    break;

                case InteractableCategory.Drones:
                    AddToArray <DirectorCard>(ref interDrones, hold.card);
                    break;

                case InteractableCategory.Duplicator:
                    AddToArray <DirectorCard>(ref interDupe, hold.card);
                    break;

                case InteractableCategory.Misc:
                    AddToArray <DirectorCard>(ref interMisc, hold.card);
                    break;

                case InteractableCategory.Rare:
                    AddToArray <DirectorCard>(ref interRare, hold.card);
                    break;

                case InteractableCategory.Shrines:
                    AddToArray <DirectorCard>(ref interShrines, hold.card);
                    break;
                }
            }
            for (int i = 0; i < interactables.categories.Length; i++)
            {
                DirectorCardCategorySelection.Category cat = interactables.categories[i];
                switch (cat.name)
                {
                default:
                    Debug.Log(cat.name);
                    break;

                case "Chests":
                    cat.cards = interChests;
                    break;

                case "Barrels":
                    cat.cards = interBarrels;
                    break;

                case "Shrines":
                    cat.cards = interShrines;
                    break;

                case "Drones":
                    cat.cards = interDrones;
                    break;

                case "Misc":
                    cat.cards = interMisc;
                    break;

                case "Rare":
                    cat.cards = interRare;
                    break;

                case "Duplicator":
                    cat.cards = interDupe;
                    break;
                }
                interactables.categories[i] = cat;
            }
        }
        private static void ApplyMonsterChanges(ClassicStageInfo self, StageInfo stage)
        {
            var monsters = self.GetFieldValue <DirectorCardCategorySelection>("monsterCategories");
            List <DirectorCardHolder> monsterCards = new List <DirectorCardHolder>();

            for (int i = 0; i < monsters.categories.Length; i++)
            {
                DirectorCardCategorySelection.Category cat = monsters.categories[i];
                MonsterCategory      monstCat = GetMonsterCategory(cat.name);
                InteractableCategory interCat = GetInteractableCategory(cat.name);
                for (int j = 0; j < cat.cards.Length; j++)
                {
                    monsterCards.Add(new DirectorCardHolder
                    {
                        interactableCategory = interCat,
                        monsterCategory      = monstCat,
                        card = cat.cards[j]
                    });
                }
            }

            monsterActions?.Invoke(monsterCards, stage);

            DirectorCard[] monsterBasic = new DirectorCard[0];
            DirectorCard[] monsterSub   = new DirectorCard[0];
            DirectorCard[] monsterChamp = new DirectorCard[0];

            for (int i = 0; i < monsterCards.Count; i++)
            {
                DirectorCardHolder hold = monsterCards[i];
                switch (hold.monsterCategory)
                {
                default:
                    Debug.Log("Wtf are you doing...");
                    break;

                case MonsterCategory.BasicMonsters:
                    AddToArray <DirectorCard>(ref monsterBasic, hold.card);
                    break;

                case MonsterCategory.Champions:
                    AddToArray <DirectorCard>(ref monsterChamp, hold.card);
                    break;

                case MonsterCategory.Minibosses:
                    AddToArray <DirectorCard>(ref monsterSub, hold.card);
                    break;
                }
            }
            for (int i = 0; i < monsters.categories.Length; i++)
            {
                DirectorCardCategorySelection.Category cat = monsters.categories[i];
                switch (cat.name)
                {
                default:
                    Debug.Log(cat.name);
                    break;

                case "Champions":
                    cat.cards = monsterChamp;
                    break;

                case "Minibosses":
                    cat.cards = monsterSub;
                    break;

                case "Basic Monsters":
                    cat.cards = monsterBasic;
                    break;
                }
                monsters.categories[i] = cat;
            }
        }