예제 #1
0
 public static void InitAllMetadata()
 {
     foreach (ModContentPack runningMod in LoadedModManager.RunningMods)
     {
         HashSet <string> hashSet = new HashSet <string>();
         foreach (string item2 in runningMod.foldersToLoadDescendingOrder)
         {
             string text = Path.Combine(item2, "Languages");
             if (new DirectoryInfo(text).Exists)
             {
                 foreach (VirtualDirectory directory in AbstractFilesystem.GetDirectories(text, "*", SearchOption.TopDirectoryOnly))
                 {
                     if (!directory.FullPath.StartsWith(text))
                     {
                         Log.Error("Failed to get a relative path for a file: " + directory.FullPath + ", located in " + text);
                     }
                     else
                     {
                         string item = directory.FullPath.Substring(text.Length);
                         if (!hashSet.Contains(item))
                         {
                             InitLanguageMetadataFrom(directory);
                             hashSet.Add(item);
                         }
                     }
                 }
             }
         }
     }
     languages.SortBy((LoadedLanguage l) => l.folderName);
     defaultLanguage = languages.FirstOrDefault((LoadedLanguage la) => la.folderName == DefaultLangFolderName);
     activeLanguage  = languages.FirstOrDefault((LoadedLanguage la) => la.folderName == Prefs.LangFolderName);
     if (activeLanguage == null)
     {
         Prefs.LangFolderName = DefaultLangFolderName;
         activeLanguage       = languages.FirstOrDefault((LoadedLanguage la) => la.folderName == Prefs.LangFolderName);
     }
     if (activeLanguage == null || defaultLanguage == null)
     {
         Log.Error("No default language found!");
         defaultLanguage = languages[0];
         activeLanguage  = languages[0];
     }
     activeLanguage.LoadMetadata();
 }
 public void LoadMetadata()
 {
     if (info != null && infoIsRealMetadata)
     {
         return;
     }
     infoIsRealMetadata = true;
     foreach (ModContentPack runningMod in LoadedModManager.RunningMods)
     {
         foreach (string item in runningMod.foldersToLoadDescendingOrder)
         {
             string text = Path.Combine(item, "Languages");
             if (!new DirectoryInfo(text).Exists)
             {
                 continue;
             }
             foreach (VirtualDirectory directory in AbstractFilesystem.GetDirectories(text, "*", SearchOption.TopDirectoryOnly))
             {
                 if (directory.Name == folderName || directory.Name == legacyFolderName)
                 {
                     info = DirectXmlLoader.ItemFromXmlFile <LanguageInfo>(directory, "LanguageInfo.xml", resolveCrossRefs: false);
                     if (info.friendlyNameNative.NullOrEmpty() && directory.FileExists("FriendlyName.txt"))
                     {
                         info.friendlyNameNative = directory.ReadAllText("FriendlyName.txt");
                     }
                     if (info.friendlyNameNative.NullOrEmpty())
                     {
                         info.friendlyNameNative = folderName;
                     }
                     if (info.friendlyNameEnglish.NullOrEmpty())
                     {
                         info.friendlyNameEnglish = folderName;
                     }
                     return;
                 }
             }
         }
     }
 }
