Example #1
0
    private UnityFile[,] GroupChildFiles(List <UnityFile> files)
    {
        //This method groups files by rows of 3. You can edit this
        //to change visuals.
        int size = files.Count;
        int rows = (size / 3) + 1;

        UnityFile[,] groupedFiles = new UnityFile[rows, 3];
        int index = 0;

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (i * 3 + j <= size - 1)
                {
                    groupedFiles[i, j] = files[index++];
                }
            }
        }

        return(groupedFiles);
    }
Example #2
0
        static void Decompile(CommandLineArguments arguments)
        {
            if (arguments.PlainArguments.Count < 1)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Expected Magicite game directory.");
                Console.WriteLine("Correct Usage:  modicite --decompile [--targetVersion=<version>] <gameDir> <outputDir>");
                Console.ResetColor();
                return;
            }

            if (arguments.PlainArguments.Count < 2)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Expected output directory.");
                Console.WriteLine("Correct Usage:  modicite --decompile <gameDir> <outputDir>");
                Console.ResetColor();
                return;
            }

            #region Get Target Version

            string targetVersion = ModiciteInfo.NewestSupportedMagiciteVersion;

            if (arguments.OptionalArguments.Contains(OptionalArgument.Version))
            {
                if (arguments.OptionalArgumentParameters.ContainsKey(OptionalArgument.Version))
                {
                    targetVersion = arguments.OptionalArgumentParameters[OptionalArgument.Version];
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Expected version name.");
                    Console.WriteLine("Correct Usage:  modicite --decompile --version=<ver> <gameDir> <outputDir>");
                    Console.ResetColor();
                    return;
                }
            }

            if (!Directory.Exists("./versions"))
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Directory './versions' does not exist. You need to re-install Modicite.");
                Console.ResetColor();
                return;
            }

            if (!File.Exists("./versions/" + targetVersion + ".json"))
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("No configuration file found for target version '" + targetVersion + "'.");
                Console.WriteLine("If the target version is 'default', then you need to re-install Modicite.");
                Console.WriteLine("If the target version is newer than '" + ModiciteInfo.NewestSupportedMagiciteVersion + "', then you need to update to a newer version of Modicite.");
                Console.ResetColor();
                return;
            }

            TargetFile targetFile = null;
            try {
                targetFile = SimpleJson.SimpleJson.DeserializeObject <TargetFile>(File.ReadAllText("./versions/" + targetVersion + ".json"));
            } catch (Exception ex) {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Failed to load configuration file for target version due to " + ex.GetType().Name + ": " + ex.Message);
                Console.ResetColor();
                return;
            }

            Console.WriteLine("Decompiling with target version '" + targetVersion + "'.");

            #endregion

            #region Create Output Directory

            if (Directory.Exists(arguments.PlainArguments[1]) &&
                Directory.GetFiles(arguments.PlainArguments[1]).Length > 0 &&
                Directory.GetDirectories(arguments.PlainArguments[1]).Length > 0)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("The output directory is not empty!");
                Console.ResetColor();
                return;
            }

            if (!Directory.Exists(arguments.PlainArguments[1]))
            {
                try {
                    Directory.CreateDirectory(arguments.PlainArguments[1]);
                } catch (Exception ex) {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("The output directory could not be created due to " + ex.GetType().Name + ": " + ex.Message);
                    Console.ResetColor();
                    return;
                }
            }

            string outputDir = arguments.PlainArguments[1].TrimEnd(new char[] { '/', '\\' });

            #endregion

            ClassIDDatabase.Load("./classes.txt");

            RTTIDatabase.Load("./types.dat");

            #region Unity Binaries

            Directory.CreateDirectory(outputDir + "/unity-data");

            foreach (TargetFileEntry dataFileEntry in targetFile.unityDataFiles)
            {
                string entryPath = arguments.PlainArguments[0].TrimEnd(new char[] { '/', '\\' }) + dataFileEntry.path;

                if (!File.Exists(entryPath))
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Missing Unity data file '" + dataFileEntry.name + "'!");
                    Console.ResetColor();
                    continue;
                }

                Console.Write("Loading Unity data file '" + dataFileEntry.name + "'... ");
                UnityFile uf;
                try {
                    uf = UnityFile.Load(entryPath);
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Done.");
                    Console.ResetColor();
                } catch (Exception ex) {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Failed due to " + ex.GetType().Name + ": " + ex.Message);
                    Console.ResetColor();
                    continue;
                }

                Directory.CreateDirectory(outputDir + "./unity-data/" + dataFileEntry.name);

                Console.Write("Exporting file header from '" + dataFileEntry.name + "'... ");
                try {
                    //uf.ExportHeaderToFile(outputDir + "./unity-data/" + dataFileEntry.name + "/header.json");
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Done.");
                    Console.ResetColor();
                } catch (Exception ex) {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Failed due to " + ex.GetType().Name + ": " + ex.Message);
                    Console.ResetColor();
                    continue;
                }

                List <string> exportFailures = new List <string>();

                int count = 1;

                /*foreach (ObjectInfo oi in uf.Metadata.ObjectInfoList) {
                 *  Console.CursorLeft = 0;
                 *  Console.Write("Exporting object data from '" + dataFileEntry.name + "'... " + count.ToString() + "/" + uf.Metadata.NumberOfObjectInfoListMembers.ToString());
                 *
                 *  string objectClassName = oi.ClassID == 114 ? "114" : ClassIDDatabase.Classes[oi.ClassID];
                 *
                 *  if (!Directory.Exists(outputDir + "./unity-data/" + dataFileEntry.name + "/" + objectClassName)) {
                 *      Directory.CreateDirectory(outputDir + "./unity-data/" + dataFileEntry.name + "/" + objectClassName);
                 *  }
                 *
                 *  if (oi.ClassID != 198) {
                 *      try {
                 *          uf.ExportObjectToFile(oi, outputDir + "./unity-data/" + dataFileEntry.name + "/" + objectClassName + "/" + oi.ObjectID.ToString() + ".json", outputDir + "./unity-data/" + dataFileEntry.name + "/" + objectClassName + "/raw-" + oi.ObjectID.ToString() + ".json");
                 *      } catch (Exception ex) {
                 *          exportFailures.Add("Object " + oi.ObjectID.ToString() + " failed to export due to " + ex.GetType().Name + ": " + ex.Message);
                 *      }
                 *  } else {
                 *      try {
                 *          uf.ExportRawObjectToFile(oi, outputDir + "./unity-data/" + dataFileEntry.name + "/" + objectClassName + "/raw-" + oi.ObjectID.ToString() + ".json");
                 *      } catch (Exception ex) {
                 *          exportFailures.Add("Object " + oi.ObjectID.ToString() + " failed to export due to " + ex.GetType().Name + ": " + ex.Message);
                 *      }
                 *  }
                 *
                 *  count++;
                 * }*/
                Console.Write(" - ");
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Done.");
                Console.ResetColor();

                Console.ForegroundColor = ConsoleColor.Yellow;
                foreach (string exportFailure in exportFailures)
                {
                    Console.WriteLine(exportFailure);
                }
                Console.ResetColor();
            }

            #endregion
        }
 protected override async Task <string> InternalLoadAsync(string path)
 {
     return(await UnityFile.ReadAllTextAsync(path, Encoding));
 }
 protected override string InternalLoad(string path)
 {
     return(UnityFile.ReadAllText(path, Encoding));
 }
