public static DungeonFlow F1b_Jungle_Flow_02()
        {
            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            if (!ExpandDungeonFlow.JungleInjectionData)
            {
                ExpandDungeonFlow.JungleInjectionData      = ScriptableObject.CreateInstance <SharedInjectionData>();
                ExpandDungeonFlow.JungleInjectionData.name = "Jungle Common Injection Data";
                ExpandDungeonFlow.JungleInjectionData.UseInvalidWeightAsNoInjection         = true;
                ExpandDungeonFlow.JungleInjectionData.PreventInjectionOfFailedPrerequisites = false;
                ExpandDungeonFlow.JungleInjectionData.IsNPCCell = false;
                ExpandDungeonFlow.JungleInjectionData.IgnoreUnmetPrerequisiteEntries = false;
                ExpandDungeonFlow.JungleInjectionData.OnlyOne               = false;
                ExpandDungeonFlow.JungleInjectionData.ChanceToSpawnOne      = 0.5f;
                ExpandDungeonFlow.JungleInjectionData.AttachedInjectionData = new List <SharedInjectionData>(0);
                ExpandDungeonFlow.JungleInjectionData.InjectionData         = new List <ProceduralFlowModifierData>()
                {
                    new ProceduralFlowModifierData()
                    {
                        annotation        = "Cathedral Crest Room",
                        DEBUG_FORCE_SPAWN = false,
                        OncePerRun        = false,
                        placementRules    = new List <ProceduralFlowModifierData.FlowModifierPlacementType>()
                        {
                            ProceduralFlowModifierData.FlowModifierPlacementType.END_OF_CHAIN
                        },
                        roomTable              = null,
                        exactRoom              = ExpandRoomPrefabs.Expand_Jungle_OldCrest,
                        IsWarpWing             = false,
                        RequiresMasteryToken   = false,
                        chanceToLock           = 0.5f,
                        selectionWeight        = 1,
                        chanceToSpawn          = 1,
                        RequiredValidPlaceable = null,
                        CanBeForcedSecret      = true,
                        RandomNodeChildMinDistanceFromEntrance = 0,
                        exactSecondaryRoom = null,
                        framedCombatNodes  = 0,
                        prerequisites      = new DungeonPrerequisite[] {
                            new DungeonPrerequisite()
                            {
                                prerequisiteType           = DungeonPrerequisite.PrerequisiteType.DEMO_MODE,
                                prerequisiteOperation      = DungeonPrerequisite.PrerequisiteOperation.GREATER_THAN,
                                statToCheck                = TrackedStats.TIMES_REACHED_GUNGEON,
                                maxToCheck                 = 0,
                                comparisonValue            = 0,
                                encounteredObjectGuid      = string.Empty,
                                encounteredRoom            = null,
                                requiredNumberOfEncounters = 0,
                                requiredCharacter          = PlayableCharacters.Pilot,
                                requireCharacter           = false,
                                requiredTileset            = 0,
                                requireTileset             = false,
                                saveFlagToCheck            = 0,
                                requireFlag                = false,
                                requireDemoMode            = false
                            },
                        }
                    },
                    new ProceduralFlowModifierData()
                    {
                        annotation        = "Lost Baby Dragun",
                        DEBUG_FORCE_SPAWN = false,
                        OncePerRun        = false,
                        placementRules    = new List <ProceduralFlowModifierData.FlowModifierPlacementType>()
                        {
                            ProceduralFlowModifierData.FlowModifierPlacementType.RANDOM_NODE_CHILD
                        },
                        roomTable              = null,
                        exactRoom              = ExpandRoomPrefabs.Expand_Jungle_SecretDragun,
                        IsWarpWing             = false,
                        RequiresMasteryToken   = false,
                        chanceToLock           = 1,
                        selectionWeight        = 1,
                        chanceToSpawn          = 1,
                        RequiredValidPlaceable = null,
                        CanBeForcedSecret      = true,
                        RandomNodeChildMinDistanceFromEntrance = 0,
                        exactSecondaryRoom = null,
                        framedCombatNodes  = 0,
                        prerequisites      = new DungeonPrerequisite[] {
                            new DungeonPrerequisite()
                            {
                                prerequisiteType           = DungeonPrerequisite.PrerequisiteType.TILESET,
                                prerequisiteOperation      = DungeonPrerequisite.PrerequisiteOperation.EQUAL_TO,
                                statToCheck                = TrackedStats.TIMES_REACHED_GUNGEON,
                                maxToCheck                 = 0,
                                comparisonValue            = 0,
                                encounteredObjectGuid      = string.Empty,
                                encounteredRoom            = null,
                                requiredNumberOfEncounters = 0,
                                requiredCharacter          = PlayableCharacters.Pilot,
                                requireCharacter           = false,
                                requiredTileset            = GlobalDungeonData.ValidTilesets.JUNGLEGEON,
                                requireTileset             = true,
                                saveFlagToCheck            = 0,
                                requireFlag                = false,
                                requireDemoMode            = false
                            }
                        }
                    }
                };
            }


            DungeonFlowNode entranceNode  = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.ENTRANCE, ExpandRoomPrefabs.Expand_Jungle_Entrance);
            DungeonFlowNode exitNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandRoomPrefabs.Expand_Jungle_Exit);
            DungeonFlowNode bossfoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.boss_foyertable);
            DungeonFlowNode bossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandRoomPrefabs.Expand_Jungle_Boss);

            DungeonFlowNode JungleShopNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, ExpandPrefabs.shop02.category, overrideTable: ExpandPrefabs.shop_room_table);
            DungeonFlowNode JungleRewardNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.gungeon_rewardroom_1);
            DungeonFlowNode JungleRewardNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.gungeon_rewardroom_1);


            DungeonFlowNode JungleRoomNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB, oneWayLoopTarget: true);
            DungeonFlowNode JungleRoomNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_04 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_05 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_06 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB, oneWayLoopTarget: true);
            DungeonFlowNode JungleRoomNode_07 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_09 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_10 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_11 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB);
            DungeonFlowNode JungleRoomNode_12 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_13 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_14 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_16 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_17 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode JungleRoomNode_18 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);

            m_CachedFlow.name = "F1b_Jungle_Flow_02";
            m_CachedFlow.fallbackRoomTable   = ExpandPrefabs.JungleRoomTable;
            m_CachedFlow.phantomRoomTable    = null;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>(0);
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>()
            {
                ExpandDungeonFlow.BaseSharedInjectionData, ExpandDungeonFlow.JungleInjectionData
            };
            m_CachedFlow.Initialize();

            m_CachedFlow.AddNodeToFlow(entranceNode, null);

            // First Looping branch
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_16, entranceNode);
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_01, JungleRoomNode_16);
            // Dead End
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_05, JungleRoomNode_01);
            // Start of Loop
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_02, JungleRoomNode_01);
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_04, JungleRoomNode_02);
            m_CachedFlow.AddNodeToFlow(JungleRewardNode_01, JungleRoomNode_04);
            // Connect End of Loop to first in chain
            m_CachedFlow.LoopConnectNodes(JungleRewardNode_01, JungleRoomNode_01);

            // Second Looping branch
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_17, entranceNode);
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_06, JungleRoomNode_17);
            // Dead End
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_10, JungleRoomNode_06);
            // Start of Loop
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_07, JungleRoomNode_06);
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_09, JungleRoomNode_07);
            m_CachedFlow.AddNodeToFlow(JungleRewardNode_02, JungleRoomNode_09);
            // Connect End of Loop to first in chain
            m_CachedFlow.LoopConnectNodes(JungleRewardNode_02, JungleRoomNode_06);

            // Splitting path to Shop or Boss
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_18, entranceNode);
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_11, JungleRoomNode_18);
            // Path To Boss
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_12, JungleRoomNode_11);
            // Path to Shop
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_13, JungleRoomNode_11);
            m_CachedFlow.AddNodeToFlow(JungleShopNode, JungleRoomNode_13);
            // Dead End
            m_CachedFlow.AddNodeToFlow(JungleRoomNode_14, JungleRoomNode_11);


            m_CachedFlow.AddNodeToFlow(bossfoyerNode, JungleRoomNode_12);
            m_CachedFlow.AddNodeToFlow(bossNode, bossfoyerNode);
            m_CachedFlow.AddNodeToFlow(exitNode, bossNode);

            m_CachedFlow.FirstNode = entranceNode;

            return(m_CachedFlow);
        }
        public static DungeonFlow Test_TrapRoom_Flow()
        {
            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            DungeonFlowNode entranceNode       = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.ENTRANCE, ExpandPrefabs.tiny_entrance);
            DungeonFlowNode exitNode           = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandRoomPrefabs.SecretExitRoom);
            DungeonFlowNode firstConnectorNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Utiliroom);
            DungeonFlowNode lastConnectorNode  = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Utiliroom);

            DungeonFlowNode TrapRoomNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_03 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_04 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_05 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_06 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_07 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_08 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_09 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_10 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_11 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_12 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_13 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_14 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_15 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_16 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_17 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_18 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_19 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_20 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_21 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_22 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_23 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_24 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode TrapRoomNode_25 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);

            TrapRoomTable.name                   = "Test Trap Room Table";
            TrapRoomTable.includedRooms          = new WeightedRoomCollection();
            TrapRoomTable.includedRooms.elements = new List <WeightedRoom>();
            TrapRoomTable.includedRoomTables     = new List <GenericRoomTable>(0);

            foreach (WeightedRoom weightedRoom in ExpandPrefabs.CustomRoomTable.includedRooms.elements)
            {
                if (weightedRoom.room != null && weightedRoom.room.category == PrototypeDungeonRoom.RoomCategory.NORMAL &&
                    weightedRoom.room.subCategoryNormal == PrototypeDungeonRoom.RoomNormalSubCategory.TRAP)
                {
                    TrapRoomTable.includedRooms.elements.Add(weightedRoom);
                }
            }

            m_CachedFlow.name = "Test_TrapRoom_Flow";
            m_CachedFlow.fallbackRoomTable   = TrapRoomTable;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>(0);
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>(0);
            m_CachedFlow.Initialize();

            m_CachedFlow.AddNodeToFlow(entranceNode, null);
            m_CachedFlow.AddNodeToFlow(firstConnectorNode, entranceNode);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_01, firstConnectorNode);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_02, TrapRoomNode_01);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_03, TrapRoomNode_02);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_04, TrapRoomNode_03);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_05, TrapRoomNode_04);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_06, TrapRoomNode_05);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_07, TrapRoomNode_06);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_08, TrapRoomNode_07);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_09, TrapRoomNode_08);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_10, TrapRoomNode_09);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_11, TrapRoomNode_10);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_12, TrapRoomNode_11);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_13, TrapRoomNode_12);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_14, TrapRoomNode_13);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_15, TrapRoomNode_14);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_16, TrapRoomNode_15);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_17, TrapRoomNode_16);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_18, TrapRoomNode_17);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_19, TrapRoomNode_18);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_20, TrapRoomNode_19);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_21, TrapRoomNode_20);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_22, TrapRoomNode_21);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_23, TrapRoomNode_22);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_24, TrapRoomNode_23);
            m_CachedFlow.AddNodeToFlow(TrapRoomNode_25, TrapRoomNode_24);
            m_CachedFlow.AddNodeToFlow(lastConnectorNode, TrapRoomNode_25);
            m_CachedFlow.AddNodeToFlow(exitNode, lastConnectorNode);
            m_CachedFlow.FirstNode = entranceNode;

            return(m_CachedFlow);
        }
        public static DungeonFlow Apache_Fucking_Around_Flow()
        {
            DungeonFlowSubtypeRestriction m_SubTypeRestrictions = new DungeonFlowSubtypeRestriction()
            {
                baseCategoryRestriction       = PrototypeDungeonRoom.RoomCategory.NORMAL,
                normalSubcategoryRestriction  = PrototypeDungeonRoom.RoomNormalSubCategory.TRAP,
                bossSubcategoryRestriction    = PrototypeDungeonRoom.RoomBossSubCategory.FLOOR_BOSS,
                specialSubcategoryRestriction = PrototypeDungeonRoom.RoomSpecialSubCategory.UNSPECIFIED_SPECIAL,
                secretSubcategoryRestriction  = PrototypeDungeonRoom.RoomSecretSubCategory.UNSPECIFIED_SECRET,
                maximumRoomsOfSubtype         = 1
            };

            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            bool SecretRoomSelector = BraveUtility.RandomBool();

            m_CachedFlow.name = "Apache_Fucking_Around_Flow";
            m_CachedFlow.fallbackRoomTable   = ExpandPrefabs.CustomRoomTable2;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>()
            {
                m_SubTypeRestrictions
            };
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>(0);

            m_CachedFlow.Initialize();

            DungeonFlowNode m_EntranceNode  = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.ENTRANCE, ExpandPrefabs.elevator_entrance);
            DungeonFlowNode m_ExitNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandPrefabs.tiny_exit);
            DungeonFlowNode m_BossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandPrefabs.doublebeholsterroom01);
            DungeonFlowNode m_BossFoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.boss_foyer);

            // First chain of nodes starting off Entrance
            DungeonFlowNode m_ConnectorNode_01     = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode m_ConnectorNode_02     = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode m_ConnectorNode_03     = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode m_ConnectorNode_04     = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode m_ShopNode             = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.shop_room_table);
            DungeonFlowNode m_HubNode              = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB);
            DungeonFlowNode m_RewardNode_01        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room);
            DungeonFlowNode m_RewardNode_02        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room);
            DungeonFlowNode m_RewardNode_03        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.gungeon_rewardroom_1);
            DungeonFlowNode m_NormalNode_01        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_02        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_03        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_04        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_05        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_06        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_07        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_08        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_09        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_NormalNode_10        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_SecretNode_01        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET);
            DungeonFlowNode m_SecretNode_02        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET);
            DungeonFlowNode m_LoopTargetNormalNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, oneWayLoopTarget: true);

            // Warp Wing chain
            DungeonFlowNode m_WarpWingConnectorNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Expand_SecretElevatorDestinationRoom, isWarpWingNode: true);
            DungeonFlowNode m_WarpWingConnectorNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode m_WarpWingConnectorNode_03 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode m_WarpWingConnectorNode_04 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode m_WarpWingNormalNode_01    = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_WarpWingNormalNode_02    = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_WarpWingNormalNode_03    = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode m_WarpWingRewardNode_01    = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room);

            // Assign special elevator entrance room to one of the two guranteed secret rooms on this flow.
            if (SecretRoomSelector)
            {
                m_SecretNode_01.overrideExactRoom = ExpandRoomPrefabs.Expand_SecretElevatorEntranceRoom;
            }
            else
            {
                m_SecretNode_02.overrideExactRoom = ExpandRoomPrefabs.Expand_SecretElevatorEntranceRoom;
            }

            m_CachedFlow.AddNodeToFlow(m_EntranceNode, null);
            m_CachedFlow.AddNodeToFlow(m_ConnectorNode_01, m_EntranceNode);
            m_CachedFlow.AddNodeToFlow(m_ConnectorNode_02, m_ConnectorNode_01);
            m_CachedFlow.AddNodeToFlow(m_ConnectorNode_03, m_ConnectorNode_02);
            // Shop node branching off first connector node
            m_CachedFlow.AddNodeToFlow(m_ShopNode, m_ConnectorNode_01);
            // Huh node. A chest node then normal node leading to boss room/exit with a normal node and loop nodes connected to exit.
            m_CachedFlow.AddNodeToFlow(m_HubNode, m_ConnectorNode_01);
            m_CachedFlow.AddNodeToFlow(m_RewardNode_01, m_HubNode);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_01, m_HubNode);
            m_CachedFlow.AddNodeToFlow(m_BossFoyerNode, m_NormalNode_01);
            m_CachedFlow.AddNodeToFlow(m_BossNode, m_BossFoyerNode);
            m_CachedFlow.AddNodeToFlow(m_ExitNode, m_BossNode);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_02, m_ExitNode);
            m_CachedFlow.AddNodeToFlow(m_LoopTargetNormalNode, m_ExitNode);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_03, m_LoopTargetNormalNode);
            m_CachedFlow.AddNodeToFlow(m_RewardNode_02, m_NormalNode_03);
            // Connect end of this chain back to first node in loop chain.
            m_CachedFlow.LoopConnectNodes(m_RewardNode_02, m_LoopTargetNormalNode);


            // Branch of nodes that leads off hub to mainly normal rooms, a chest and a couple secret rooms.
            m_CachedFlow.AddNodeToFlow(m_NormalNode_04, m_HubNode);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_05, m_NormalNode_04);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_06, m_NormalNode_05);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_07, m_NormalNode_06);
            m_CachedFlow.AddNodeToFlow(m_SecretNode_01, m_NormalNode_06);

            m_CachedFlow.AddNodeToFlow(m_NormalNode_08, m_NormalNode_05);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_09, m_NormalNode_08);
            m_CachedFlow.AddNodeToFlow(m_NormalNode_10, m_NormalNode_09);
            m_CachedFlow.AddNodeToFlow(m_SecretNode_02, m_NormalNode_10);
            m_CachedFlow.AddNodeToFlow(m_RewardNode_03, m_NormalNode_10);

            // Warpwing CHain of nodes with 1 reward room
            m_CachedFlow.AddNodeToFlow(m_WarpWingConnectorNode_01, m_HubNode);
            m_CachedFlow.AddNodeToFlow(m_WarpWingNormalNode_01, m_WarpWingConnectorNode_01);
            m_CachedFlow.AddNodeToFlow(m_WarpWingRewardNode_01, m_WarpWingNormalNode_01);
            m_CachedFlow.AddNodeToFlow(m_WarpWingConnectorNode_02, m_WarpWingConnectorNode_01);
            m_CachedFlow.AddNodeToFlow(m_WarpWingNormalNode_02, m_WarpWingConnectorNode_02);
            m_CachedFlow.AddNodeToFlow(m_WarpWingConnectorNode_03, m_WarpWingNormalNode_02);
            m_CachedFlow.AddNodeToFlow(m_WarpWingConnectorNode_04, m_WarpWingConnectorNode_03);
            m_CachedFlow.AddNodeToFlow(m_WarpWingNormalNode_03, m_WarpWingConnectorNode_04);


            m_CachedFlow.FirstNode = m_EntranceNode;

            return(m_CachedFlow);
        }
