/[MorrowindCustomClothingSlotCreator]/trunk/libTES3FileFormat/PlugingClothing.cs
ViewVC logotype

Diff of /trunk/libTES3FileFormat/PlugingClothing.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 18 by william, Fri Jul 29 16:54:40 2011 UTC revision 19 by william, Fri Jul 29 17:39:39 2011 UTC
# Line 30  namespace libTES3FileFormat Line 30  namespace libTES3FileFormat
30      public class PlugingClothing : IPlugingClothing, ICommitParseAsBytes      public class PlugingClothing : IPlugingClothing, ICommitParseAsBytes
31      {      {
32          private ConsoleLog Log;          private ConsoleLog Log;
33          private const string CLOTHING_MAGIC = "CLOT";          private const string CLOTHING_MAGIC = "\0CLOT";
34          private const string CLOTHING_NAME_MAGIC = "NAME";          private const string CLOTHING_NAME_MAGIC = "NAME";
35          MemoryStream reader = new MemoryStream();          MemoryStream reader = new MemoryStream();
36          private int SectionCount = 0;          private List<int> SectionOffsets = new List<int>();
37          public PlugingClothing()          public PlugingClothing()
38          {          {
39              this.reader = new MemoryStream();              this.reader = new MemoryStream();
40              this.Offset = 0;              this.Offset = 0;
41              this.Size = 0;              this.Size = 0;
42                this.SectionOffsets = new List<int>();
43          }          }
44          public PlugingClothing(BinaryReader br, int offset, int size, int SectionCount, bool ReadOnly, ConsoleLog Log)          public PlugingClothing(BinaryReader br, List<int> SectionOffsets, bool ReadOnly, ConsoleLog Log)
45              : this()              : this()
46          {          {
47              this.Log = Log;              this.Log = Log;
48              br.BaseStream.Seek(offset, SeekOrigin.Begin);              br.BaseStream.Seek(0, SeekOrigin.Begin);
49              this.Offset = offset;              //this.Offset = offset;
50              this.Size = size;              //this.Size = size;
51              this.SectionCount = SectionCount;              this.SectionOffsets = SectionOffsets;
52              this.reader = new MemoryStream(br.ReadBytes((int)br.BaseStream.Length), 0, size);              this.reader = new MemoryStream(br.ReadBytes((int)br.BaseStream.Length), 0, (int)br.BaseStream.Length);
53              this.Parse(this.reader);              this.Parse(this.reader);
54          }          }
55    
# Line 60  namespace libTES3FileFormat Line 61  namespace libTES3FileFormat
61              this.Log.WriteLine();              this.Log.WriteLine();
62              // read header section magic              // read header section magic
63    
64              for (int i = 0; i < this.SectionCount; i++)              for (int i = 0; i < this.SectionOffsets.Count; i++)
65              {              {
66                    br.BaseStream.Seek(this.SectionOffsets[i], SeekOrigin.Begin);
67                  this.Log.WriteLine(string.Format("Clothing Section: Index=0x{0:x8} Offset=0x{1:x8}", i,(int)br.BaseStream.Position));                  this.Log.WriteLine(string.Format("Clothing Section: Index=0x{0:x8} Offset=0x{1:x8}", i,(int)br.BaseStream.Position));
68    
69                  byte[] magic = br.ReadBytes(4);                  byte[] magic = br.ReadBytes(4);
# Line 71  namespace libTES3FileFormat Line 72  namespace libTES3FileFormat
72    
73                  // Clothing Name                  // Clothing Name
74                  int section_size = BitConverter.ToInt32(br.ReadBytes(12), 0);                  int section_size = BitConverter.ToInt32(br.ReadBytes(12), 0);
75                    int name_offset = (int)br.BaseStream.Position;
76                  magic = br.ReadBytes(4);                  magic = br.ReadBytes(4);
77                  str_magic = ASCIIEncoding.ASCII.GetString(magic);                  str_magic = ASCIIEncoding.ASCII.GetString(magic);
78                  Debug.Assert(str_magic == "NAME", string.Format("Excepted: {0} found: {1}", "NAME", str_magic));                  Debug.Assert(str_magic == "NAME", string.Format("Excepted: {0} found: {1}", "NAME", str_magic));
# Line 131  namespace libTES3FileFormat Line 133  namespace libTES3FileFormat
133                  this.Log.WriteLine("\t\t\tValue: " + ctdt_value);                  this.Log.WriteLine("\t\t\tValue: " + ctdt_value);
134                  this.Log.WriteLine("\t\t\tEnchant Points: " + ctdt_echant_pts);                  this.Log.WriteLine("\t\t\tEnchant Points: " + ctdt_echant_pts);
135    
136                  magic = br.ReadBytes(4);                  
137                  str_magic = ASCIIEncoding.ASCII.GetString(magic);  
138                  Debug.Assert(str_magic == "SCRI", string.Format("Excepted: {0} found: {1}", "SCRI", str_magic));                  //magic = br.ReadBytes(4);
139                    //str_magic = ASCIIEncoding.ASCII.GetString(magic);
140                    //Debug.Assert(str_magic == "SCRI", string.Format("Excepted: {0} found: {1}", "SCRI", str_magic));
141                    //br.BaseStream.Position = br.BaseStream.Position - 4; // back up 4 bytes
142                    //int length_till_end_of_section = (name_offset + section_size) + 0x10;
143                    int length_till_end_of_section = (name_offset + section_size) - (int)br.BaseStream.Position;
144    
145    
146                    try
147                    {
148                        byte[] extra_clothing_data = br.ReadBytes(length_till_end_of_section);
149                    }
150                    catch { break; }
151    
152                  break;                  //break;
153    
154              }              }
155                                        
# Line 187  namespace libTES3FileFormat Line 201  namespace libTES3FileFormat
201              {              {
202                  this.reader = new MemoryStream();                  this.reader = new MemoryStream();
203                  this.Log = new ConsoleLog();                  this.Log = new ConsoleLog();
204                    this.ClothingSectionOffsets = new List<int>();
205              }              }
206              public SectionLocater(BinaryReader br, int CurrentOffset, ConsoleLog Log) : this()              public SectionLocater(BinaryReader br, int CurrentOffset, ConsoleLog Log) : this()
207              {              {
# Line 205  namespace libTES3FileFormat Line 220  namespace libTES3FileFormat
220                  this.Log.WriteLine();                  this.Log.WriteLine();
221    
222                  byte[] data = br.ReadBytes((int)br.BaseStream.Length);                  byte[] data = br.ReadBytes((int)br.BaseStream.Length);
223                                  
224    
225                  bool FirstEntry = true;                  this.ClothingSectionOffsets = new List<int>();
   
                 this.Offset = 0;  
   
                 int LastOffset = 0;  
                 int ClothingSectionCount = 0;  
226    
227                  foreach (var position in data.Locate(ASCIIEncoding.ASCII.GetBytes(PlugingClothing.CLOTHING_MAGIC)))                  foreach (var position in data.Locate(ASCIIEncoding.ASCII.GetBytes(PlugingClothing.CLOTHING_MAGIC)))
228                  {                  {
229                      if (FirstEntry)                      this.ClothingSectionOffsets.Add(position + 0x1); // add 1 byte to remove the \0,
                     {  
                         this.Offset = position;  
                         FirstEntry = false;  
                     }  
                     LastOffset = position;  
                     ClothingSectionCount++;  
230                  }                  }
231    
232                  if (this.Offset != 0)                  if (this.ClothingSectionOffsets.Count == 0)
                 {  
                     this.Log.WriteLine("\t\tFound First Clothing Section at offset: 0x" + this.Offset.ToString("x8"));  
                 }  
                 else  
233                  {                  {
234                      this.Log.WriteLine("\t\tNo Clothing Section Could be Found!");                      this.Log.WriteLine("\t\tNo Clothing Section Could be Found!");
235                  }                  }
236                    else
                 if (LastOffset != 0)  
237                  {                  {
238                      this.Log.WriteLine("\t\tFound Last Clothing Section at offset: 0x" + LastOffset.ToString("x8"));                      this.Log.WriteLine("\t\tFound 0x" + this.ClothingSectionOffsets.Count.ToString("x2") + "clothing sections");
239                      br.BaseStream.Seek(LastOffset, SeekOrigin.Begin);                  }              
   
                     byte[] magic = br.ReadBytes(4);  
                     string str_magic = ASCIIEncoding.ASCII.GetString(magic);  
                     Debug.Assert(str_magic == PlugingClothing.CLOTHING_MAGIC, string.Format("Excepted: {0} found: {1}", PlugingClothing.CLOTHING_MAGIC, str_magic));  
                     int CLOTH_LENGTH = BitConverter.ToInt32(br.ReadBytes(12), 0);  
   
                     magic = br.ReadBytes(4);  
                     str_magic = ASCIIEncoding.ASCII.GetString(magic);  
                     Debug.Assert(str_magic == PlugingClothing.CLOTHING_NAME_MAGIC, string.Format("Excepted: {0} found: {1}", PlugingClothing.CLOTHING_NAME_MAGIC, str_magic));  
   
                     int b = (CLOTH_LENGTH + (int)br.BaseStream.Position) - PlugingClothing.CLOTHING_NAME_MAGIC.Length;  
   
                     this.Size = b - this.Offset;  
                     this.SectionCount = ClothingSectionCount;  
                     this.Log.WriteLine("\t\tSize of All Clothing Sections (from first entry): 0x" + this.Size.ToString("x8"));  
                     this.Log.WriteLine("\t\tCloting Section: Start=0x" + this.Offset.ToString("x8") + " End=0x" + (this.Offset + this.Size).ToString("x8"));  
                     this.Log.WriteLine("\t\tTotal Clothing Sections: " + this.SectionCount.ToString());  
                 }  
240    
241                  return true;                  return true;
242              }              }
# Line 276  namespace libTES3FileFormat Line 258  namespace libTES3FileFormat
258                  get { return _Size; }                  get { return _Size; }
259                  private set { _Size = value; }                  private set { _Size = value; }
260              }              }
261              private int _SectionCount;              private List<int> _ClothingSectionOffsets;
262              public int SectionCount              public List<int> ClothingSectionOffsets
263              {              {
264                  get { return _SectionCount; }                  get { return _ClothingSectionOffsets; }
265                  private set { _SectionCount = value; }                  private set { _ClothingSectionOffsets = value; }
266              }              }
267              #endregion              #endregion
268          }          }

Legend:
Removed from v.18  
changed lines
  Added in v.19

  ViewVC Help
Powered by ViewVC 1.1.22