Beispiel #1
0
        public static ResourceDatabase PrepareResources(
            BuildContext buildContext,
            ByteBuffer nullableByteCode) // CBX files will not have this in the resources
        {
            using (new PerformanceSection("Program.PrepareResources"))
            {
                // This really needs to go in a separate helper file.
                ResourceDatabase resourceDatabase = ResourceDatabaseBuilder.CreateResourceDatabase(buildContext);
                if (nullableByteCode != null)
                {
                    resourceDatabase.ByteCodeFile = new FileOutput()
                    {
                        Type        = FileOutputType.Text,
                        TextContent = ByteCodeEncoder.Encode(nullableByteCode),
                    };
                }

                using (new PerformanceSection("Program.PrepareResources/ImageSheetStuff"))
                {
                    Common.ImageSheets.ImageSheetBuilder imageSheetBuilder = new Common.ImageSheets.ImageSheetBuilder();
                    if (buildContext.ImageSheetIds != null)
                    {
                        foreach (string imageSheetId in buildContext.ImageSheetIds)
                        {
                            imageSheetBuilder.PrefixMatcher.RegisterId(imageSheetId);

                            foreach (string fileMatcher in buildContext.ImageSheetPrefixesById[imageSheetId])
                            {
                                imageSheetBuilder.PrefixMatcher.RegisterPrefix(imageSheetId, fileMatcher);
                            }
                        }
                    }
                    Common.ImageSheets.Sheet[] imageSheets = imageSheetBuilder.Generate(resourceDatabase);

                    resourceDatabase.AddImageSheets(imageSheets);
                }

                resourceDatabase.GenerateResourceMapping();

                return(resourceDatabase);
            }
        }
Beispiel #2
0
        public void Compile(
            BuildContext buildContext,
            string inputFolder,
            string baseOutputFolder)
        {
            Parser.IsTranslateMode_STATIC_HACK = false;

            this.VerifyProjectId(buildContext.ProjectID);

            inputFolder = inputFolder.Replace('/', '\\');
            if (inputFolder.EndsWith("\\"))
            {
                inputFolder = inputFolder.Substring(0, inputFolder.Length - 1);
            }

            string[] allFiles = FileUtil.GetAllFilePathsRelativeToRoot(inputFolder);

            ResourceDatabase resourceDatabase = new ResourceDatabase(allFiles, inputFolder);

            ImageSheets.ImageSheetBuilder imageSheetBuilder = new ImageSheets.ImageSheetBuilder();
            if (buildContext.ImageSheetIds != null)
            {
                foreach (string imageSheetId in buildContext.ImageSheetIds)
                {
                    imageSheetBuilder.PrefixMatcher.RegisterId(imageSheetId);

                    foreach (string fileMatcher in buildContext.ImageSheetPrefixesById[imageSheetId])
                    {
                        imageSheetBuilder.PrefixMatcher.RegisterPrefix(imageSheetId, fileMatcher);
                    }
                }
            }
            ImageSheets.Sheet[] imageSheets = imageSheetBuilder.Generate(resourceDatabase);

            resourceDatabase.AddImageSheets(imageSheets);

            resourceDatabase.GenerateResourceMapping();

            ByteBuffer byteCodeBuffer = GenerateByteCode(buildContext, inputFolder);

            resourceDatabase.ByteCodeRawData = byteCodeBuffer;

            resourceDatabase.ByteCodeFile = new FileOutput()
            {
                Type        = FileOutputType.Text,
                TextContent = ByteCodeEncoder.Encode(byteCodeBuffer),
            };

            Parser.IsTranslateMode_STATIC_HACK = true;
            Dictionary <string, Executable[]> executablesByFile = this.InterpreterCompiler.Compile();

            Parser.IsTranslateMode_STATIC_HACK = false;

            StructDefinition[] structs = this.InterpreterCompiler.GetStructDefinitions();

            Dictionary <string, FileOutput> files = this.Package(
                buildContext,
                buildContext.ProjectID,
                executablesByFile,
                structs,
                inputFolder,
                resourceDatabase,
                this.LibraryManager);

            if (buildContext.ReadableByteCode)
            {
                files["readable_byte_code.txt"] = new FileOutput()
                {
                    Type        = FileOutputType.Text,
                    TextContent = this.GenerateReadableByteCode(byteCodeBuffer),
                };
            }

            string outputFolder = baseOutputFolder;

            FileUtil.EnsureParentFolderExists(outputFolder);

            // TODO: delete all files and directories in the output folder that are not in the new output
            // which is better than deleting everything and re-exporting because the user may have command
            // lines and windows open viewing the previous content, which will prevent a full delete from
            // working, but won't stop a simple overwrite of old content.

            this.GenerateFiles(buildContext, files, outputFolder, inputFolder);
        }