Example #4
0
        public static DungeonFlow Custom_GlitchChestAlt_Flow()
        {
            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            List <DungeonFlowNode> m_cachedNodes_01 = new List <DungeonFlowNode>();
            List <DungeonFlowNode> m_cachedNodes_02 = new List <DungeonFlowNode>();
            List <DungeonFlowNode> m_cachedNodes_03 = new List <DungeonFlowNode>();
            List <DungeonFlowNode> m_cachedNodes_04 = new List <DungeonFlowNode>();

            DungeonFlowNode m_EntranceNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.ENTRANCE, ExpandPrefabs.big_entrance);
            DungeonFlowNode m_HubNode           = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB);
            DungeonFlowNode m_ShopNode_01       = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.shop_room_table);
            DungeonFlowNode m_ChestRoom_01      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room, oneWayLoopTarget: true);
            DungeonFlowNode m_ChestRoom_02      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.REWARD, ExpandPrefabs.gungeon_rewardroom_1);
            DungeonFlowNode m_ChestRoom_03      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.REWARD, ExpandPrefabs.gungeon_rewardroom_1);
            DungeonFlowNode m_ChestRoom_04      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room, oneWayLoopTarget: true);
            DungeonFlowNode m_ExitNode          = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandPrefabs.tiny_exit);
            DungeonFlowNode m_BossFoyerNode     = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.boss_foyer);
            DungeonFlowNode m_BossNode          = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandPrefabs.doublebeholsterroom01);
            DungeonFlowNode m_FakeBossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandPrefabs.tutorial_minibossroom);
            DungeonFlowNode m_FakeBossFoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.boss_foyer);


            for (int i = 0; i < LoopRoomCount + 1; i++)
            {
                m_cachedNodes_01.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL));
                m_cachedNodes_04.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL));
            }

            for (int i = 0; i < SingleChainRoomCount + 1; i++)
            {
                m_cachedNodes_02.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL));
                m_cachedNodes_03.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL));
            }

            m_cachedNodes_01[0].roomCategory                    = PrototypeDungeonRoom.RoomCategory.CONNECTOR;
            m_cachedNodes_01[LoopRoomCount].roomCategory        = PrototypeDungeonRoom.RoomCategory.CONNECTOR;
            m_cachedNodes_02[0].roomCategory                    = PrototypeDungeonRoom.RoomCategory.CONNECTOR;
            m_cachedNodes_02[SingleChainRoomCount].roomCategory = PrototypeDungeonRoom.RoomCategory.CONNECTOR;
            m_cachedNodes_03[0].roomCategory                    = PrototypeDungeonRoom.RoomCategory.CONNECTOR;
            m_cachedNodes_03[SingleChainRoomCount].roomCategory = PrototypeDungeonRoom.RoomCategory.CONNECTOR;
            m_cachedNodes_04[0].roomCategory                    = PrototypeDungeonRoom.RoomCategory.CONNECTOR;
            m_cachedNodes_04[LoopRoomCount].roomCategory        = PrototypeDungeonRoom.RoomCategory.CONNECTOR;

            bool bossShuffle = BraveUtility.RandomBool();

            m_CachedFlow.name = "Custom_GlitchChestAlt_Flow";
            m_CachedFlow.fallbackRoomTable   = ExpandPrefabs.CustomRoomTable2;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>()
            {
                ExpandDungeonFlow.BaseSubTypeRestrictions
            };
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>()
            {
                ExpandDungeonFlow.BaseSharedInjectionData
            };


            m_CachedFlow.Initialize();

            // Hub area
            m_CachedFlow.AddNodeToFlow(m_HubNode, null);

            // Big Entrance with first loop.
            m_CachedFlow.AddNodeToFlow(m_EntranceNode, m_HubNode);

            m_CachedFlow.AddNodeToFlow(m_cachedNodes_01[0], m_HubNode);
            for (int i = 1; i < LoopRoomCount + 1; i++)
            {
                m_CachedFlow.AddNodeToFlow(m_cachedNodes_01[i], m_cachedNodes_01[i - 1]);
            }

            m_CachedFlow.AddNodeToFlow(m_ShopNode_01, m_cachedNodes_01[LoopRoomCount]);
            m_CachedFlow.AddNodeToFlow(m_ChestRoom_01, m_ShopNode_01);
            m_CachedFlow.LoopConnectNodes(m_HubNode, m_ChestRoom_01);

            // Maybe boss path. :P
            m_CachedFlow.AddNodeToFlow(m_cachedNodes_02[0], m_HubNode);
            for (int i = 1; i < SingleChainRoomCount + 1; i++)
            {
                m_CachedFlow.AddNodeToFlow(m_cachedNodes_02[i], m_cachedNodes_02[i - 1]);
            }
            m_CachedFlow.AddNodeToFlow(m_ChestRoom_02, m_cachedNodes_02[SingleChainRoomCount]);
            if (bossShuffle)
            {
                m_CachedFlow.AddNodeToFlow(m_BossFoyerNode, m_ChestRoom_02);
                m_CachedFlow.AddNodeToFlow(m_BossNode, m_BossFoyerNode);
                m_CachedFlow.AddNodeToFlow(m_ExitNode, m_BossNode);
            }
            else
            {
                m_CachedFlow.AddNodeToFlow(m_FakeBossFoyerNode, m_ChestRoom_02);
                m_CachedFlow.AddNodeToFlow(m_FakeBossNode, m_FakeBossFoyerNode);
            }

            // Maybe boss path. :P
            m_CachedFlow.AddNodeToFlow(m_cachedNodes_03[0], m_EntranceNode);
            for (int i = 1; i < SingleChainRoomCount + 1; i++)
            {
                m_CachedFlow.AddNodeToFlow(m_cachedNodes_03[i], m_cachedNodes_03[i - 1]);
            }
            m_CachedFlow.AddNodeToFlow(m_ChestRoom_03, m_cachedNodes_03[SingleChainRoomCount]);
            if (bossShuffle)
            {
                m_CachedFlow.AddNodeToFlow(m_FakeBossFoyerNode, m_ChestRoom_03);
                m_CachedFlow.AddNodeToFlow(m_FakeBossNode, m_FakeBossFoyerNode);
            }
            else
            {
                m_CachedFlow.AddNodeToFlow(m_BossFoyerNode, m_ChestRoom_03);
                m_CachedFlow.AddNodeToFlow(m_BossNode, m_BossFoyerNode);
                m_CachedFlow.AddNodeToFlow(m_ExitNode, m_BossNode);
            }

            // Second Loop
            m_CachedFlow.AddNodeToFlow(m_cachedNodes_04[0], m_EntranceNode);
            for (int i = 1; i < LoopRoomCount + 1; i++)
            {
                m_CachedFlow.AddNodeToFlow(m_cachedNodes_04[i], m_cachedNodes_04[i - 1]);
            }
            m_CachedFlow.AddNodeToFlow(m_ChestRoom_04, m_cachedNodes_04[LoopRoomCount]);
            m_CachedFlow.LoopConnectNodes(m_ChestRoom_04, m_EntranceNode);
            m_CachedFlow.FirstNode = m_HubNode;

            return(m_CachedFlow);
        }
