Esempio n. 1
0
        private static void ImportDig(Node nDIG, Node nATM, Node nPNG, string outputPath)
        {
            log.Info("Importing " + nDIG.Name + ", " + nATM.Name + " and " + nPNG.Name);

            DIG  originalDig = nDIG.TransformWith <Binary2DIG>().GetFormatAs <DIG>();
            ALMT originalAtm = nATM.TransformWith <Binary2ALMT>().GetFormatAs <ALMT>();

            // New stream
            var stream     = new MemoryStream();
            var dataStream = DataStreamFactory.FromStreamKeepingOwnership(stream, 0, 0);

            // Copy the png to the bitmap stream
            nPNG.Stream.WriteTo(dataStream);

            // Import the new PNG file
            Bitmap newImage = (Bitmap)Image.FromStream(stream);

            var         quantization = new FixedPaletteQuantization(originalDig.Palette.GetPalette(0));
            ColorFormat format;

            if (originalDig.PaletteType == 16)
            {
                format = ColorFormat.Indexed_4bpp;
            }
            else
            {
                format = ColorFormat.Indexed_8bpp;
            }

            Texim.ImageMapConverter importer = new Texim.ImageMapConverter
            {
                Format        = format,
                PixelEncoding = PixelEncoding.HorizontalTiles,
                Quantization  = quantization,
                //Mapable = new MatchMapping(originalDig.Pixels.GetPixels())
            };

            (Palette _, PixelArray pixelInfo, MapInfo[] mapInfos) = importer.Convert(newImage);

            originalDig.Pixels = pixelInfo;
            originalAtm.Info   = mapInfos;

            BinaryFormat bDig = (BinaryFormat)ConvertFormat.With <Binary2DIG>(originalDig);
            BinaryFormat bAtm = (BinaryFormat)ConvertFormat.With <Binary2ALMT>(originalAtm);

            Utils.Lzss(bDig, "-evn").Stream.WriteTo(Path.Combine(outputPath, nDIG.Name + ".evn.dig"));
            bAtm.Stream.WriteTo(Path.Combine(outputPath, nATM.Name + ".atm"));
        }
Esempio n. 2
0
        private static void ExportDig(Node nDIG, Node nATM, string outputPath)
        {
            log.Info("Exporting " + nDIG.Name);

            DIG dig = nDIG.TransformWith <Binary2DIG>().GetFormatAs <DIG>();

            ALMT atm = nATM.TransformWith <Binary2ALMT>().GetFormatAs <ALMT>();

            Bitmap img = atm.CreateBitmap(dig.Pixels, dig.Palette);

            string path = Path.Combine(outputPath, nDIG.Name + ".png");

            img.Save(path);

            log.Info("Saved into " + path);
        }
