示例#1
0
        /// <summary>
        /// Loads new Properties for Region.
        /// </summary>
        private static void Region_ctor(On.Region.orig_ctor orig, Region self, string name, int firstRoomIndex, int regionNumber)
        {
            orig(self, name, firstRoomIndex, regionNumber);

            foreach (KeyValuePair <string, string> keyValues in CustomWorldMod.activatedPacks)
            {
                //CustomWorldMod.CustomWorldLog($"Custom Regions: Loading custom properties for {keyValues.Key}");
                string path = CustomWorldMod.resourcePath + keyValues.Value + Path.DirectorySeparatorChar;

                string test = string.Concat(new object[]
                {
                    Custom.RootFolderDirectory(),
                    path.Replace('/', Path.DirectorySeparatorChar),
                    "World",
                    Path.DirectorySeparatorChar,
                    "Regions",
                    Path.DirectorySeparatorChar,
                    name,
                    Path.DirectorySeparatorChar,
                    "properties.txt"
                });
                if (File.Exists(test))
                {
                    //CustomWorldMod.CustomWorldLog($"Custom Regions: Found custom properties for {keyValues.Key}");
                    string[] array = File.ReadAllLines(test);
                    for (int i = 0; i < array.Length; i++)
                    {
                        string text = Regex.Split(array[i], ": ")[0];
                        if (text != null)
                        {
                            if (RegionHook.dictionaryProperties == null)
                            {
                                Dictionary <string, int> dictionary = new Dictionary <string, int>(15);
                                dictionary.Add("Room Setting Templates", 0);
                                dictionary.Add("batDepleteCyclesMin", 1);
                                dictionary.Add("batDepleteCyclesMax", 2);
                                dictionary.Add("batDepleteCyclesMaxIfLessThanTwoLeft", 3);
                                dictionary.Add("batDepleteCyclesMaxIfLessThanFiveLeft", 4);
                                dictionary.Add("overseersSpawnChance", 5);
                                dictionary.Add("overseersMin", 6);
                                dictionary.Add("overseersMax", 7);
                                dictionary.Add("playerGuideOverseerSpawnChance", 8);
                                dictionary.Add("scavsMin", 9);
                                dictionary.Add("scavsMax", 10);
                                dictionary.Add("scavsSpawnChance", 11);
                                dictionary.Add("Subregion", 12);
                                dictionary.Add("batsPerActiveSwarmRoom", 13);
                                dictionary.Add("batsPerInactiveSwarmRoom", 14);
                                RegionHook.dictionaryProperties = dictionary;
                            }
                            if (RegionHook.dictionaryProperties.TryGetValue(text, out int num))
                            {
                                switch (num)
                                {
                                case 0:
                                {
                                    string[] array2 = Regex.Split(Regex.Split(array[i], ": ")[1], ", ");
                                    self.roomSettingsTemplates    = new RoomSettings[array2.Length];
                                    self.roomSettingTemplateNames = new string[array2.Length];
                                    for (int j = 0; j < array2.Length; j++)
                                    {
                                        self.roomSettingTemplateNames[j] = array2[j];
                                        self.ReloadRoomSettingsTemplate(array2[j]);
                                        //CustomWorldMod.CustomWorldLog("Custom reload: " + self.roomSettingTemplateNames[j]);
                                        //CustomWorldMod.CustomWorldLog(self.roomSettingsTemplates[j].RandomItemDensity.ToString() + " " + self.roomSettingsTemplates[j].RandomItemSpearChance.ToString());
                                    }
                                    break;
                                }

                                case 1:
                                    self.regionParams.batDepleteCyclesMin = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 2:
                                    self.regionParams.batDepleteCyclesMax = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 3:
                                    self.regionParams.batDepleteCyclesMaxIfLessThanTwoLeft = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 4:
                                    self.regionParams.batDepleteCyclesMaxIfLessThanFiveLeft = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 5:
                                    self.regionParams.overseersSpawnChance = float.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 6:
                                    self.regionParams.overseersMin = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 7:
                                    self.regionParams.overseersMax = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 8:
                                    self.regionParams.playerGuideOverseerSpawnChance = float.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 9:
                                    self.regionParams.scavsMin = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 10:
                                    self.regionParams.scavsMax = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 11:
                                    self.regionParams.scavsSpawnChance = (float)int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 12:
                                    self.subRegions.Add(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 13:
                                    self.regionParams.batsPerActiveSwarmRoom = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 14:
                                    self.regionParams.batsPerInactiveSwarmRoom = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
示例#2
0
        /// <summary>
        /// Loads new Properties for Region. Templates and subregions are merged
        /// </summary>
        private static void Region_ctor(On.Region.orig_ctor orig, Region self, string name, int firstRoomIndex, int regionNumber)
        {
            CustomWorldMod.Log($"Creating region {name}", false, CustomWorldMod.DebugLevel.FULL);
            orig(self, name, firstRoomIndex, regionNumber);
            string[] vanillaTemplateNames = (string[])self.roomSettingTemplateNames.Clone();

            self.roomSettingTemplateNames = null;
            self.roomSettingsTemplates    = null;
            List <string> currentTemplateNames = null;

            foreach (KeyValuePair <string, string> keyValues in CustomWorldMod.activatedPacks)
            {
                CustomWorldMod.Log($"Loading custom Properties for {keyValues.Key}", false, CustomWorldMod.DebugLevel.FULL);

                string propertiesFilePath = CRExtras.BuildPath(keyValues.Value, CRExtras.CustomFolder.RegionID, regionID: name, file: "Properties.txt");

                if (File.Exists(propertiesFilePath))
                {
                    CustomWorldMod.Log($"Found custom properties for {keyValues.Key}", false, CustomWorldMod.DebugLevel.MEDIUM);
                    string[] array = File.ReadAllLines(propertiesFilePath);
                    for (int i = 0; i < array.Length; i++)
                    {
                        string text = Regex.Split(array[i], ": ")[0];
                        if (text != null)
                        {
                            if (RegionHook.dictionaryProperties == null)
                            {
                                Dictionary <string, int> dictionary = new Dictionary <string, int>(15);
                                dictionary.Add("Room Setting Templates", 0);
                                dictionary.Add("batDepleteCyclesMin", 1);
                                dictionary.Add("batDepleteCyclesMax", 2);
                                dictionary.Add("batDepleteCyclesMaxIfLessThanTwoLeft", 3);
                                dictionary.Add("batDepleteCyclesMaxIfLessThanFiveLeft", 4);
                                dictionary.Add("overseersSpawnChance", 5);
                                dictionary.Add("overseersMin", 6);
                                dictionary.Add("overseersMax", 7);
                                dictionary.Add("playerGuideOverseerSpawnChance", 8);
                                dictionary.Add("scavsMin", 9);
                                dictionary.Add("scavsMax", 10);
                                dictionary.Add("scavsSpawnChance", 11);
                                dictionary.Add("Subregion", 12);
                                dictionary.Add("batsPerActiveSwarmRoom", 13);
                                dictionary.Add("batsPerInactiveSwarmRoom", 14);
                                RegionHook.dictionaryProperties = dictionary;
                            }
                            if (RegionHook.dictionaryProperties.TryGetValue(text, out int num))
                            {
                                switch (num)
                                {
                                // Merging room template
                                case 0:
                                {
                                    string[] array2 = Regex.Split(Regex.Split(array[i], ": ")[1], ", ");
                                    if (array2 == null)
                                    {
                                        CustomWorldMod.Log($"Corrupted properties file [{propertiesFilePath}]", true);
                                        break;
                                    }
                                    int previousIndex = 0;

                                    // First region pack, init arrays
                                    if (self.roomSettingsTemplates == null)
                                    {
                                        CustomWorldMod.Log($"Creating templates for [{keyValues.Key}]", false, CustomWorldMod.DebugLevel.FULL);
                                        self.roomSettingsTemplates    = new RoomSettings[array2.Length];
                                        self.roomSettingTemplateNames = new string[array2.Length];
                                    }
                                    else
                                    {
                                        CustomWorldMod.Log($"Extending templates for [{keyValues.Key}]. " +
                                                           $"Previous index [{previousIndex}], " +
                                                           $"new size [{self.roomSettingsTemplates.Length + array2.Length}]", false, CustomWorldMod.DebugLevel.FULL);

                                        previousIndex = self.roomSettingTemplateNames.Length - 1;
                                        System.Array.Resize(ref self.roomSettingTemplateNames,
                                                            self.roomSettingTemplateNames.Length + array2.Length);

                                        System.Array.Resize(ref self.roomSettingsTemplates,
                                                            self.roomSettingsTemplates.Length + array2.Length);
                                    }

                                    currentTemplateNames = new List <string>(self.roomSettingTemplateNames);

                                    for (int j = 0; j < array2.Length; j++)
                                    {
                                        string newTemplate = array2[j];
                                        if (!currentTemplateNames.Contains(newTemplate))
                                        {
                                            CustomWorldMod.Log($"Adding new custom templates [{newTemplate}] at ({j + previousIndex}) for [{keyValues.Key}]",
                                                               false, CustomWorldMod.DebugLevel.FULL);

                                            self.roomSettingTemplateNames[previousIndex + j] = newTemplate;
                                            self.ReloadRoomSettingsTemplate(newTemplate);
                                        }
                                    }
                                    break;
                                }

                                case 1:
                                    self.regionParams.batDepleteCyclesMin = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 2:
                                    self.regionParams.batDepleteCyclesMax = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 3:
                                    self.regionParams.batDepleteCyclesMaxIfLessThanTwoLeft = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 4:
                                    self.regionParams.batDepleteCyclesMaxIfLessThanFiveLeft = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 5:
                                    self.regionParams.overseersSpawnChance = float.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 6:
                                    self.regionParams.overseersMin = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 7:
                                    self.regionParams.overseersMax = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 8:
                                    self.regionParams.playerGuideOverseerSpawnChance = float.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 9:
                                    self.regionParams.scavsMin = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 10:
                                    self.regionParams.scavsMax = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 11:
                                    self.regionParams.scavsSpawnChance = (float)int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 12:
                                    self.subRegions.Add(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 13:
                                    self.regionParams.batsPerActiveSwarmRoom = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;

                                case 14:
                                    self.regionParams.batsPerInactiveSwarmRoom = int.Parse(Regex.Split(array[i], ": ")[1]);
                                    break;
                                }
                            }
                        }
                    }
                }
            }


            // Add vanilla templates
            if (self.roomSettingsTemplates != null)
            {
                // merge
                currentTemplateNames = new List <string>(self.roomSettingTemplateNames);
            }
            else
            {
                CustomWorldMod.Log($"Loading vanilla templates for [{self.name}]...", false, CustomWorldMod.DebugLevel.MEDIUM);
                // load vanilla
                currentTemplateNames          = new List <string>();
                self.roomSettingsTemplates    = new RoomSettings[vanillaTemplateNames.Length];
                self.roomSettingTemplateNames = new string[vanillaTemplateNames.Length];
            }

            for (int j = 0; j < vanillaTemplateNames.Length; j++)
            {
                string newTemplate = vanillaTemplateNames[j];
                if (!currentTemplateNames.Contains(newTemplate))
                {
                    self.roomSettingTemplateNames[j] = newTemplate;
                    self.ReloadRoomSettingsTemplate(newTemplate);
                }
            }
            CustomWorldMod.Log($"Loaded setting templates: [{string.Join(", ", self.roomSettingTemplateNames)}]", false, CustomWorldMod.DebugLevel.MEDIUM);
        }