Example #5
0
        public static DungeonFlow F4c_West_Flow_01()
        {
            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            m_CachedFlow.name = "F4c_West_Flow_01";
            m_CachedFlow.fallbackRoomTable   = ExpandPrefabs.CustomRoomTableSecretGlitchFloor;
            m_CachedFlow.phantomRoomTable    = null;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>(0);
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>()
            {
                ExpandDungeonFlow.CustomSecretFloorSharedInjectionData
            };
            m_CachedFlow.Initialize();


            DungeonFlowNode entranceNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.ENTRANCE, ExpandRoomPrefabs.Expand_West_Entrance);
            DungeonFlowNode exitNode          = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandRoomPrefabs.SecretExitRoom);
            DungeonFlowNode fakebossFoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.boss_foyertable);
            DungeonFlowNode fakebossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandRoomPrefabs.FakeBossRoom);
            DungeonFlowNode westBossfoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.boss_foyertable);
            DungeonFlowNode westBossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandRoomPrefabs.Expand_West_WestBrosBossRoom);

            DungeonFlowNode             WestWinchesterNode   = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            List <PrototypeDungeonRoom> m_WinchesterRoomList = new List <PrototypeDungeonRoom>();

            foreach (WeightedRoom weightedRoom in ExpandPrefabs.winchesterroomtable.includedRooms.elements)
            {
                if (weightedRoom.room != null)
                {
                    m_WinchesterRoomList.Add(weightedRoom.room);
                }
            }

            if (m_WinchesterRoomList.Count > 0)
            {
                m_WinchesterRoomList = m_WinchesterRoomList.Shuffle();
                WestWinchesterNode.overrideExactRoom = BraveUtility.RandomElement(m_WinchesterRoomList);
            }

            DungeonFlowNode WestGunMuncherNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, ExpandPrefabs.subshop_muncher_01);

            DungeonFlowNode WestShopNode        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.shop_room_table);
            DungeonFlowNode WestShopBackRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Expand_West_SecretShopWarp, handlesOwnWarping: false);

            DungeonFlowNode WestChestRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.REWARD, ExpandRoomPrefabs.Expand_West_ChestRoom);
            DungeonFlowNode WestChestRoom_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.REWARD, ExpandRoomPrefabs.Expand_West_ChestRoom);

            DungeonFlowNode WestSecretRoom_01       = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET, ExpandRoomPrefabs.Expand_West_SecretKeyShop);
            DungeonFlowNode WestSecretSpacerRoom_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET, ExpandRoomPrefabs.Expand_TinySecretEmpty);
            DungeonFlowNode WestSecretWarp_01       = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_West_SecretWarp, handlesOwnWarping: false);
            DungeonFlowNode WestSecretHub_01        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB, ExpandRoomPrefabs.Expand_West_SecretHub, isWarpWingNode: true, handlesOwnWarping: false);
            DungeonFlowNode WestSecretHub_02        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB, ExpandRoomPrefabs.Expand_West_SecretHub2, isWarpWingNode: true, handlesOwnWarping: false);

            DungeonFlowNode WestRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestCanyonRoomTable);
            DungeonFlowNode WestRoom_03 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_04 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_05 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_06 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_07 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_08 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestCanyonRoomTable);
            DungeonFlowNode WestRoom_09 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_10 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestCanyonRoomTable);
            DungeonFlowNode WestRoom_11 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);
            DungeonFlowNode WestRoom_12 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestTinyCanyonRoomTable);

            DungeonFlowNode WestRoom_13 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestInterior1RoomTable);
            DungeonFlowNode WestRoom_14 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestInterior1RoomTable);
            DungeonFlowNode WestRoom_15 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestInterior1RoomTable);
            DungeonFlowNode WestRoom_16 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.WestInterior1RoomTable);

            DungeonFlowNode MinibossRoom_01        = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, overrideTable: ExpandPrefabs.MegaMiniBossRoomTable);
            DungeonFlowNode ChallengeShrineRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.MegaChallengeShrineTable);
            DungeonFlowNode ShrineRoom_01          = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, ExpandRoomPrefabs.Expand_West_ShrineRoom);

            ShrineRoom_01.forcedDoorType = DungeonFlowNode.ForcedDoorType.LOCKED;
            DungeonFlowNode SpecialRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.basic_special_rooms_noBlackMarket);

            DungeonFlowNode BlankRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Expand_West_BlankPedestalRoom);
            DungeonFlowNode BlankRoom_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Expand_West_BlankPedestalRoom);

            DungeonFlowNode RatKeyRoom_01       = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Expand_West_RatKeyPedestalRoom);
            DungeonFlowNode RatKeyRoom_02       = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Expand_West_RatKeyPedestalRoom);
            DungeonFlowNode SecretRatKeyRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET, ExpandRoomPrefabs.Expand_West_SecretRatKeyPedestalRoom);
            DungeonFlowNode SecretRatKeyRoom_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET, ExpandRoomPrefabs.Expand_West_SecretRatKeyPedestalRoom);


            DungeonFlowNode PuzzleRoom_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.PuzzleRoom1);
            DungeonFlowNode PuzzleRoom_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.PuzzleRoom2);
            DungeonFlowNode PuzzleRoom_03 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.PuzzleRoom3);

            DungeonFlowNode m_SpecialRewardNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.SecretRewardRoom);

            DungeonFlowNode m_SecretBossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandRoomPrefabs.GungeoneerMimicBossRoom);
            DungeonFlowNode m_SecretBossFoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, ExpandPrefabs.DragunBossFoyerRoom);
            // DungeonFlowNode m_SecretBossFoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.boss_foyertable);
            DungeonFlowNode m_SecretBossExitNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_West_RatKeyPedestalRoom);

            // DungeonFlowNode m_SecretBossExitNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandPrefabs.DraGunExitRoom);
            // DungeonFlowNode m_SecretBossEndTimesNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandPrefabs.DraGunEndTimesRoom, isWarpWingNode: true);
            // DungeonFlowNode m_SecretBossShopNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, ExpandPrefabs.BlacksmithShop);

            m_CachedFlow.AddNodeToFlow(entranceNode, null);
            m_CachedFlow.AddNodeToFlow(WestRoom_01, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_03, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_04, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_05, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_06, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_07, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_09, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_11, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestRoom_12, entranceNode);
            m_CachedFlow.AddNodeToFlow(WestGunMuncherNode, WestRoom_03);
            m_CachedFlow.AddNodeToFlow(WestWinchesterNode, WestRoom_11);

            m_CachedFlow.AddNodeToFlow(WestRoom_08, WestRoom_07);
            m_CachedFlow.AddNodeToFlow(BlankRoom_01, WestRoom_08);

            m_CachedFlow.AddNodeToFlow(BlankRoom_02, WestRoom_05);

            m_CachedFlow.AddNodeToFlow(WestChestRoom_01, WestRoom_01);
            m_CachedFlow.AddNodeToFlow(WestChestRoom_02, WestRoom_09);

            m_CachedFlow.AddNodeToFlow(WestSecretRoom_01, WestChestRoom_02);
            m_CachedFlow.AddNodeToFlow(WestSecretSpacerRoom_02, WestSecretRoom_01);
            m_CachedFlow.AddNodeToFlow(WestSecretWarp_01, WestSecretSpacerRoom_02);
            m_CachedFlow.AddNodeToFlow(WestSecretHub_01, WestSecretWarp_01);

            m_CachedFlow.AddNodeToFlow(SecretRatKeyRoom_01, WestSecretHub_01);
            m_CachedFlow.AddNodeToFlow(WestRoom_13, WestSecretHub_01);
            m_CachedFlow.AddNodeToFlow(ShrineRoom_01, WestRoom_13);
            m_CachedFlow.AddNodeToFlow(SpecialRoom_01, WestRoom_13);

            m_CachedFlow.AddNodeToFlow(ChallengeShrineRoom_01, WestSecretHub_01);
            m_CachedFlow.AddNodeToFlow(WestRoom_14, ChallengeShrineRoom_01);
            m_CachedFlow.AddNodeToFlow(WestRoom_15, WestRoom_14);
            m_CachedFlow.AddNodeToFlow(SecretRatKeyRoom_02, WestRoom_15);

            m_CachedFlow.AddNodeToFlow(WestRoom_16, WestRoom_14);
            m_CachedFlow.AddNodeToFlow(MinibossRoom_01, WestRoom_16);
            m_CachedFlow.AddNodeToFlow(RatKeyRoom_01, MinibossRoom_01);

            m_CachedFlow.AddNodeToFlow(WestShopNode, WestRoom_06);
            m_CachedFlow.AddNodeToFlow(WestShopBackRoom_01, WestShopNode);
            m_CachedFlow.AddNodeToFlow(WestSecretHub_02, WestShopBackRoom_01);
            m_CachedFlow.AddNodeToFlow(PuzzleRoom_01, WestSecretHub_02);
            m_CachedFlow.AddNodeToFlow(PuzzleRoom_02, WestSecretHub_02);
            m_CachedFlow.AddNodeToFlow(PuzzleRoom_03, WestSecretHub_02);
            m_CachedFlow.AddNodeToFlow(m_SpecialRewardNode, WestSecretHub_02);
            // m_CachedFlow.AddNodeToFlow(m_SecretBossShopNode, m_SpecialRewardNode);
            m_CachedFlow.AddNodeToFlow(m_SecretBossFoyerNode, m_SpecialRewardNode);
            // m_CachedFlow.AddNodeToFlow(m_SecretBossFoyerNode, m_SecretBossShopNode);
            m_CachedFlow.AddNodeToFlow(m_SecretBossNode, m_SecretBossFoyerNode);
            m_CachedFlow.AddNodeToFlow(m_SecretBossExitNode, m_SecretBossNode);
            // m_CachedFlow.AddNodeToFlow(m_SecretBossEndTimesNode, m_SecretBossExitNode);

            m_CachedFlow.AddNodeToFlow(WestRoom_02, WestRoom_12);
            m_CachedFlow.AddNodeToFlow(westBossfoyerNode, WestRoom_02);
            m_CachedFlow.AddNodeToFlow(westBossNode, westBossfoyerNode);
            m_CachedFlow.AddNodeToFlow(exitNode, westBossNode);

            m_CachedFlow.AddNodeToFlow(WestRoom_10, WestRoom_04);
            m_CachedFlow.AddNodeToFlow(fakebossFoyerNode, WestRoom_10);
            m_CachedFlow.AddNodeToFlow(fakebossNode, fakebossFoyerNode);
            m_CachedFlow.AddNodeToFlow(RatKeyRoom_02, fakebossNode);

            m_CachedFlow.FirstNode = entranceNode;

            return(m_CachedFlow);
        }