예제 #3
0
        public static bool LoadUserShow(UserShowDef userShow, bool addToDefDatabase = true)
        {
            // Get images in path
            IEnumerable <string> filePaths = Enumerable.Empty <string>();

            if (!Directory.Exists(userShow.path))
            {
                Log.Message($"RimFlix {userShow.defName} : {userShow.label}: Path <{userShow.path}> does not exist.");
                return(false);
            }
            try
            {
                DirectoryInfo dirInfo = new DirectoryInfo(userShow.path);
                filePaths = from file in dirInfo.GetFiles()
                            where file.Name.ToLower().EndsWith(".jpg") || file.Name.ToLower().EndsWith(".png")
                            where (file.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden
                            select file.FullName;
            }
            catch
            {
                Log.Message($"RimFlix {userShow.defName} : {userShow.label}: Error trying to load files from <{userShow.path}>.");
                return(false);
            }
            if (!filePaths.Any())
            {
                Log.Message($"RimFlix {userShow.defName} : {userShow.label}: No images found in <{userShow.path}>.");
                // User may want to keep a show with an empty directory for future use.
                //return false;
            }

            // Load textures for images
            userShow.frames = new List <GraphicData>();
            foreach (string filePath in filePaths)
            {
                // RimWorld sets internalPath to filePath without extension
                // This causes problems with files that have same name but different extension (file.jpg, file.png)
                string internalPath = filePath.Replace('\\', '/');
                if (!RimFlixContent.contentList.ContainsKey(internalPath))
                {
                    string      path        = Path.GetDirectoryName(filePath);
                    string      file        = Path.GetFileName(filePath);
                    VirtualFile virtualFile = AbstractFilesystem.GetDirectory(path).GetFile(file);
                    LoadedContentItem <Texture2D> loadedContentItem = ModContentLoader <Texture2D> .LoadItem(virtualFile);

                    RimFlixContent.contentList.Add(internalPath, loadedContentItem.contentItem);
                }
                userShow.frames.Add(new GraphicData
                {
                    texPath      = internalPath,
                    graphicClass = typeof(Graphic_Single)
                });
            }

            // Create televisionDefs list
            userShow.televisionDefs = new List <ThingDef>();
            foreach (string televisionDefString in userShow.televisionDefStrings)
            {
                userShow.televisionDefs.Add(ThingDef.Named(televisionDefString));
            }

            // Add user show to def database
            if (!DefDatabase <ShowDef> .AllDefs.Contains(userShow))
            {
                DefDatabase <ShowDef> .Add(userShow);
            }
            return(true);
        }
예제 #4
0
        private static void DoPlayLoad()
        {
            DeepProfiler.Start("GraphicDatabase.Clear()");
            try
            {
                GraphicDatabase.Clear();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Load all active mods.");
            try
            {
                LoadedModManager.LoadAllActiveMods();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Load language metadata.");
            try
            {
                LanguageDatabase.InitAllMetadata();
            }
            finally
            {
                DeepProfiler.End();
            }
            LongEventHandler.SetCurrentEventText("LoadingDefs".Translate());
            DeepProfiler.Start("Copy all Defs from mods to global databases.");
            try
            {
                foreach (Type item in typeof(Def).AllSubclasses())
                {
                    GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item, "AddAllInMods");
                }
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Resolve cross-references between non-implied Defs.");
            try
            {
                DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.Silent);
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Rebind defs (early).");
            try
            {
                DefOfHelper.RebindAllDefOfs(earlyTryMode: true);
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("TKeySystem.BuildMappings()");
            try
            {
                TKeySystem.BuildMappings();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Inject selected language data into game data (early pass).");
            try
            {
                LanguageDatabase.activeLanguage.InjectIntoData_BeforeImpliedDefs();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Generate implied Defs (pre-resolve).");
            try
            {
                DefGenerator.GenerateImpliedDefs_PreResolve();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Resolve cross-references between Defs made by the implied defs.");
            try
            {
                DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.LogErrors);
            }
            finally
            {
                DirectXmlCrossRefLoader.Clear();
                DeepProfiler.End();
            }
            DeepProfiler.Start("Rebind DefOfs (final).");
            try
            {
                DefOfHelper.RebindAllDefOfs(earlyTryMode: false);
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Other def binding, resetting and global operations (pre-resolve).");
            try
            {
                PlayerKnowledgeDatabase.ReloadAndRebind();
                LessonAutoActivator.Reset();
                CostListCalculator.Reset();
                Pawn.ResetStaticData();
                PawnApparelGenerator.Reset();
                RestUtility.Reset();
                ThoughtUtility.Reset();
                ThinkTreeKeyAssigner.Reset();
                ThingCategoryNodeDatabase.FinalizeInit();
                TrainableUtility.Reset();
                HaulAIUtility.Reset();
                GenConstruct.Reset();
                MedicalCareUtility.Reset();
                InspectPaneUtility.Reset();
                GraphicDatabaseHeadRecords.Reset();
                DateReadout.Reset();
                ResearchProjectDef.GenerateNonOverlappingCoordinates();
                BaseGen.Reset();
                ResourceCounter.ResetDefs();
                ApparelProperties.ResetStaticData();
                WildPlantSpawner.ResetStaticData();
                PawnGenerator.Reset();
                TunnelHiveSpawner.ResetStaticData();
                Hive.ResetStaticData();
                ExpectationsUtility.Reset();
                WealthWatcher.ResetStaticData();
                SkillUI.Reset();
                QuestNode_GetThingPlayerCanProduce.ResetStaticData();
                Pawn_PsychicEntropyTracker.ResetStaticData();
                ColoredText.ResetStaticData();
                QuestNode_GetRandomNegativeGameCondition.ResetStaticData();
                RoyalTitleUtility.ResetStaticData();
                RewardsGenerator.ResetStaticData();
                WorkGiver_FillFermentingBarrel.ResetStaticData();
                WorkGiver_DoBill.ResetStaticData();
                WorkGiver_InteractAnimal.ResetStaticData();
                WorkGiver_Warden_DoExecution.ResetStaticData();
                WorkGiver_GrowerSow.ResetStaticData();
                WorkGiver_Miner.ResetStaticData();
                WorkGiver_FixBrokenDownBuilding.ResetStaticData();
                WorkGiver_ConstructDeliverResources.ResetStaticData();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Resolve references.");
            try
            {
                DeepProfiler.Start("ThingCategoryDef resolver");
                try
                {
                    DefDatabase <ThingCategoryDef> .ResolveAllReferences();
                }
                finally
                {
                    DeepProfiler.End();
                }
                DeepProfiler.Start("RecipeDef resolver");
                try
                {
                    DeepProfiler.enabled = false;
                    DefDatabase <RecipeDef> .ResolveAllReferences(onlyExactlyMyType : true, parallel : true);

                    DeepProfiler.enabled = true;
                }
                finally
                {
                    DeepProfiler.End();
                }
                DeepProfiler.Start("Static resolver calls");
                try
                {
                    foreach (Type item2 in typeof(Def).AllSubclasses())
                    {
                        if (!(item2 == typeof(ThingDef)) && !(item2 == typeof(ThingCategoryDef)) && !(item2 == typeof(RecipeDef)))
                        {
                            GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item2, "ResolveAllReferences", true, false);
                        }
                    }
                }
                finally
                {
                    DeepProfiler.End();
                }
                DeepProfiler.Start("ThingDef resolver");
                try
                {
                    DefDatabase <ThingDef> .ResolveAllReferences();
                }
                finally
                {
                    DeepProfiler.End();
                }
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Generate implied Defs (post-resolve).");
            try
            {
                DefGenerator.GenerateImpliedDefs_PostResolve();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Other def binding, resetting and global operations (post-resolve).");
            try
            {
                PawnWeaponGenerator.Reset();
                BuildingProperties.FinalizeInit();
                ThingSetMakerUtility.Reset();
            }
            finally
            {
                DeepProfiler.End();
            }
            if (Prefs.DevMode)
            {
                DeepProfiler.Start("Error check all defs.");
                try
                {
                    foreach (Type item3 in typeof(Def).AllSubclasses())
                    {
                        GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item3, "ErrorCheckAllDefs");
                    }
                }
                finally
                {
                    DeepProfiler.End();
                }
            }
            LongEventHandler.SetCurrentEventText("Initializing".Translate());
            DeepProfiler.Start("Load keyboard preferences.");
            try
            {
                KeyPrefs.Init();
            }
            finally
            {
                DeepProfiler.End();
            }
            DeepProfiler.Start("Short hash giving.");
            try
            {
                ShortHashGiver.GiveAllShortHashes();
            }
            finally
            {
                DeepProfiler.End();
            }
            LongEventHandler.ExecuteWhenFinished(delegate
            {
                DeepProfiler.Start("Load backstories.");
                try
                {
                    BackstoryDatabase.ReloadAllBackstories();
                }
                finally
                {
                    DeepProfiler.End();
                }
            });
            LongEventHandler.ExecuteWhenFinished(delegate
            {
                DeepProfiler.Start("Inject selected language data into game data.");
                try
                {
                    LanguageDatabase.activeLanguage.InjectIntoData_AfterImpliedDefs();
                    GenLabel.ClearCache();
                }
                finally
                {
                    DeepProfiler.End();
                }
            });
            LongEventHandler.ExecuteWhenFinished(delegate
            {
                DeepProfiler.Start("Static constructor calls");
                try
                {
                    StaticConstructorOnStartupUtility.CallAll();
                    if (Prefs.DevMode)
                    {
                        StaticConstructorOnStartupUtility.ReportProbablyMissingAttributes();
                    }
                }
                finally
                {
                    DeepProfiler.End();
                }
                DeepProfiler.Start("Garbage Collection");
                try
                {
                    AbstractFilesystem.ClearAllCache();
                    GC.Collect(int.MaxValue, GCCollectionMode.Forced);
                }
                finally
                {
                    DeepProfiler.End();
                }
            });
        }