| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- namespace OpenVIII.Battle.Dat
- {
- public struct Textures : IReadOnlyList<TextureHandler>
- {
- #region Fields
- /// <summary>
- /// EOF
- /// </summary>
- public readonly uint Eof;
- /// <summary>
- /// Texture 2D wrapped in TextureHandler for mod support
- /// </summary>
- private readonly IReadOnlyList<TextureHandler> _textures;
- #endregion Fields
- #region Constructors
- private Textures(byte[] buffer, long byteOffset, string fileName)
- {
- //#if DEBUG
- // //Dump for debug
- // _br.BaseStream.Seek(start, SeekOrigin.Begin);
- // using (BinaryWriter fs = new BinaryWriter(File.Create(Path.Combine(Path.GetTempPath(), $"{start}.dump"), (int)(_br.BaseStream.Length - _br.BaseStream.Position), FileOptions.None)))
- // fs.Write(_br.ReadBytes((int)(_br.BaseStream.Length - _br.BaseStream.Position)));
- //#endif
- IReadOnlyList<uint> pTim;
- using (var br = new BinaryReader(new MemoryStream(buffer)))
- {
- br.BaseStream.Seek(byteOffset, SeekOrigin.Begin);
- //Begin create Textures struct
- //populate the tim Count;
- var cTim = br.ReadInt32();
- //create arrays per Count and Read pointers into array
- pTim = Enumerable.Range(0, cTim).Select(_ => (uint)(byteOffset + br.ReadUInt32())).ToList()
- .AsReadOnly();
- //Read EOF
- Eof = br.ReadUInt32();
- }
- //Read TIM -> TextureHandler into array
- TextureHandler getTexture(uint offset, int i)
- {
- if (buffer[offset] == 0x10)
- {
- var tm = new TIM2(buffer, offset); //broken
- var filename = $"{fileName}_{i}";
- var path = Path.Combine(Path.GetTempPath(), "battle.dat");
- Directory.CreateDirectory(path);
- //tm.SavePNG(Path.Combine(path,filename));
- return TextureHandler.Create(filename, tm); // tm.GetTexture(0);
- }
- Memory.Log.WriteLine($"{nameof(Textures)}::{nameof(getTexture)}.{offset} :: Not a tim file!");
- return null;
- }
- _textures = pTim.Select(getTexture).ToList().AsReadOnly();
- }
- #endregion Constructors
- #region Properties
- public int Count => _textures.Count;
- #endregion Properties
- #region Indexers
- public TextureHandler this[int index] => _textures[index];
- #endregion Indexers
- #region Methods
- public Textures CreateInstance(byte[] buffer, long byteOffset, string fileName) => new Textures(buffer, byteOffset, fileName);
- public IEnumerator<TextureHandler> GetEnumerator() => _textures.GetEnumerator();
- IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_textures).GetEnumerator();
- #endregion Methods
- }
- }
|