Example #6
0
        public static DungeonFlow Test_CustomRoom_Flow()
        {
            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            DungeonFlowNode entranceNode  = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.ENTRANCE, ExpandPrefabs.elevator_entrance);
            DungeonFlowNode exitNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandRoomPrefabs.SecretExitRoom);
            DungeonFlowNode bossfoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.boss_foyertable);
            DungeonFlowNode bossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandRoomPrefabs.Expand_West_WestBrosBossRoom);

            DungeonFlowNode TestRoomNode_0 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_Apache_RickRollChest);

            DungeonFlowNode TestRoomNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_Apache_SurpriseChest);

            DungeonFlowNode TestShopNode   = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, ExpandPrefabs.shop02.category, overrideTable: ExpandPrefabs.shop_room_table);
            DungeonFlowNode TestRewardNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.gungeon_rewardroom_1);

            DungeonFlowNode TestSecretRoomNode  = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET, ExpandRoomPrefabs.Expand_GlitchedSecret);
            DungeonFlowNode testConnectorNode01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_BootlegRoom);

            DungeonFlowNode TestRoomNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_Apache_RainbowRoom);
            DungeonFlowNode TestRoomNode_03 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.SecretRewardRoom);

            // DungeonFlowNode SecondSecretRoom = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SECRET, ExpandRoomPrefabs.Secret_Expand_logo);

            /*foreach (PrototypeDungeonRoom room in ExpandRoomPrefabs.Expand_Jungle_Rooms) {
             *  if (room.name == "Expand_Forest_Mixed22") {
             *      TestRoomNode_02.overrideExactRoom = room;
             *      break;
             *  }
             * }*/

            m_CachedFlow.name = "Test_CustomRoom_Flow";
            m_CachedFlow.fallbackRoomTable   = null;
            m_CachedFlow.phantomRoomTable    = null;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>(0);
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>(0);
            m_CachedFlow.sharedInjectionData.Add(ExpandDungeonFlow.HollowsInjectionData);

            m_CachedFlow.Initialize();

            m_CachedFlow.AddNodeToFlow(entranceNode, null);
            m_CachedFlow.AddNodeToFlow(TestRoomNode_01, entranceNode);
            m_CachedFlow.AddNodeToFlow(TestRoomNode_0, entranceNode);

            m_CachedFlow.AddNodeToFlow(TestRewardNode, TestRoomNode_01);
            m_CachedFlow.AddNodeToFlow(TestSecretRoomNode, TestRewardNode);

            m_CachedFlow.AddNodeToFlow(TestShopNode, TestRoomNode_01);
            m_CachedFlow.AddNodeToFlow(bossfoyerNode, TestShopNode);
            m_CachedFlow.AddNodeToFlow(bossNode, bossfoyerNode);
            m_CachedFlow.AddNodeToFlow(exitNode, bossNode);
            // m_CachedFlow.AddNodeToFlow(SecondSecretRoom, TestShopNode);

            m_CachedFlow.AddNodeToFlow(testConnectorNode01, TestRoomNode_01);
            m_CachedFlow.AddNodeToFlow(TestRoomNode_02, testConnectorNode01);
            m_CachedFlow.AddNodeToFlow(TestRoomNode_03, TestRoomNode_02);


            m_CachedFlow.FirstNode = entranceNode;

            return(m_CachedFlow);
        }
        public static DungeonFlow Really_Big_Flow()
        {
            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            DungeonFlowSubtypeRestriction TestSubTypeRestriction = new DungeonFlowSubtypeRestriction()
            {
                baseCategoryRestriction       = PrototypeDungeonRoom.RoomCategory.NORMAL,
                normalSubcategoryRestriction  = PrototypeDungeonRoom.RoomNormalSubCategory.TRAP,
                bossSubcategoryRestriction    = PrototypeDungeonRoom.RoomBossSubCategory.FLOOR_BOSS,
                specialSubcategoryRestriction = PrototypeDungeonRoom.RoomSpecialSubCategory.UNSPECIFIED_SPECIAL,
                secretSubcategoryRestriction  = PrototypeDungeonRoom.RoomSecretSubCategory.UNSPECIFIED_SECRET,
                maximumRoomsOfSubtype         = 1
            };

            DungeonFlowNode EntranceNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.ENTRANCE,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.big_entrance,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode BossFoyerNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.CONNECTOR,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.DragunBossFoyerRoom,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode BossNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.BOSS,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.DraGunRoom01,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode BossExitNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.EXIT,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.DraGunExitRoom,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode BossEndTimesNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.EXIT,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.DraGunEndTimesRoom,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = true,
                handlesOwnWarping         = true,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode FirstShopNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.CONNECTOR,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.BlacksmithShop,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode SecondShopNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.SPECIAL,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = null,
                overrideRoomTable         = ExpandPrefabs.shop_room_table,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode MiniBossFoyerNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.CONNECTOR,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.DragunBossFoyerRoom,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };
            DungeonFlowNode FakebossNode = new DungeonFlowNode(m_CachedFlow)
            {
                isSubchainStandin         = false,
                nodeType                  = DungeonFlowNode.ControlNodeType.ROOM,
                roomCategory              = PrototypeDungeonRoom.RoomCategory.CONNECTOR,
                percentChance             = 1f,
                priority                  = DungeonFlowNode.NodePriority.MANDATORY,
                overrideExactRoom         = ExpandPrefabs.tutorial_fakeboss,
                overrideRoomTable         = null,
                capSubchain               = false,
                subchainIdentifier        = string.Empty,
                limitedCopiesOfSubchain   = false,
                maxCopiesOfSubchain       = 1,
                subchainIdentifiers       = new List <string>(0),
                receivesCaps              = false,
                isWarpWingEntrance        = false,
                handlesOwnWarping         = false,
                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,
                parentNodeGuid            = string.Empty,
                childNodeGuids            = new List <string>(0),
                loopTargetNodeGuid        = string.Empty,
                loopTargetIsOneWay        = false,
                guidAsString              = Guid.NewGuid().ToString(),
            };

            List <DungeonFlowNode> ConnectorNodes = new List <DungeonFlowNode>();
            List <DungeonFlowNode> NormalNodes    = new List <DungeonFlowNode>();
            List <DungeonFlowNode> ChestNodes     = new List <DungeonFlowNode>();

            for (int i = 0; i < 11; i++)
            {
                ConnectorNodes.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR));
            }
            for (int i = 0; i < 89; i++)
            {
                NormalNodes.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL));
            }

            ChestNodes.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.REWARD, ExpandPrefabs.reward_room));
            ChestNodes.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room));
            ChestNodes.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room));
            ChestNodes.Add(ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.reward_room));

            m_CachedFlow.name = "Really_Big_Flow";
            m_CachedFlow.fallbackRoomTable   = ExpandPrefabs.CustomRoomTable2;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>(0); // { TestSubTypeRestriction };
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>(0);           // { ChaosDungeonFlows.BaseSharedInjectionData };
            m_CachedFlow.Initialize();

            m_CachedFlow.AddNodeToFlow(EntranceNode, null);
            m_CachedFlow.AddNodeToFlow(ConnectorNodes[10], EntranceNode);
            m_CachedFlow.AddNodeToFlow(FirstShopNode, ConnectorNodes[10]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[88], ConnectorNodes[10]);

            // First chain of 25 nodes starting at 99 and moving down
            m_CachedFlow.AddNodeToFlow(NormalNodes[87], NormalNodes[88]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[86], NormalNodes[87]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[85], NormalNodes[86]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[84], NormalNodes[85]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[83], NormalNodes[84]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[82], NormalNodes[83]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[81], NormalNodes[82]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[80], NormalNodes[81]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[79], NormalNodes[80]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[78], NormalNodes[79]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[77], NormalNodes[78]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[76], NormalNodes[77]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[75], NormalNodes[76]);
            // Chest 1
            m_CachedFlow.AddNodeToFlow(ChestNodes[0], NormalNodes[75]);

            //Start of Second Chain
            ConnectorNodes[9].roomCategory = PrototypeDungeonRoom.RoomCategory.HUB;
            m_CachedFlow.AddNodeToFlow(ConnectorNodes[9], NormalNodes[75]);

            m_CachedFlow.AddNodeToFlow(NormalNodes[74], ConnectorNodes[9]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[73], NormalNodes[74]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[72], NormalNodes[73]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[71], NormalNodes[72]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[70], NormalNodes[71]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[69], NormalNodes[70]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[68], NormalNodes[69]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[67], NormalNodes[68]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[66], NormalNodes[67]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[65], NormalNodes[66]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[64], NormalNodes[65]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[63], NormalNodes[64]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[62], NormalNodes[63]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[61], NormalNodes[62]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[60], NormalNodes[61]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[59], NormalNodes[60]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[58], NormalNodes[59]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[57], NormalNodes[58]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[56], NormalNodes[57]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[55], NormalNodes[56]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[54], NormalNodes[55]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[53], NormalNodes[54]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[52], NormalNodes[53]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[51], NormalNodes[52]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[50], NormalNodes[51]);
            // Chest 2
            m_CachedFlow.AddNodeToFlow(ChestNodes[1], NormalNodes[50]);
            m_CachedFlow.AddNodeToFlow(SecondShopNode, ChestNodes[1]);

            //Start of Third Chain
            m_CachedFlow.AddNodeToFlow(NormalNodes[49], ConnectorNodes[9]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[48], NormalNodes[49]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[47], NormalNodes[48]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[46], NormalNodes[47]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[45], NormalNodes[46]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[44], NormalNodes[45]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[43], NormalNodes[44]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[42], NormalNodes[43]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[41], NormalNodes[42]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[40], NormalNodes[41]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[39], NormalNodes[40]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[38], NormalNodes[39]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[37], NormalNodes[38]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[36], NormalNodes[37]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[35], NormalNodes[36]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[34], NormalNodes[35]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[33], NormalNodes[34]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[32], NormalNodes[33]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[31], NormalNodes[32]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[30], NormalNodes[31]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[29], NormalNodes[30]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[28], NormalNodes[29]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[27], NormalNodes[28]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[26], NormalNodes[27]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[25], NormalNodes[26]);
            // Chest 3
            m_CachedFlow.AddNodeToFlow(ChestNodes[2], NormalNodes[25]);
            m_CachedFlow.AddNodeToFlow(MiniBossFoyerNode, ChestNodes[2]);
            m_CachedFlow.AddNodeToFlow(FakebossNode, MiniBossFoyerNode);


            //Start of Fourth Chain
            m_CachedFlow.AddNodeToFlow(NormalNodes[24], ConnectorNodes[9]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[23], NormalNodes[24]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[22], NormalNodes[23]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[21], NormalNodes[22]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[20], NormalNodes[21]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[19], NormalNodes[20]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[18], NormalNodes[19]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[17], NormalNodes[18]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[16], NormalNodes[17]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[15], NormalNodes[16]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[14], NormalNodes[15]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[13], NormalNodes[14]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[12], NormalNodes[13]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[11], NormalNodes[12]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[10], NormalNodes[11]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[9], NormalNodes[10]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[8], NormalNodes[9]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[7], NormalNodes[8]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[6], NormalNodes[7]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[5], NormalNodes[6]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[4], NormalNodes[5]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[3], NormalNodes[4]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[2], NormalNodes[3]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[1], NormalNodes[2]);
            m_CachedFlow.AddNodeToFlow(NormalNodes[0], NormalNodes[1]);
            // Chest 4
            m_CachedFlow.AddNodeToFlow(ChestNodes[3], NormalNodes[0]);

            // Boss
            m_CachedFlow.AddNodeToFlow(BossFoyerNode, ChestNodes[3]);
            m_CachedFlow.AddNodeToFlow(BossNode, BossFoyerNode);
            m_CachedFlow.AddNodeToFlow(BossExitNode, BossNode);
            m_CachedFlow.AddNodeToFlow(BossEndTimesNode, BossExitNode);

            // m_CachedFlow.LoopConnectNodes(ComplexFlowNode_05, ComplexFlowNode_09);

            m_CachedFlow.FirstNode = EntranceNode;

            return(m_CachedFlow);
        }
        public static DungeonFlow F2b_Belly_Flow_01()
        {
            DungeonFlow m_CachedFlow = ScriptableObject.CreateInstance <DungeonFlow>();

            if (!ExpandDungeonFlow.BellyInjectionData)
            {
                ExpandDungeonFlow.BellyInjectionData      = ScriptableObject.CreateInstance <SharedInjectionData>();
                ExpandDungeonFlow.BellyInjectionData.name = "Belly Common Injection Data";
                ExpandDungeonFlow.BellyInjectionData.UseInvalidWeightAsNoInjection         = true;
                ExpandDungeonFlow.BellyInjectionData.PreventInjectionOfFailedPrerequisites = false;
                ExpandDungeonFlow.BellyInjectionData.IsNPCCell = false;
                ExpandDungeonFlow.BellyInjectionData.IgnoreUnmetPrerequisiteEntries = false;
                ExpandDungeonFlow.BellyInjectionData.OnlyOne               = false;
                ExpandDungeonFlow.BellyInjectionData.ChanceToSpawnOne      = 0.5f;
                ExpandDungeonFlow.BellyInjectionData.AttachedInjectionData = new List <SharedInjectionData>(0);
                ExpandDungeonFlow.BellyInjectionData.InjectionData         = new List <ProceduralFlowModifierData>(0);
            }

            DungeonFlowNode entranceNode  = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.ENTRANCE, ExpandRoomPrefabs.Expand_Belly_Entrance);
            DungeonFlowNode exitNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.EXIT, ExpandRoomPrefabs.Expand_Belly_ExitHub);
            DungeonFlowNode exitNode2     = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandRoomPrefabs.Expand_Belly_RealExit);
            DungeonFlowNode bossfoyerNode = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.SPECIAL, overrideTable: ExpandPrefabs.boss_foyertable);
            DungeonFlowNode bossNode      = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.BOSS, ExpandRoomPrefabs.Expand_Belly_BossRoom);

            DungeonFlowNode BellyRewardNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.gungeon_rewardroom_1);
            DungeonFlowNode BellyRewardNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR, ExpandPrefabs.gungeon_rewardroom_1);
            DungeonFlowNode BellyRewardNode_03 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_Belly_Reward);
            DungeonFlowNode BellyShrineNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL, ExpandRoomPrefabs.Expand_Belly_Shrine);

            DungeonFlowNode BellyRoomConnectorNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.CONNECTOR);
            DungeonFlowNode BellyRoomConnectorNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.HUB);

            DungeonFlowNode BellyRoomNode_01 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_02 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_03 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_04 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_05 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_06 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_07 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_10 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_11 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_12 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_13 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_14 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_15 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_16 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);
            DungeonFlowNode BellyRoomNode_17 = ExpandDungeonFlow.GenerateDefaultNode(m_CachedFlow, PrototypeDungeonRoom.RoomCategory.NORMAL);


            m_CachedFlow.name = "F2b_Belly_Flow_01";
            m_CachedFlow.fallbackRoomTable   = ExpandPrefabs.BellyRoomTable;
            m_CachedFlow.phantomRoomTable    = null;
            m_CachedFlow.subtypeRestrictions = new List <DungeonFlowSubtypeRestriction>()
            {
                ExpandDungeonFlow.BaseSubTypeRestrictions
            };
            m_CachedFlow.flowInjectionData   = new List <ProceduralFlowModifierData>(0);
            m_CachedFlow.sharedInjectionData = new List <SharedInjectionData>()
            {
                ExpandDungeonFlow.BaseSharedInjectionData                                                                 /*, ExpandDungeonFlow.BellyInjectionData*/
            };
            m_CachedFlow.Initialize();

            m_CachedFlow.AddNodeToFlow(entranceNode, null);

            m_CachedFlow.AddNodeToFlow(BellyRoomNode_01, entranceNode);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_02, BellyRoomNode_01);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_03, BellyRoomNode_02);

            m_CachedFlow.AddNodeToFlow(BellyRoomConnectorNode_01, BellyRoomNode_03);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_04, BellyRoomConnectorNode_01);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_05, BellyRoomConnectorNode_01);
            m_CachedFlow.AddNodeToFlow(BellyRewardNode_01, BellyRoomNode_05);

            m_CachedFlow.AddNodeToFlow(BellyRoomNode_06, BellyRoomConnectorNode_01);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_07, BellyRoomNode_06);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_10, BellyRoomNode_07);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_11, BellyRoomNode_10);

            m_CachedFlow.AddNodeToFlow(BellyRoomConnectorNode_02, BellyRoomNode_11);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_12, BellyRoomConnectorNode_02);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_13, BellyRoomConnectorNode_02);
            m_CachedFlow.AddNodeToFlow(BellyRewardNode_02, BellyRoomNode_13);

            m_CachedFlow.AddNodeToFlow(BellyRoomNode_14, BellyRoomConnectorNode_02);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_15, BellyRoomConnectorNode_02);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_16, BellyRoomNode_15);
            m_CachedFlow.AddNodeToFlow(BellyRoomNode_17, BellyRoomNode_16);

            m_CachedFlow.AddNodeToFlow(bossfoyerNode, BellyRoomNode_17);
            m_CachedFlow.AddNodeToFlow(bossNode, bossfoyerNode);
            m_CachedFlow.AddNodeToFlow(exitNode, bossNode);

            m_CachedFlow.AddNodeToFlow(BellyRewardNode_03, exitNode);
            m_CachedFlow.AddNodeToFlow(BellyShrineNode_01, exitNode);
            m_CachedFlow.AddNodeToFlow(exitNode2, exitNode);

            m_CachedFlow.FirstNode = entranceNode;

            return(m_CachedFlow);
        }