MrtRat.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace OpenVIII.Fields
  6. {
  7. /// <summary>
  8. /// Contains Field Rate and battle Formations (Encounter)
  9. /// </summary>
  10. /// <see cref="http://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_RAT_MRT"/>
  11. public class MrtRat : IReadOnlyDictionary<ushort, byte>
  12. {
  13. /*
  14. private const byte NoEncounters = 0;
  15. */
  16. #region Fields
  17. private readonly IReadOnlyDictionary<ushort, byte> _mrtrat;
  18. #endregion Fields
  19. #region Constructors
  20. public MrtRat(byte[] mrtB, byte[] ratB)
  21. {
  22. var mrt = new ushort[4];
  23. using (var br = new BinaryReader(new MemoryStream(mrtB)))
  24. foreach (var i in Enumerable.Range(0, mrt.Length))
  25. mrt[i] = br.ReadUInt16();
  26. using (var br = new BinaryReader(new MemoryStream(ratB)))
  27. _mrtrat = mrt.Distinct().ToDictionary(x => x, x => br.ReadByte());
  28. }
  29. #endregion Constructors
  30. #region Properties
  31. public int Count => _mrtrat.Count;
  32. public IEnumerable<ushort> Keys => _mrtrat.Keys;
  33. public IEnumerable<byte> Values => _mrtrat.Values;
  34. #endregion Properties
  35. /*
  36. private bool NoEncountersOnField => _mrtrat.All(x => x.Value == NoEncounters);
  37. */
  38. #region Indexers
  39. public byte this[ushort key] => _mrtrat[key];
  40. #endregion Indexers
  41. #region Methods
  42. public bool ContainsKey(ushort key) => _mrtrat.ContainsKey(key);
  43. public IEnumerator<KeyValuePair<ushort, byte>> GetEnumerator() => _mrtrat.GetEnumerator();
  44. IEnumerator IEnumerable.GetEnumerator() => _mrtrat.GetEnumerator();
  45. public bool TryGetValue(ushort key, out byte value) => _mrtrat.TryGetValue(key, out value);
  46. #endregion Methods
  47. }
  48. }