Esempio n. 3
0
        public NodeContainerFormat Convert(NodeContainerFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            NodeContainerFormat output = new NodeContainerFormat();

            DataReader komaReader = new DataReader(Koma.Stream);

            int komaEntryNumber = (int)(komaReader.Stream.Length / KOMA_ENTRY_SIZE);

            for (int i = 0; i < komaEntryNumber; i++)
            {
                byte[] entry = komaReader.ReadBytes(KOMA_ENTRY_SIZE);

                // DTX NAME FROM ARM9
                byte letterKomaName = entry[04];
                byte numberKomaName = entry[05];

                DataReader armReader = new DataReader(Arm.Stream);
                string     dtxName   = "";

                armReader.Stream.RunInPosition(
                    () => {
                    dtxName = armReader.ReadString();
                },
                    (KOMA_NAME_TABLE_OFFSET + letterKomaName * 4));

                dtxName += "_" + numberKomaName;
                if (numberKomaName == 0)
                {
                    dtxName += 0;
                }

                log.Debug("dtxName:" + dtxName);

                // DTX SHAPE
                byte indexGroupKshape   = entry[08];
                byte indexElementKshape = entry[09];

                DataReader komaShapeReader = new DataReader(Komashape.Stream);

                long komaShapeOffset = 0;

                komaShapeReader.Stream.RunInPosition(
                    () => komaShapeOffset = ((komaShapeReader.ReadInt32() + indexElementKshape) * 0x18) + 0x40,
                    (indexGroupKshape * 4));

                log.Debug("komaShapeOffset:" + komaShapeOffset);

                // DTX File
                Node dtx = Navigator.SearchNode <Node>(source.Root, Path.Combine("/" + Directory, "koma-" + dtxName + ".dtx"));

                DataReader dtxReader = new DataReader(dtx.Stream);

                int     magicid           = dtxReader.ReadInt32();
                byte    type              = dtxReader.ReadByte();
                byte    type_alt          = dtxReader.ReadByte();
                short   totalFramesNumber = dtxReader.ReadInt16();
                short   digPointer        = dtxReader.ReadInt16();
                short   unknown           = dtxReader.ReadInt16();
                byte[]  width             = new byte[totalFramesNumber];
                byte[]  height            = new byte[totalFramesNumber];
                short[] frameIndex        = new short[totalFramesNumber];
                for (int j = 0; j < totalFramesNumber; j++)
                {
                    width[j]      = dtxReader.ReadByte();
                    height[j]     = dtxReader.ReadByte();
                    frameIndex[j] = dtxReader.ReadInt16();
                }

                BinaryFormat bfDIG = new BinaryFormat(dtx.Stream, (long)digPointer, (dtx.Stream.Length - (long)digPointer));

                DIG dig = (DIG)ConvertFormat.With <Binary2DIG>(bfDIG);

                // Iterate KomaShape

                komaShapeReader.Stream.Position = komaShapeOffset;
                // Fichero Dig tiene 08 de ancho y 872 de alto
                // 08 * 872 / 2 = 3488 bytes
                byte[] dtxPixels = new byte[192 * 240 / 2]; // *** REVISAR

                int x = 0;
                int y = 0;

                log.Debug("==KOMASHAPE==");

                // Iterate kshape
                for (int k = 0; k < 0x14; k++)
                {
                    byte blockDTX = komaShapeReader.ReadByte();
                    log.Debug(k + " - Byte: " + blockDTX);

                    if (blockDTX > 00)
                    {
                        blockDTX -= 1;
                        // Empieza el primer bloque en el dtx
                        long startIndex = frameIndex[blockDTX] * 0x20 + dig.PixelsStart + 32;
                        log.Debug("startIndex:" + startIndex);

                        int blockSize = width[blockDTX] * 8 * height[blockDTX] * 8;

                        for (int l = 0; l < blockSize; l++)
                        {
                            int position = GetIndex(PixelEncoding.Lineal, x, y, 192, 240, new Size(8, 8));

                            dtxPixels[position] = dig.Pixels.GetData()[startIndex + l];
                            log.Debug(l + " - dtxPixels:" + dtxPixels[l]);

                            x += 1;
                            if (x >= 192)
                            {
                                x  = 0;
                                y += 1;
                            }
                            log.Debug("x: " + x);
                            log.Debug("y: " + y);
                        }
                    }
                    x += 48;
                    if (x >= 192)
                    {
                        x  = 0;
                        y += 48;
                    }
                    log.Debug("x: " + x);
                    log.Debug("y: " + y);
                }
                log.Debug("====");


                // Generate new image
                PixelArray extractedDTX = new PixelArray
                {
                    Width  = 192,
                    Height = 240,
                };
                Palette palette = dig.Palette;

                extractedDTX.SetData(dtxPixels, PixelEncoding.Lineal, ColorFormat.Indexed_8bpp);

                var img = extractedDTX.CreateBitmap(palette, 0);
                var s   = new MemoryStream();
                img.Save(s, System.Drawing.Imaging.ImageFormat.Png);
                img.Save("test.png");

                // Add to container
                var n = new Node(dtxName, new BinaryFormat(DataStreamFactory.FromStream(s)));
                output.Root.Add(n);
            }

            return(output);
        }
Esempio n. 4
0
        private static void Import(string format, Node n, string dirToSave, string dataToInsert)
        {
            log.Info("Importing...");

            switch (format)
            {
            case FORMATPREFIX + "BinInfoTitle":

                Po2BinInfoTitle p2b = new Po2BinInfoTitle()
                {
                    OriginalFile = new Yarhl.IO.DataReader(n.Stream)
                    {
                        DefaultEncoding = Encoding.GetEncoding(932)
                    }
                };
                Node nodePo = NodeFactory.FromFile(dataToInsert);

                nodePo.TransformWith <Po2Binary>();
                Node nodeBin = nodePo.TransformWith(p2b)
                               .TransformWith <BinInfoTitle2Bin>();
                nodeBin.Stream.WriteTo(Path.Combine(dirToSave, n.Name.Remove(n.Name.Length - 4) + "_new.bin"));

                break;

            case FORMATPREFIX + "ALAR.ALAR3":

                // Alar original
                Node original = n.TransformWith <BinaryFormat2Alar3>();

                // Contenedor con los ficheros a insertar
                Node newContainer = NodeFactory.FromDirectory(dataToInsert, "*.*");
                foreach (var child in newContainer.Children)
                {
                    log.Info("Importing " + child.Name);
                }
                //var newAlar = newContainer.Transform<Alar3ToNodes, NodeContainerFormat, ALAR3>();

                // Modificamos el Alar original con los nuevos ficheros a insertar
                original.GetFormatAs <ALAR3>().InsertModification(newContainer);

                original.TransformWith <BinaryFormat2Alar3>()
                .Stream.WriteTo(Path.Combine(dirToSave, n.Name + "new.aar"));

                break;

            case FORMATPREFIX + "DIG":

                DIG originalDig = n.TransformWith <Binary2DIG>().GetFormatAs <DIG>();

                // Import the new PNG file
                Bitmap newImage               = (Bitmap)Image.FromFile(dataToInsert);
                var    quantization           = new FixedPaletteQuantization(originalDig.Palette.GetPalette(0));
                Texim.ImageConverter importer = new Texim.ImageConverter {
                    Format        = ColorFormat.Indexed_4bpp,
                    PixelEncoding = PixelEncoding.HorizontalTiles,
                    Quantization  = quantization
                };

                (Palette _, PixelArray pixelInfo) = importer.Convert(newImage);

                originalDig.Pixels = pixelInfo;

                BinaryFormat b = (BinaryFormat)ConvertFormat.With <Binary2DIG>(originalDig);

                Utils.Lzss(b, "-evn").Stream.WriteTo(Path.Combine(dirToSave, n.Name + "evn.dig"));

                break;
            }
            log.Info("Finished importing");
        }