public bool Read( string Filepath ) { if( File.Exists( Filepath ) == false ) return false; mFilepath = Filepath; using( mReader = new BinaryReader( File.OpenRead( Filepath ) ) ) { char[] header = mReader.ReadChars( 2 ); byte major = mReader.ReadByte(); byte minor = mReader.ReadByte(); ushort actionCount = mReader.ReadUInt16(); mReader.BaseStream.Position += 10; // unknown [ushort, uint, uint] mActions = new List<RoActionPattern>(); for( int i = 0; i < actionCount; i++ ) { RoActionPattern act = new RoActionPattern(); act.Frames = new List<RoActionPatternFrame>(); uint frameCount = mReader.ReadUInt32(); for( int f = 0; f < frameCount; f++ ) { RoActionPatternFrame frame = new RoActionPatternFrame(); frame.Sprites = new List<RoActionPatternFrameSprite>(); frame.Palette1 = mReader.ReadUInt32(); frame.Palette2 = mReader.ReadUInt32(); mReader.BaseStream.Position += 24; // 12x ushort uint spriteCount = mReader.ReadUInt32(); for( int s = 0; s < spriteCount; s++ ) { RoActionPatternFrameSprite sprite = new RoActionPatternFrameSprite(); sprite.X = mReader.ReadUInt32(); sprite.Y = mReader.ReadUInt32(); int num = mReader.ReadInt32(); // TODO: google this! // every/most/many frames seems to have first sprite -1 if( num == -1 ) continue; sprite.Number = (uint)num; sprite.Mirror = mReader.ReadUInt32(); if( major > 2 ) { sprite.ColorR = mReader.ReadByte(); sprite.ColorG = mReader.ReadByte(); sprite.ColorB = mReader.ReadByte(); sprite.ColorA = mReader.ReadByte(); if( major <= 3 && minor <= 2 ) sprite.ScaleXY = mReader.ReadSingle(); else { sprite.ScaleX = mReader.ReadSingle(); sprite.ScaleY = mReader.ReadSingle(); } sprite.Rotation = mReader.ReadUInt32(); sprite.Type = mReader.ReadUInt32(); if( major >= 5 ) { sprite.Width = mReader.ReadUInt32(); sprite.Height = mReader.ReadUInt32(); } } frame.Sprites.Add( sprite ); } frame.Audio = mReader.ReadInt32(); frame.Numxxx = mReader.ReadInt32(); if( frame.Numxxx == 1 ) { frame.Ext1 = mReader.ReadInt32(); frame.ExtX = mReader.ReadInt32(); frame.ExtY = mReader.ReadInt32(); frame.Terminate = mReader.ReadInt32(); } act.Frames.Add( frame ); } mActions.Add( act ); } mSounds = new List<string>(); uint soundCount = mReader.ReadUInt32(); for( int i = 0; i < soundCount; i++ ) { string name = ""; char c = '\0'; for( int n = 0; n < 40; n++ ) if( ( c = mReader.ReadChar() ) != '\0' ) name += c; mSounds.Add( name ); } } return true; }
public bool Read(string Filepath) { if (File.Exists(Filepath) == false) { return(false); } mFilepath = Filepath; using (mReader = new BinaryReader(File.OpenRead(Filepath))) { char[] header = mReader.ReadChars(2); byte major = mReader.ReadByte(); byte minor = mReader.ReadByte(); ushort actionCount = mReader.ReadUInt16(); mReader.BaseStream.Position += 10; // unknown [ushort, uint, uint] mActions = new List <RoActionPattern>(); for (int i = 0; i < actionCount; i++) { RoActionPattern act = new RoActionPattern(); act.Frames = new List <RoActionPatternFrame>(); uint frameCount = mReader.ReadUInt32(); for (int f = 0; f < frameCount; f++) { RoActionPatternFrame frame = new RoActionPatternFrame(); frame.Sprites = new List <RoActionPatternFrameSprite>(); frame.Palette1 = mReader.ReadUInt32(); frame.Palette2 = mReader.ReadUInt32(); mReader.BaseStream.Position += 24; // 12x ushort uint spriteCount = mReader.ReadUInt32(); for (int s = 0; s < spriteCount; s++) { RoActionPatternFrameSprite sprite = new RoActionPatternFrameSprite(); sprite.X = mReader.ReadUInt32(); sprite.Y = mReader.ReadUInt32(); int num = mReader.ReadInt32(); // TODO: google this! // every/most/many frames seems to have first sprite -1 if (num == -1) { continue; } sprite.Number = (uint)num; sprite.Mirror = mReader.ReadUInt32(); if (major > 2) { sprite.ColorR = mReader.ReadByte(); sprite.ColorG = mReader.ReadByte(); sprite.ColorB = mReader.ReadByte(); sprite.ColorA = mReader.ReadByte(); if (major <= 3 && minor <= 2) { sprite.ScaleXY = mReader.ReadSingle(); } else { sprite.ScaleX = mReader.ReadSingle(); sprite.ScaleY = mReader.ReadSingle(); } sprite.Rotation = mReader.ReadUInt32(); sprite.Type = mReader.ReadUInt32(); if (major >= 5) { sprite.Width = mReader.ReadUInt32(); sprite.Height = mReader.ReadUInt32(); } } frame.Sprites.Add(sprite); } frame.Audio = mReader.ReadInt32(); frame.Numxxx = mReader.ReadInt32(); if (frame.Numxxx == 1) { frame.Ext1 = mReader.ReadInt32(); frame.ExtX = mReader.ReadInt32(); frame.ExtY = mReader.ReadInt32(); frame.Terminate = mReader.ReadInt32(); } act.Frames.Add(frame); } mActions.Add(act); } mSounds = new List <string>(); uint soundCount = mReader.ReadUInt32(); for (int i = 0; i < soundCount; i++) { string name = ""; char c = '\0'; for (int n = 0; n < 40; n++) { if ((c = mReader.ReadChar()) != '\0') { name += c; } } mSounds.Add(name); } } return(true); }