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; } }
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); }
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; } } } }; }
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; } } } }
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; } }