static void Skill_Data_IsExecStage(YotogiStage.Data stageData, ref bool __result, Skill.Data __instance)
        {
            for (int i = 0; i < stageData.prefabName.Length; i++)
            {
                string key = stageData.prefabName[i].ToString().Trim().ToLower();

                //Initialize
                if (YotogiAnywhere.defaultAvailableSkills == null)
                {
                    YotogiAnywhere.defaultAvailableSkills = new Dictionary <string, List <int> >();
                }

                //Add Stage to dictionary
                if (!YotogiAnywhere.defaultAvailableSkills.ContainsKey(key))
                {
                    YotogiAnywhere.defaultAvailableSkills[key] = new List <int>();
                }

                //Add skill id to stage's list
                if (__result && !YotogiAnywhere.defaultAvailableSkills[key].Contains(__instance.id))
                {
                    YotogiAnywhere.defaultAvailableSkills[key].Add(__instance.id);
                }

                UnityEngine.Debug.Log("YotogiAnywhere: Skill_Data_IsExecStage Postfix: " + key);
            }

            __result = __result || YotogiAnywhere.newStageIds.Contains(stageData.id) || YotogiAnywhere.enableAllSkillsAllLocations;
        }
        static void YotogiStage_CreateData()
        {
            //Get the Dictionary
            Dictionary <int, YotogiStage.Data> basicsData = (Dictionary <int, YotogiStage.Data>) typeof(YotogiStage).GetField("basicDatas", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);

            //Create folders if they dont exist
            string mainPath = UTY.gameProjectPath + "\\Mod\\[YotogiAnywhere]\\[NewStages]";

            if (!Directory.Exists(mainPath))
            {
                Directory.CreateDirectory(mainPath);
            }

            if (YotogiAnywhere.newStageIds == null)
            {
                YotogiAnywhere.newStageIds = new List <int>();
            }

            //Get the data in folders
            string[] newStagesDirs = Directory.GetDirectories(mainPath);
            for (int i = 0; i < newStagesDirs.Length; i++)
            {
                DirectoryInfo di        = new DirectoryInfo(newStagesDirs[i]);
                string        stageName = di.Name;

                //Wow this is bad I should have done something better than a bunch of if statements
                if (Directory.Exists(mainPath + "\\" + stageName + "\\[Day]"))
                {
                    if (Directory.Exists(mainPath + "\\" + stageName + "\\[Night]"))
                    {
                        int maxId = -1;
                        YotogiStage.Data stageData = null;

                        //Try to find stage in existing data
                        foreach (KeyValuePair <int, YotogiStage.Data> kvp in basicsData)
                        {
                            if (kvp.Value.uniqueName.Equals(stageName))
                            {
                                stageData = kvp.Value;
                                break;
                            }

                            //Also get the max Id
                            maxId = System.Math.Max(maxId, kvp.Value.id);
                        }

                        //Create new if it does not exist
                        if (stageData == null)
                        {
                            //Increment from max Id
                            maxId += 10;

                            //Add to list of new ones
                            if (!YotogiAnywhere.newStageIds.Contains(maxId))
                            {
                                YotogiAnywhere.newStageIds.Add(maxId);
                                CsvCommonIdManager commonIdManager = (CsvCommonIdManager)typeof(YotogiStage).GetField("commonIdManager", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
                                commonIdManager.idMap.Add(maxId, new KeyValuePair <string, string>(stageName, ""));
                                commonIdManager.nameMap.Add(stageName, maxId);
                                typeof(YotogiStage).GetField("commonIdManager", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, commonIdManager);
                            }

                            //CsvParser is a pain, and the YotogiStage.Data constructor is a pain, so reuse yotogi_stage_list
                            //It wont find the id so it will be ok
                            string    f_strFileName = "yotogi_stage_list.nei";
                            AFileBase afileBase     = GameUty.FileSystem.FileOpen(f_strFileName);
                            CsvParser csvParser     = new CsvParser();
                            csvParser.Open(afileBase);
                            stageData = new YotogiStage.Data(-1, csvParser);

                            //Set id, only field we really need right now
                            typeof(YotogiStage.Data).GetField("id", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, maxId);

                            //Cleanup
                            csvParser.Dispose();
                        }

                        //Get BG and Thumbnail from folders
                        string prefab_bg       = null;
                        string prefab_bg_night = null;

                        //Day
                        if (Directory.GetFiles(mainPath + "\\" + stageName + "\\[Day]").Where(f => f.EndsWith(".asset_bg")).ToList().Count != 0)
                        {
                            prefab_bg = Path.GetFileNameWithoutExtension(new FileInfo(Directory.GetFiles(mainPath + "\\" + stageName + "\\[Day]").Where(f => f.EndsWith(".asset_bg")).ToList()[0]).Name);
                        }
                        else if (Directory.GetFiles(mainPath + "\\" + stageName + "\\[Day]").Where(f => f.EndsWith(".room")).ToList().Count != 0)
                        {
                            prefab_bg = Path.GetFileNameWithoutExtension(new FileInfo(Directory.GetFiles(mainPath + "\\" + stageName + "\\[Day]").Where(f => f.EndsWith(".room")).ToList()[0]).Name);
                        }
                        else
                        {
                            UnityEngine.Debug.Log("No.asset_bg or .room [Day] file found for " + stageName);
                        }
                        //Night
                        if (Directory.GetFiles(mainPath + "\\" + stageName + "\\[Night]").Where(f => f.EndsWith(".asset_bg")).ToList().Count != 0)
                        {
                            prefab_bg_night = Path.GetFileNameWithoutExtension(new FileInfo(Directory.GetFiles(mainPath + "\\" + stageName + "\\[Night]").Where(f => f.EndsWith(".asset_bg")).ToList()[0]).Name);
                        }
                        else if (Directory.GetFiles(mainPath + "\\" + stageName + "\\[Night]").Where(f => f.EndsWith(".room")).ToList().Count != 0)
                        {
                            prefab_bg_night = Path.GetFileNameWithoutExtension(new FileInfo(Directory.GetFiles(mainPath + "\\" + stageName + "\\[Night]").Where(f => f.EndsWith(".room")).ToList()[0]).Name);
                        }
                        else
                        {
                            UnityEngine.Debug.Log("No.asset_bg or .room [Night] file found for " + stageName);
                        }

                        string thumbnail       = null;
                        string thumbnail_night = null;

                        //Day
                        if (Directory.GetFiles(mainPath + "\\" + stageName + "\\[Day]").Where(f => f.EndsWith(".tex")).ToList().Count != 0)
                        {
                            thumbnail = new FileInfo(Directory.GetFiles(mainPath + "\\" + stageName + "\\[Day]").Where(f => f.EndsWith(".tex")).ToList()[0]).Name;
                        }
                        else
                        {
                            UnityEngine.Debug.Log("No .tex [Day] thumbnail file found for " + stageName);
                        }
                        //Night
                        if (Directory.GetFiles(mainPath + "\\" + stageName + "\\[Night]").Where(f => f.EndsWith(".tex")).ToList().Count != 0)
                        {
                            thumbnail_night = new FileInfo(Directory.GetFiles(mainPath + "\\" + stageName + "\\[Night]").Where(f => f.EndsWith(".tex")).ToList()[0]).Name;
                        }
                        else
                        {
                            UnityEngine.Debug.Log("No .tex [Night] thumbnail file found for " + stageName);
                        }

                        if (prefab_bg == null || prefab_bg_night == null || thumbnail == null || thumbnail_night == null)
                        {
                            UnityEngine.Debug.Log("YotogiAnywhere failed to create Location found for " + stageName);
                            break;
                        }


                        //Create a settings json if it doesnt exist
                        if (!File.Exists(mainPath + "\\" + stageName + "/settings.json"))
                        {
                            YotogiStage_Data_Json newSetting = new YotogiStage_Data_Json();
                            File.WriteAllText(mainPath + "\\" + stageName + "/settings.json", Newtonsoft.Json.JsonConvert.SerializeObject(newSetting));
                        }

                        //Settings from Directory
                        typeof(YotogiStage.Data).GetField("uniqueName", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, stageName);
                        typeof(YotogiStage.Data).GetField("drawName", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, stageName);

                        typeof(YotogiStage.Data).GetField("prefabName", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, new string[] { prefab_bg, prefab_bg_night });
                        typeof(YotogiStage.Data).GetField("thumbnailName", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, new string[] { thumbnail, thumbnail_night });

                        //Some Generic settings we do not worry about
                        typeof(YotogiStage.Data).GetField("sortId", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, stageData.id);

                        typeof(YotogiStage.Data).GetField("drawClubGrade", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, 1);
                        typeof(YotogiStage.Data).GetField("requestClubGrade", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, 1);

                        typeof(YotogiStage.Data).GetField("requestFacilityIds", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, new int[] { });

                        //Settings file
                        YotogiStage_Data_Json settings = Newtonsoft.Json.JsonConvert.DeserializeObject <YotogiStage_Data_Json>(File.ReadAllText(mainPath + "\\" + stageName + "/settings.json"));
                        typeof(YotogiStage.Data).GetField("bgmFileName", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, settings.bgm);
                        typeof(YotogiStage.Data).GetField("stageSelectCameraData", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, new YotogiStage.Data.Camera(new UnityEngine.Vector3(settings.camera_pos_x, settings.camera_pos_y, settings.camera_pos_z),
                                                                                                                                                                                new UnityEngine.Vector2(settings.camera_rot_x, settings.camera_rot_y),
                                                                                                                                                                                settings.camera_radius));
                        typeof(YotogiStage.Data).GetField("skillSelectcharacterData", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, new YotogiStage.Data.Character(new UnityEngine.Vector3(settings.kasuko_x, settings.kasuko_y, settings.kasuko_z),
                                                                                                                                                                                      new UnityEngine.Vector3(settings.kasuko_rot_x, settings.kasuko_rot_y, settings.kasuko_rot_z),
                                                                                                                                                                                      new UnityEngine.Vector2(settings.skill_x, settings.skill_y)));
                        typeof(YotogiStage.Data).GetField("skillSelectLightData", BindingFlags.Instance | BindingFlags.Public).SetValue(stageData, new YotogiStage.Data.Light(new UnityEngine.Vector3(settings.light_x, settings.light_y, settings.light_z), settings.light_intensity));

                        //Update the entry
                        basicsData[stageData.id] = stageData;
                    }
                    else
                    {
                        UnityEngine.Debug.Log("YotogiAnywhere: YotogiStage_CreateData Missing: " + mainPath + "\\" + stageName + "\\[Night]");
                    }
                }
                else
                {
                    UnityEngine.Debug.Log("YotogiAnywhere: YotogiStage_CreateData Missing: " + mainPath + "\\" + stageName + "\\[Day]");
                }
            }

            //Update entire dictionary as precaution
            typeof(YotogiStage).GetField("basicDatas", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, basicsData);
        }