Example #5
0
        // Protected
        //protected JSONObject _GameDataObject;
        //protected GameDataStructure _GameDataStructure;
        //protected Game _Game;
        #endregion

        #region Gets
        //public JSONObject GameDataObject { get { return _GameDataObject; } }
        #endregion

        #region Public
        /// <summary>
        /// Check if the .dat file that store gameplay custom data exists.
        /// </summary>
        /// <returns>True or False</returns>
        public bool HasGameData()
        {
            return(UnityFile.Exists("GameData.dat", FolderPaths.Persistent));
        }
Example #6
0
        protected override async Task <string> InternalLoadAsync(string path)
        {
            var result = await UnityFile.ReadAllTextAsync(path, Encoding).ConfigureAwait(false);

            return(result);
        }
Example #7
0
        public void Process(ProjectInfo projectInfo)
        {
            CreateCachePath(projectInfo);

            UnityFilePaths     = new List <string>();
            MergedCppFileNames = new List <string>();

            IList <string> cppFileNames = projectInfo.MergableCppFileNames;

            if (_settings.GlobalSettings.RandomizeOrderOfUnityMergedFiles)
            {
                cppFileNames.Shuffle();
            }

            _unityFiles = new Dictionary <string, UnityFile>();

            int currentUnityFileIndex  = 1;
            int currentSourceFileIndex = 1;

            foreach (string cppFileName in cppFileNames)
            {
                string   expandedCppFileName = ProjectInfo.ExpandEnvironmentVariables(cppFileName);
                string   cppFilePath         = Path.IsPathRooted(expandedCppFileName) ? expandedCppFileName : Path.GetFullPath(Path.Combine(Path.GetDirectoryName(projectInfo.FileName), cppFileName));
                FileInfo fileInfo            = null;
                if (File.Exists(cppFilePath))
                {
                    fileInfo = new FileInfo(cppFilePath);
                    if (_settings.GlobalSettings.ExcludeWritableFilesFromUnityMerge && !fileInfo.IsReadOnly)
                    {
                        continue;
                    }
                }

                if (_settings.SolutionSettings.IsExcludedCppFileNameForProject(projectInfo, cppFileName))
                {
                    continue;
                }

                // Get the Unity file for the file extension. We separate .c and .cpp files because this is what makes
                // Visual Studio choose if it should do a C-only or a C++ compile. There are subtle compiler differences.
                string    fileExtension = Path.GetExtension(cppFileName).ToLower();
                UnityFile unityFile;
                if (!_unityFiles.TryGetValue(fileExtension, out unityFile))
                {
                    unityFile = new UnityFile();
                    _unityFiles.Add(fileExtension, unityFile);
                    WritePrefix(projectInfo, unityFile.Contents);
                }

                if (unityFile.TotalMergedSizeInBytes > _settings.GlobalSettings.MaxUnityFileSizeInBytes)
                {
                    WriteUnityFile(projectInfo, unityFile.Contents, currentUnityFileIndex, fileExtension);
                    ++currentUnityFileIndex;

                    unityFile = new UnityFile();
                    _unityFiles[fileExtension] = unityFile;
                    WritePrefix(projectInfo, unityFile.Contents);
                }

                unityFile.TotalMergedSizeInBytes += fileInfo?.Length ?? 0;
                unityFile.Contents.AppendLine("#ifdef RUDE_BUILD_SUPPORTS_PRAGMA_MESSAGE");
                unityFile.Contents.AppendLine("#pragma message(\"" + Path.GetFileName(cppFileName) + "\")");
                unityFile.Contents.AppendLine("#endif");
                unityFile.Contents.AppendLine("#define RUDE_BUILD_FILEID (" + currentSourceFileIndex + ")");
                unityFile.Contents.AppendLine("#include \"" + cppFilePath + "\"");
                unityFile.Contents.AppendLine("#undef RUDE_BUILD_FILEID");
                ++currentSourceFileIndex;

                MergedCppFileNames.Add(cppFileName);
            }

            foreach (var keyValue in _unityFiles)
            {
                string    fileExtension = keyValue.Key;
                UnityFile unityFile     = keyValue.Value;
                if (unityFile.Contents.Length > 0)
                {
                    WriteUnityFile(projectInfo, unityFile.Contents, currentUnityFileIndex, fileExtension);
                    ++currentUnityFileIndex;
                }
            }

            WriteEmptyPrecompiledHeader(projectInfo);
        }