public static void InitCustomPrefabs() { try { AssetBundle assetBundle = ResourceManager.LoadAssetBundle("shared_auto_001"); AssetBundle assetBundle2 = ResourceManager.LoadAssetBundle("shared_auto_002"); shared_auto_001 = assetBundle; shared_auto_002 = assetBundle2; braveResources = ResourceManager.LoadAssetBundle("brave_resources_001"); ModAssets = AssetBundleLoader.LoadAssetBundleFromLiterallyAnywhere("roundassetbundle"); if (ModAssets == null) { ETGModConsole.Log("ModAssets is null, all according to plan!"); } tileset = ModAssets.LoadAsset <Texture2D>("floorsheet"); TutorialDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Tutorial"); SewerDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Sewer"); MinesDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Mines"); ratDungeon = DungeonDatabase.GetOrLoadByName("base_resourcefulrat"); CathedralDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Cathedral"); BulletHellDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_BulletHell"); ForgeDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Forge"); CatacombsDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Catacombs"); NakatomiDungeonPrefab = DungeonDatabase.GetOrLoadByName("base_nakatomi"); reward_room = shared_auto_002.LoadAsset <PrototypeDungeonRoom>("reward room"); gungeon_rewardroom_1 = shared_auto_002.LoadAsset <PrototypeDungeonRoom>("gungeon_rewardroom_1"); shop_room_table = shared_auto_002.LoadAsset <GenericRoomTable>("Shop Room Table"); shop02 = shared_auto_002.LoadAsset <PrototypeDungeonRoom>("shop02"); boss_foyertable = shared_auto_002.LoadAsset <GenericRoomTable>("Boss Foyers"); FloorNameRoomTable = ScriptableObject.CreateInstance <GenericRoomTable>(); FloorNameRoomTable.includedRooms = new WeightedRoomCollection(); FloorNameRoomTable.includedRooms.elements = new List <WeightedRoom>(); FloorNameRoomTable.includedRoomTables = new List <GenericRoomTable>(0); SecretRoomTable = shared_auto_002.LoadAsset <GenericRoomTable>("secret_room_table_01"); CastleRoomTable = shared_auto_002.LoadAsset <GenericRoomTable>("Castle_RoomTable"); Gungeon_RoomTable = shared_auto_002.LoadAsset <GenericRoomTable>("Gungeon_RoomTable"); SewersRoomTable = SewerDungeonPrefab.PatternSettings.flows[0].fallbackRoomTable; AbbeyRoomTable = CathedralDungeonPrefab.PatternSettings.flows[0].fallbackRoomTable; MinesRoomTable = MinesDungeonPrefab.PatternSettings.flows[0].fallbackRoomTable; CatacombsRoomTable = CatacombsDungeonPrefab.PatternSettings.flows[0].fallbackRoomTable; ForgeRoomTable = ForgeDungeonPrefab.PatternSettings.flows[0].fallbackRoomTable; BulletHellRoomTable = BulletHellDungeonPrefab.PatternSettings.flows[0].fallbackRoomTable; doublebeholsterroom01 = FloorNameDungeonFlows.LoadOfficialFlow("Secret_DoubleBeholster_Flow").AllNodes[2].overrideExactRoom; } catch (Exception e) { Tools.Print(e); } }
// Token: 0x06000057 RID: 87 RVA: 0x00005884 File Offset: 0x00003A84 public static DungeonFlow CreateNewFlow(Dungeon dungeon) { DungeonFlow dungeonFlow = ScriptableObject.CreateInstance <DungeonFlow>(); dungeonFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction> { new DungeonFlowSubtypeRestriction() }; dungeonFlow.flowInjectionData = new List <ProceduralFlowModifierData>(); dungeonFlow.sharedInjectionData = new List <SharedInjectionData>(); GenericRoomTable fallbackRoomTable = dungeon.PatternSettings.flows[0].fallbackRoomTable; dungeonFlow.fallbackRoomTable = fallbackRoomTable; dungeonFlow.evolvedRoomTable = fallbackRoomTable; dungeonFlow.phantomRoomTable = fallbackRoomTable; dungeonFlow.Initialize(); dungeon = null; return(dungeonFlow); }
// Token: 0x06000079 RID: 121 RVA: 0x00006768 File Offset: 0x00004968 public static void Init() { StaticReferences.AssetBundles = new Dictionary <string, AssetBundle>(); foreach (string text in StaticReferences.assetBundleNames) { try { AssetBundle assetBundle = ResourceManager.LoadAssetBundle(text); StaticReferences.AssetBundles.Add(text, ResourceManager.LoadAssetBundle(text)); } catch (Exception e) { Tools.PrintError <string>("Failed to load asset bundle: " + text, "FF0000"); Tools.PrintException(e, "FF0000"); } } StaticReferences.RoomTables = new Dictionary <string, GenericRoomTable>(); foreach (KeyValuePair <string, string> keyValuePair in StaticReferences.roomTableMap) { try { GenericRoomTable genericRoomTable = StaticReferences.GetAsset <GenericRoomTable>(keyValuePair.Value); bool flag = genericRoomTable == null; bool flag2 = flag; if (flag2) { genericRoomTable = DungeonDatabase.GetOrLoadByName("base_" + keyValuePair.Key).PatternSettings.flows[0].fallbackRoomTable; } StaticReferences.RoomTables.Add(keyValuePair.Key, genericRoomTable); } catch (Exception e2) { Tools.PrintError <string>("Failed to load room table: " + keyValuePair.Key + ":" + keyValuePair.Value, "FF0000"); Tools.PrintException(e2, "FF0000"); } } Tools.Print <string>("Static references initialized.", "FFFFFF", false); }
public static DungeonFlowNode GenerateFlowNode(DungeonFlow flow, PrototypeDungeonRoom.RoomCategory category, PrototypeDungeonRoom overrideRoom = null, GenericRoomTable overrideRoomTable = null, bool loopTargetIsOneWay = false, bool isWarpWing = false, bool handlesOwnWarping = true, float weight = 1f, DungeonFlowNode.NodePriority priority = DungeonFlowNode.NodePriority.MANDATORY, string guid = "") { if (string.IsNullOrEmpty(guid)) { guid = Guid.NewGuid().ToString(); } DungeonFlowNode node = new DungeonFlowNode(flow) { isSubchainStandin = false, nodeType = DungeonFlowNode.ControlNodeType.ROOM, roomCategory = category, percentChance = weight, priority = priority, overrideExactRoom = overrideRoom, overrideRoomTable = overrideRoomTable, capSubchain = false, subchainIdentifier = string.Empty, limitedCopiesOfSubchain = false, maxCopiesOfSubchain = 1, subchainIdentifiers = new List <string>(0), receivesCaps = false, isWarpWingEntrance = isWarpWing, handlesOwnWarping = handlesOwnWarping, forcedDoorType = DungeonFlowNode.ForcedDoorType.NONE, loopForcedDoorType = DungeonFlowNode.ForcedDoorType.NONE, nodeExpands = false, initialChainPrototype = "n", chainRules = new List <ChainRule>(0), minChainLength = 3, maxChainLength = 8, minChildrenToBuild = 1, maxChildrenToBuild = 1, canBuildDuplicateChildren = false, guidAsString = guid, parentNodeGuid = string.Empty, childNodeGuids = new List <string>(0), loopTargetNodeGuid = string.Empty, loopTargetIsOneWay = loopTargetIsOneWay, flow = flow }; return(node); }
// Generate a DungeonFlowNode with a default configuration public static DungeonFlowNode GenerateDefaultNode(DungeonFlow targetflow, PrototypeDungeonRoom.RoomCategory roomType, PrototypeDungeonRoom overrideRoom = null, GenericRoomTable overrideTable = null, bool oneWayLoopTarget = false, bool isWarpWingNode = false, string nodeGUID = null, DungeonFlowNode.NodePriority priority = DungeonFlowNode.NodePriority.MANDATORY, float percentChance = 1, bool handlesOwnWarping = true) { try { if (string.IsNullOrEmpty(nodeGUID)) { nodeGUID = Guid.NewGuid().ToString(); } DungeonFlowNode m_CachedNode = new DungeonFlowNode(targetflow) { isSubchainStandin = false, nodeType = DungeonFlowNode.ControlNodeType.ROOM, roomCategory = roomType, percentChance = percentChance, priority = priority, overrideExactRoom = overrideRoom, overrideRoomTable = overrideTable, capSubchain = false, subchainIdentifier = string.Empty, limitedCopiesOfSubchain = false, maxCopiesOfSubchain = 1, subchainIdentifiers = new List <string>(0), receivesCaps = false, isWarpWingEntrance = isWarpWingNode, handlesOwnWarping = handlesOwnWarping, forcedDoorType = DungeonFlowNode.ForcedDoorType.NONE, loopForcedDoorType = DungeonFlowNode.ForcedDoorType.NONE, nodeExpands = false, initialChainPrototype = "n", chainRules = new List <ChainRule>(0), minChainLength = 3, maxChainLength = 8, minChildrenToBuild = 1, maxChildrenToBuild = 1, canBuildDuplicateChildren = false, guidAsString = nodeGUID, parentNodeGuid = string.Empty, childNodeGuids = new List <string>(0), loopTargetNodeGuid = string.Empty, loopTargetIsOneWay = oneWayLoopTarget, flow = targetflow }; return(m_CachedNode); } catch (Exception e) { ETGModConsole.Log(e.ToString()); return(null); } }
// Initialize KnownFlows array with custom + official flows. public static void InitDungeonFlows(AssetBundle sharedAssets2, bool refreshFlows = false) { Dungeon TutorialPrefab = DungeonDatabase.GetOrLoadByName("Base_Tutorial"); Dungeon CastlePrefab = DungeonDatabase.GetOrLoadByName("Base_Castle"); Dungeon SewerPrefab = DungeonDatabase.GetOrLoadByName("Base_Sewer"); Dungeon GungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Gungeon"); Dungeon CathedralPrefab = DungeonDatabase.GetOrLoadByName("Base_Cathedral"); Dungeon MinesPrefab = DungeonDatabase.GetOrLoadByName("Base_Mines"); Dungeon ResourcefulRatPrefab = DungeonDatabase.GetOrLoadByName("Base_ResourcefulRat"); Dungeon CatacombsPrefab = DungeonDatabase.GetOrLoadByName("Base_Catacombs"); Dungeon NakatomiPrefab = DungeonDatabase.GetOrLoadByName("Base_Nakatomi"); Dungeon ForgePrefab = DungeonDatabase.GetOrLoadByName("Base_Forge"); Dungeon BulletHellPrefab = DungeonDatabase.GetOrLoadByName("Base_BulletHell"); BaseSharedInjectionData = sharedAssets2.LoadAsset <SharedInjectionData>("Base Shared Injection Data"); GungeonInjectionData = GungeonPrefab.PatternSettings.flows[0].sharedInjectionData[1]; SewersInjectionData = SewerPrefab.PatternSettings.flows[0].sharedInjectionData[1]; HollowsInjectionData = CatacombsPrefab.PatternSettings.flows[0].sharedInjectionData[1]; CastleInjectionData = CastlePrefab.PatternSettings.flows[0].sharedInjectionData[0]; JunkSecretRoomInjector = new ProceduralFlowModifierData() { annotation = "Tiny Secret Room", DEBUG_FORCE_SPAWN = false, OncePerRun = false, placementRules = new List <ProceduralFlowModifierData.FlowModifierPlacementType>() { ProceduralFlowModifierData.FlowModifierPlacementType.RANDOM_NODE_CHILD }, roomTable = null, exactRoom = ExpandRoomPrefabs.Expand_TinySecret, IsWarpWing = false, RequiresMasteryToken = false, chanceToLock = 0, selectionWeight = 1, chanceToSpawn = 1, RequiredValidPlaceable = null, prerequisites = new DungeonPrerequisite[0], CanBeForcedSecret = true, RandomNodeChildMinDistanceFromEntrance = 0, exactSecondaryRoom = null, framedCombatNodes = 0, }; BellySpecialEntranceRoomInjector = new ProceduralFlowModifierData() { annotation = "Secret Belly Entrance Room", DEBUG_FORCE_SPAWN = false, OncePerRun = false, placementRules = new List <ProceduralFlowModifierData.FlowModifierPlacementType>() { ProceduralFlowModifierData.FlowModifierPlacementType.END_OF_CHAIN }, roomTable = null, exactRoom = ExpandRoomPrefabs.Expand_Gungeon_BellyEntranceRoom, IsWarpWing = false, RequiresMasteryToken = false, chanceToLock = 0, selectionWeight = 1, chanceToSpawn = 1, RequiredValidPlaceable = null, prerequisites = new DungeonPrerequisite[] { new DungeonPrerequisite() { prerequisiteOperation = DungeonPrerequisite.PrerequisiteOperation.EQUAL_TO, prerequisiteType = DungeonPrerequisite.PrerequisiteType.TILESET, requiredTileset = GlobalDungeonData.ValidTilesets.GUNGEON, requireTileset = true, comparisonValue = 1, encounteredObjectGuid = string.Empty, maxToCheck = TrackedMaximums.MOST_KEYS_HELD, requireDemoMode = false, requireCharacter = false, requiredCharacter = PlayableCharacters.Pilot, requireFlag = false, useSessionStatValue = false, encounteredRoom = null, requiredNumberOfEncounters = -1, saveFlagToCheck = GungeonFlags.TUTORIAL_COMPLETED, statToCheck = TrackedStats.GUNBERS_MUNCHED } }, CanBeForcedSecret = true, RandomNodeChildMinDistanceFromEntrance = 0, exactSecondaryRoom = null, framedCombatNodes = 0, }; BellySpecialMonsterRoomInjector = new ProceduralFlowModifierData() { annotation = "Secret Belly Monster Room", DEBUG_FORCE_SPAWN = false, OncePerRun = false, placementRules = new List <ProceduralFlowModifierData.FlowModifierPlacementType>() { ProceduralFlowModifierData.FlowModifierPlacementType.NO_LINKS }, roomTable = null, exactRoom = ExpandRoomPrefabs.Expand_Gungeon_HiddenMonsterRoom, IsWarpWing = true, RequiresMasteryToken = false, chanceToLock = 0, selectionWeight = 1, chanceToSpawn = 1, RequiredValidPlaceable = null, prerequisites = new DungeonPrerequisite[] { new DungeonPrerequisite() { prerequisiteOperation = DungeonPrerequisite.PrerequisiteOperation.EQUAL_TO, prerequisiteType = DungeonPrerequisite.PrerequisiteType.TILESET, requiredTileset = GlobalDungeonData.ValidTilesets.GUNGEON, requireTileset = true, comparisonValue = 1, encounteredObjectGuid = string.Empty, maxToCheck = TrackedMaximums.MOST_KEYS_HELD, requireDemoMode = false, requireCharacter = false, requiredCharacter = PlayableCharacters.Pilot, requireFlag = false, useSessionStatValue = false, encounteredRoom = null, requiredNumberOfEncounters = -1, saveFlagToCheck = GungeonFlags.TUTORIAL_COMPLETED, statToCheck = TrackedStats.GUNBERS_MUNCHED } }, CanBeForcedSecret = true, RandomNodeChildMinDistanceFromEntrance = 0, exactSecondaryRoom = null, framedCombatNodes = 0, }; GungeonInjectionData.InjectionData.Add(BellySpecialEntranceRoomInjector); GungeonInjectionData.InjectionData.Add(BellySpecialMonsterRoomInjector); SewersInjectionData.InjectionData.Add(JunkSecretRoomInjector); SecretFloorEntranceInjector = new ProceduralFlowModifierData() { annotation = "Secret Floor Entrance Room", DEBUG_FORCE_SPAWN = false, OncePerRun = false, placementRules = new List <ProceduralFlowModifierData.FlowModifierPlacementType>() { ProceduralFlowModifierData.FlowModifierPlacementType.NO_LINKS }, roomTable = null, // exactRoom = SewersInjectionData.InjectionData[0].exactRoom, exactRoom = ExpandRoomPrefabs.SecretExitRoom2, IsWarpWing = true, RequiresMasteryToken = false, chanceToLock = 0, selectionWeight = 1, chanceToSpawn = 1, RequiredValidPlaceable = null, prerequisites = new DungeonPrerequisite[0], CanBeForcedSecret = true, RandomNodeChildMinDistanceFromEntrance = 0, exactSecondaryRoom = null, framedCombatNodes = 0, }; SecretMiniElevatorInjector = new ProceduralFlowModifierData() { annotation = "Secret MiniElevator Room with Glitched Rats", DEBUG_FORCE_SPAWN = false, OncePerRun = false, placementRules = new List <ProceduralFlowModifierData.FlowModifierPlacementType>() { ProceduralFlowModifierData.FlowModifierPlacementType.RANDOM_NODE_CHILD }, roomTable = null, exactRoom = ExpandRoomPrefabs.SecretRatEntranceRoom, IsWarpWing = false, RequiresMasteryToken = false, chanceToLock = 0.25f, selectionWeight = 1, chanceToSpawn = 1, RequiredValidPlaceable = null, prerequisites = new DungeonPrerequisite[0], CanBeForcedSecret = true, RandomNodeChildMinDistanceFromEntrance = 0, exactSecondaryRoom = null, framedCombatNodes = 0, }; m_KeepJungleEntranceRooms = ScriptableObject.CreateInstance <GenericRoomTable>(); m_KeepJungleEntranceRooms.includedRoomTables = new List <GenericRoomTable>(0); m_KeepJungleEntranceRooms.includedRooms = new WeightedRoomCollection() { elements = new List <WeightedRoom>() { ExpandRoomPrefabs.GenerateWeightedRoom(ExpandRoomPrefabs.Expand_Keep_TreeRoom, Weight: 0.5f), ExpandRoomPrefabs.GenerateWeightedRoom(ExpandRoomPrefabs.Expand_Keep_TreeRoom2) } }; SecretJungleEntranceInjector = new ProceduralFlowModifierData() { annotation = "Secret Jungle Entrance Room", DEBUG_FORCE_SPAWN = false, OncePerRun = false, placementRules = new List <ProceduralFlowModifierData.FlowModifierPlacementType>() { ProceduralFlowModifierData.FlowModifierPlacementType.RANDOM_NODE_CHILD }, roomTable = m_KeepJungleEntranceRooms, exactRoom = null, IsWarpWing = false, RequiresMasteryToken = false, chanceToLock = 0, selectionWeight = 1, chanceToSpawn = 1, RequiredValidPlaceable = null, prerequisites = new DungeonPrerequisite[] { new DungeonPrerequisite() { prerequisiteOperation = DungeonPrerequisite.PrerequisiteOperation.EQUAL_TO, prerequisiteType = DungeonPrerequisite.PrerequisiteType.TILESET, requiredTileset = GlobalDungeonData.ValidTilesets.CASTLEGEON, requireTileset = true, comparisonValue = 1, encounteredObjectGuid = string.Empty, maxToCheck = TrackedMaximums.MOST_KEYS_HELD, requireDemoMode = false, requireCharacter = false, requiredCharacter = PlayableCharacters.Pilot, requireFlag = false, useSessionStatValue = false, encounteredRoom = null, requiredNumberOfEncounters = -1, saveFlagToCheck = GungeonFlags.TUTORIAL_COMPLETED, statToCheck = TrackedStats.GUNBERS_MUNCHED } }, CanBeForcedSecret = true, RandomNodeChildMinDistanceFromEntrance = 0, exactSecondaryRoom = null, framedCombatNodes = 0, }; HollowsInjectionData.InjectionData.Add(SecretFloorEntranceInjector); HollowsInjectionData.InjectionData.Add(SecretMiniElevatorInjector); CastleInjectionData.InjectionData.Add(SecretJungleEntranceInjector); RickRollSecretRoomInjector = new ProceduralFlowModifierData() { annotation = "RickRoll Secret Room", DEBUG_FORCE_SPAWN = false, OncePerRun = false, placementRules = new List <ProceduralFlowModifierData.FlowModifierPlacementType>() { ProceduralFlowModifierData.FlowModifierPlacementType.END_OF_CHAIN }, roomTable = null, exactRoom = ExpandRoomPrefabs.Expand_RickRollSecret, IsWarpWing = false, RequiresMasteryToken = false, chanceToLock = 0, selectionWeight = 1, chanceToSpawn = 0.25f, RequiredValidPlaceable = null, prerequisites = new DungeonPrerequisite[0], CanBeForcedSecret = true, RandomNodeChildMinDistanceFromEntrance = 1, exactSecondaryRoom = null, framedCombatNodes = 0 }; CustomSecretFloorSharedInjectionData = ScriptableObject.CreateInstance <SharedInjectionData>(); CustomSecretFloorSharedInjectionData.name = "Rick Roll Secret Room Injection Data"; CustomSecretFloorSharedInjectionData.InjectionData = new List <ProceduralFlowModifierData>() { RickRollSecretRoomInjector }; CustomSecretFloorSharedInjectionData.UseInvalidWeightAsNoInjection = true; CustomSecretFloorSharedInjectionData.IsNPCCell = false; CustomSecretFloorSharedInjectionData.PreventInjectionOfFailedPrerequisites = false; CustomSecretFloorSharedInjectionData.OnlyOne = false; CustomSecretFloorSharedInjectionData.ChanceToSpawnOne = 1; CustomSecretFloorSharedInjectionData.AttachedInjectionData = new List <SharedInjectionData>(0); // Don't build/add flows until injection data is created! Foyer_Flow = FlowHelpers.DuplicateDungeonFlow(sharedAssets2.LoadAsset <DungeonFlow>("Foyer Flow")); // List<DungeonFlow> m_knownFlows = new List<DungeonFlow>(); KnownFlows = new List <DungeonFlow>(); // Build and add custom flows to list. BossrushFlows.InitBossrushFlows(); KnownFlows.Add(custom_glitchchest_flow.Custom_GlitchChest_Flow()); KnownFlows.Add(test_west_floor_03a_flow.TEST_West_Floor_03a_Flow()); KnownFlows.Add(demo_stage_flow.DEMO_STAGE_FLOW()); KnownFlows.Add(complex_flow_test.Complex_Flow_Test()); KnownFlows.Add(custom_glitch_flow.Custom_Glitch_Flow()); KnownFlows.Add(really_big_flow.Really_Big_Flow()); KnownFlows.Add(fruit_loops.Fruit_Loops()); KnownFlows.Add(custom_glitchchestalt_flow.Custom_GlitchChestAlt_Flow()); KnownFlows.Add(test_traproom_flow.Test_TrapRoom_Flow()); KnownFlows.Add(test_customroom_flow.Test_CustomRoom_Flow()); KnownFlows.Add(apache_fucking_around_flow.Apache_Fucking_Around_Flow()); KnownFlows.Add(f1b_jungle_flow_01.F1b_Jungle_Flow_01()); KnownFlows.Add(f1b_jungle_flow_02.F1b_Jungle_Flow_02()); KnownFlows.Add(f2b_belly_flow_01.F2b_Belly_Flow_01()); KnownFlows.Add(f4c_west_flow_01.F4c_West_Flow_01()); // Fix issues with nodes so that things other then MainMenu can load Foyer flow Foyer_Flow.name = "Foyer_Flow"; Foyer_Flow.AllNodes[1].handlesOwnWarping = true; Foyer_Flow.AllNodes[2].handlesOwnWarping = true; Foyer_Flow.AllNodes[3].handlesOwnWarping = true; KnownFlows.Add(Foyer_Flow); KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(LoadOfficialFlow("npcparadise"))); KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(LoadOfficialFlow("secret_doublebeholster_flow"))); KnownFlows.Add(BossrushFlows.Bossrush_01_Castle); KnownFlows.Add(BossrushFlows.Bossrush_01a_Sewer); KnownFlows.Add(BossrushFlows.Bossrush_02_Gungeon); KnownFlows.Add(BossrushFlows.Bossrush_02a_Cathedral); KnownFlows.Add(BossrushFlows.Bossrush_03_Mines); KnownFlows.Add(BossrushFlows.Bossrush_04_Catacombs); KnownFlows.Add(BossrushFlows.Bossrush_05_Forge); KnownFlows.Add(BossrushFlows.Bossrush_06_BulletHell); KnownFlows.Add(BossrushFlows.MiniBossrush_01); // Add official flows to list (flows found in Dungeon asset bundles after AG&D) for (int i = 0; i < TutorialPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(TutorialPrefab.PatternSettings.flows[i])); } for (int i = 0; i < CastlePrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(CastlePrefab.PatternSettings.flows[i])); } for (int i = 0; i < SewerPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(SewerPrefab.PatternSettings.flows[i])); } for (int i = 0; i < GungeonPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(GungeonPrefab.PatternSettings.flows[i])); } for (int i = 0; i < CathedralPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(CathedralPrefab.PatternSettings.flows[i])); } for (int i = 0; i < MinesPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(MinesPrefab.PatternSettings.flows[i])); } for (int i = 0; i < ResourcefulRatPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(ResourcefulRatPrefab.PatternSettings.flows[i])); } for (int i = 0; i < CatacombsPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(CatacombsPrefab.PatternSettings.flows[i])); } for (int i = 0; i < NakatomiPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(NakatomiPrefab.PatternSettings.flows[i])); } for (int i = 0; i < ForgePrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(ForgePrefab.PatternSettings.flows[i])); } for (int i = 0; i < BulletHellPrefab.PatternSettings.flows.Count; i++) { KnownFlows.Add(FlowHelpers.DuplicateDungeonFlow(BulletHellPrefab.PatternSettings.flows[i])); } // Let's make things look cool and give all boss rush flows my new tiny exit room. :D BossrushFlows.Bossrush_01a_Sewer.AllNodes[2].overrideExactRoom = ExpandPrefabs.tiny_exit; BossrushFlows.Bossrush_02_Gungeon.AllNodes[6].overrideExactRoom = ExpandPrefabs.tiny_exit; BossrushFlows.Bossrush_02a_Cathedral.AllNodes[2].overrideExactRoom = ExpandPrefabs.oldbulletking_room_01; BossrushFlows.Bossrush_02a_Cathedral.AllNodes[3].overrideExactRoom = ExpandPrefabs.tiny_exit; BossrushFlows.Bossrush_03_Mines.AllNodes[6].overrideExactRoom = ExpandPrefabs.tiny_exit; BossrushFlows.Bossrush_04_Catacombs.AllNodes[6].overrideExactRoom = ExpandPrefabs.tiny_exit; // Fix Forge Bossrush so it uses the correct boss foyer room for Dragun. // Using the same foyer room for previous floors looks odd so I fixed it. :P BossrushFlows.Bossrush_05_Forge.AllNodes[1].overrideExactRoom = ExpandPrefabs.DragunBossFoyerRoom; BossrushFlows.Bossrush_05_Forge.AllNodes[3].overrideExactRoom = ExpandPrefabs.tiny_exit; TutorialPrefab = null; CastlePrefab = null; SewerPrefab = null; GungeonPrefab = null; CathedralPrefab = null; MinesPrefab = null; ResourcefulRatPrefab = null; CatacombsPrefab = null; NakatomiPrefab = null; ForgePrefab = null; BulletHellPrefab = null; }
// Generate a DungeonFlowNode with a default configuration public static DungeonFlowNode GenerateDefaultNode(DungeonFlow targetflow, PrototypeDungeonRoom.RoomCategory roomType, PrototypeDungeonRoom overrideRoom = null, GenericRoomTable overrideTable = null, bool oneWayLoopTarget = false, bool isWarpWingNode = false, string nodeGUID = null) { DungeonFlowNode m_CachedNode = new DungeonFlowNode(targetflow); m_CachedNode.isSubchainStandin = false; m_CachedNode.nodeType = DungeonFlowNode.ControlNodeType.ROOM; m_CachedNode.roomCategory = roomType; m_CachedNode.percentChance = 1f; m_CachedNode.priority = DungeonFlowNode.NodePriority.MANDATORY; m_CachedNode.overrideExactRoom = overrideRoom; m_CachedNode.overrideRoomTable = overrideTable; m_CachedNode.capSubchain = false; m_CachedNode.subchainIdentifier = string.Empty; m_CachedNode.limitedCopiesOfSubchain = false; m_CachedNode.maxCopiesOfSubchain = 1; m_CachedNode.subchainIdentifiers = new List <string>(0); m_CachedNode.receivesCaps = false; m_CachedNode.isWarpWingEntrance = isWarpWingNode; if (isWarpWingNode) { m_CachedNode.handlesOwnWarping = true; } else { m_CachedNode.handlesOwnWarping = false; } m_CachedNode.forcedDoorType = DungeonFlowNode.ForcedDoorType.NONE; m_CachedNode.loopForcedDoorType = DungeonFlowNode.ForcedDoorType.NONE; m_CachedNode.nodeExpands = false; m_CachedNode.initialChainPrototype = "n"; m_CachedNode.chainRules = new List <ChainRule>(0); m_CachedNode.minChainLength = 3; m_CachedNode.maxChainLength = 8; m_CachedNode.minChildrenToBuild = 1; m_CachedNode.maxChildrenToBuild = 1; m_CachedNode.canBuildDuplicateChildren = false; m_CachedNode.parentNodeGuid = string.Empty; m_CachedNode.childNodeGuids = new List <string>(0); m_CachedNode.loopTargetNodeGuid = string.Empty; m_CachedNode.loopTargetIsOneWay = oneWayLoopTarget; if (nodeGUID == null) { m_CachedNode.guidAsString = Guid.NewGuid().ToString(); } else { m_CachedNode.guidAsString = nodeGUID; } m_CachedNode.flow = targetflow; return(m_CachedNode); }