Beispiel #3
0
        public CbxExporter Export()
        {
            using (new PerformanceSection("ExportCbx"))
            {
                if (!this.args.ContainsKey(FlagParser.BUILD_FILE))
                {
                    throw new InvalidOperationException("No build path was provided.");
                }

                BuildContext      buildContext      = GetBuildContextCbx(this.args[FlagParser.BUILD_FILE]);
                CompilationBundle compilationResult = CompilationBundle.Compile(buildContext);
                ResourceDatabase  resDb             = Program.PrepareResources(buildContext, null);
                string            byteCode          = ByteCodeEncoder.Encode(compilationResult.ByteCode);
                List <byte>       cbxOutput         = new List <byte>()
                {
                    0
                };
                cbxOutput.AddRange("CBX".ToCharArray().Select(c => (byte)c));
                cbxOutput.AddRange(GetBigEndian4Byte(0));
                cbxOutput.AddRange(GetBigEndian4Byte(2));
                cbxOutput.AddRange(GetBigEndian4Byte(0));

                byte[] code = StringToBytes(byteCode);
                cbxOutput.AddRange("CODE".ToCharArray().Select(c => (byte)c));
                cbxOutput.AddRange(GetBigEndian4Byte(code.Length));
                cbxOutput.AddRange(code);

                List <string> libraries = new List <string>();
                foreach (Library library in compilationResult.LibrariesUsed.Where(lib => lib.IsMoreThanJustEmbedCode))
                {
                    libraries.Add(library.Name);
                    libraries.Add(library.Version);
                }
                string libsData      = string.Join(",", libraries);
                byte[] libsDataBytes = StringToBytes(libsData);
                cbxOutput.AddRange("LIBS".ToCharArray().Select(c => (byte)c));
                cbxOutput.AddRange(GetBigEndian4Byte(libsDataBytes.Length));
                cbxOutput.AddRange(libsDataBytes);

                byte[] resourceManifest = StringToBytes(resDb.ResourceManifestFile.TextContent);
                cbxOutput.AddRange("RSRC".ToCharArray().Select(c => (byte)c));
                cbxOutput.AddRange(GetBigEndian4Byte(resourceManifest.Length));
                cbxOutput.AddRange(resourceManifest);

                if (resDb.ImageSheetManifestFile != null)
                {
                    byte[] imageSheetManifest = StringToBytes(resDb.ImageSheetManifestFile.TextContent);
                    cbxOutput.AddRange("IMSH".ToCharArray().Select(c => (byte)c));
                    cbxOutput.AddRange(GetBigEndian4Byte(imageSheetManifest.Length));
                    cbxOutput.AddRange(imageSheetManifest);
                }

                string outputFolder = buildContext.OutputFolder.Replace("%TARGET_NAME%", "cbx");
                string fullyQualifiedOutputFolder = FileUtil.JoinPath(buildContext.ProjectDirectory, outputFolder);
                string cbxPath = FileUtil.JoinPath(fullyQualifiedOutputFolder, buildContext.ProjectID + ".cbx");
                cbxPath = FileUtil.GetCanonicalizeUniversalPath(cbxPath);
                FileUtil.EnsureParentFolderExists(fullyQualifiedOutputFolder);
                Dictionary <string, FileOutput> output = new Dictionary <string, FileOutput>();
                output[buildContext.ProjectID + ".cbx"] = new FileOutput()
                {
                    Type          = FileOutputType.Binary,
                    BinaryContent = cbxOutput.ToArray(),
                };

                // Resource manifest and image sheet manifest is embedded into the CBX file

                foreach (FileOutput txtResource in resDb.TextResources)
                {
                    output["res/txt/" + txtResource.CanonicalFileName] = txtResource;
                }
                foreach (FileOutput sndResource in resDb.AudioResources)
                {
                    output["res/snd/" + sndResource.CanonicalFileName] = sndResource;
                }
                foreach (FileOutput fontResource in resDb.FontResources)
                {
                    output["res/ttf/" + fontResource.CanonicalFileName] = fontResource;
                }
                foreach (FileOutput binResource in resDb.BinaryResources)
                {
                    output["res/bin/" + binResource.CanonicalFileName] = binResource;
                }
                foreach (FileOutput imgResource in resDb.ImageResources)
                {
                    output["res/img/" + imgResource.CanonicalFileName] = imgResource;
                }
                foreach (string key in resDb.ImageSheetFiles.Keys)
                {
                    output["res/img/" + key] = resDb.ImageSheetFiles[key];
                }
                new FileOutputExporter(fullyQualifiedOutputFolder).ExportFiles(output);

                this.finalCbxPath = cbxPath;
            }
            return(this);
        }