Textures.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace OpenVIII.Battle.Dat
  6. {
  7. public struct Textures : IReadOnlyList<TextureHandler>
  8. {
  9. #region Fields
  10. /// <summary>
  11. /// EOF
  12. /// </summary>
  13. public readonly uint Eof;
  14. /// <summary>
  15. /// Texture 2D wrapped in TextureHandler for mod support
  16. /// </summary>
  17. private readonly IReadOnlyList<TextureHandler> _textures;
  18. #endregion Fields
  19. #region Constructors
  20. private Textures(byte[] buffer, long byteOffset, string fileName)
  21. {
  22. //#if DEBUG
  23. // //Dump for debug
  24. // _br.BaseStream.Seek(start, SeekOrigin.Begin);
  25. // using (BinaryWriter fs = new BinaryWriter(File.Create(Path.Combine(Path.GetTempPath(), $"{start}.dump"), (int)(_br.BaseStream.Length - _br.BaseStream.Position), FileOptions.None)))
  26. // fs.Write(_br.ReadBytes((int)(_br.BaseStream.Length - _br.BaseStream.Position)));
  27. //#endif
  28. IReadOnlyList<uint> pTim;
  29. using (var br = new BinaryReader(new MemoryStream(buffer)))
  30. {
  31. br.BaseStream.Seek(byteOffset, SeekOrigin.Begin);
  32. //Begin create Textures struct
  33. //populate the tim Count;
  34. var cTim = br.ReadInt32();
  35. //create arrays per Count and Read pointers into array
  36. pTim = Enumerable.Range(0, cTim).Select(_ => (uint)(byteOffset + br.ReadUInt32())).ToList()
  37. .AsReadOnly();
  38. //Read EOF
  39. Eof = br.ReadUInt32();
  40. }
  41. //Read TIM -> TextureHandler into array
  42. TextureHandler getTexture(uint offset, int i)
  43. {
  44. if (buffer[offset] == 0x10)
  45. {
  46. var tm = new TIM2(buffer, offset); //broken
  47. var filename = $"{fileName}_{i}";
  48. var path = Path.Combine(Path.GetTempPath(), "battle.dat");
  49. Directory.CreateDirectory(path);
  50. //tm.SavePNG(Path.Combine(path,filename));
  51. return TextureHandler.Create(filename, tm); // tm.GetTexture(0);
  52. }
  53. Memory.Log.WriteLine($"{nameof(Textures)}::{nameof(getTexture)}.{offset} :: Not a tim file!");
  54. return null;
  55. }
  56. _textures = pTim.Select(getTexture).ToList().AsReadOnly();
  57. }
  58. #endregion Constructors
  59. #region Properties
  60. public int Count => _textures.Count;
  61. #endregion Properties
  62. #region Indexers
  63. public TextureHandler this[int index] => _textures[index];
  64. #endregion Indexers
  65. #region Methods
  66. public Textures CreateInstance(byte[] buffer, long byteOffset, string fileName) => new Textures(buffer, byteOffset, fileName);
  67. public IEnumerator<TextureHandler> GetEnumerator() => _textures.GetEnumerator();
  68. IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_textures).GetEnumerator();
  69. #endregion Methods
  70. }
  71. }