HyoutaTools.Tales.Vesperia.Scenario.ScenarioDat.Write C# (CSharp) Method

Write() public method

public Write ( string outFile, int align = 0x10 ) : void
outFile string
align int
return void
        public void Write( string outFile, int align = 0x10 )
        {
            var f = new FileStream( outFile, FileMode.Create );

            // create space for header and filelist stuff
            for ( int i = 0; i < FilesOffset; ++i ) { f.WriteByte( 0 ); }

            // create dummy entry
            f.Write( new byte[] { 0x44, 0x55, 0x4D, 0x4D, 0x59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 0x10 );

            // write files
            for ( int i = 0; i < Entries.Count; ++i ) {
                if ( Entries[i].Data != null ) {
                    // special case: if multiple files in a row are identical, only add them once and point the offsets at the same data
                    // oddly enough for the two times it happens in the original files, it only does it once, so no idea what is actually
                    // the proper way to handle it, faking it with that last condition
                    if ( i >= 1 && Entries[i - 1].Data != null && Entries[i - 1].Data.Length == Entries[i].Data.Length && Entries[i].Data.Length > 0x30 ) {
                        Entries[i - 1].Data.Position = 0;
                        Entries[i].Data.Position = 0;
                        if ( Entries[i - 1].Data.IsIdentical( Entries[i].Data, Entries[i].Data.Length ) ) {
                            Entries[i].Offset = Entries[i - 1].Offset;
                            continue;
                        }
                    }

                    Entries[i].Offset = (uint)f.Position - FilesOffset;
                    Entries[i].Data.Position = 0;
                    Util.CopyStream( Entries[i].Data, f, (int)Entries[i].Data.Length );
                    while ( f.Length % align != 0 ) { f.WriteByte( 0 ); }
                }
            }

            Filesize = (uint)f.Length;

            // write header
            f.Position = 0;
            f.Write( Encoding.ASCII.GetBytes( Magic ), 0, 8 );
            f.WriteUInt32( Filesize.SwapEndian() );
            f.WriteUInt32( Unknown.SwapEndian() );
            f.WriteUInt32( Filecount.SwapEndian() );
            f.WriteUInt32( FilesOffset.SwapEndian() );
            f.WriteUInt32( Filesize );
            f.WriteUInt32( 0 );

            // write file list
            for ( int i = 0; i < Entries.Count; ++i ) {
                f.Position = 0x20u + i * 0x20u;
                f.WriteUInt32( Entries[i].Offset.SwapEndian() );
                f.WriteUInt32( Entries[i].FilesizeCompressed.SwapEndian() );
                f.WriteUInt32( Entries[i].FilesizeUncompressed.SwapEndian() );
            }

            f.Close();
        }

Usage Example

コード例 #1
0
ファイル: Program.cs プロジェクト: AdmiralCurtiss/HyoutaTools
        public static int ExecutePack( List<string> args )
        {
            if ( args.Count < 2 ) {
                Console.WriteLine( "Usage: infolder outfile" );
                return -1;
            }

            string inPath = args[0];
            string outPath = args[1];

            var scenario = new ScenarioDat();
            scenario.Import( inPath );
            scenario.Write( outPath );

            return 0;
        }
All Usage Examples Of HyoutaTools.Tales.Vesperia.Scenario.ScenarioDat::Write