INF.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using Microsoft.Xna.Framework;
  2. using System;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. namespace OpenVIII.Fields
  7. {
  8. /// <summary>
  9. /// Gateways, Triggers, Camera Limits
  10. /// </summary>
  11. /// <see cref="http://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_INF"/>
  12. public class INF
  13. {
  14. #region Properties
  15. public short CameraHeight { get; set; }
  16. public Rectangle[] CamerasRanges { get; set; }
  17. public byte ControlDirection { get; set; }
  18. public Gateways Gateways { get; set; }
  19. public ushort LikePVP { get; set; }
  20. public FF8String Name { get; set; }
  21. public Rectangle[] ScreenRanges { get; set; }
  22. public Triggers Triggers { get; set; }
  23. public int Type { get; set; }
  24. public byte[] Unknown { get; set; }
  25. #endregion Properties
  26. #region Methods
  27. public static INF Load(byte[] inf)
  28. {
  29. if (inf == null || inf.Length == 0) return default;
  30. var r = new INF();
  31. r.ReadData(inf);
  32. return r;
  33. }
  34. private void ReadData(byte[] inf)
  35. {
  36. using (var br = new BinaryReader(new MemoryStream(inf)))
  37. {
  38. switch (inf.Length)
  39. {
  40. case 676:
  41. Type = 0;
  42. break;
  43. case 672:
  44. Type = 1;
  45. break;
  46. case 576:
  47. Type = 2;
  48. break;
  49. case 504:
  50. Type = 3;
  51. break;
  52. default:
  53. throw new Exception("unknown format INF");
  54. }
  55. Name = new FF8String(br.ReadBytes(9));
  56. ControlDirection = br.ReadByte();
  57. if (Type == 0)
  58. {
  59. Unknown = br.ReadBytes(6);
  60. LikePVP = br.ReadUInt16();
  61. }
  62. else if (Type >= 1)
  63. {
  64. Unknown = br.ReadBytes(4);
  65. }
  66. CameraHeight = br.ReadInt16();
  67. CamerasRanges = new Rectangle[Type <= 2 ? 8 : 1];
  68. foreach (var i in Enumerable.Range(0, CamerasRanges.Length))
  69. {
  70. CamerasRanges[i].Y = br.ReadInt16();
  71. CamerasRanges[i].Height = br.ReadInt16();
  72. CamerasRanges[i].Width = br.ReadInt16();
  73. CamerasRanges[i].X = br.ReadInt16();
  74. CamerasRanges[i].Height -= CamerasRanges[i].Y;
  75. CamerasRanges[i].Width -= CamerasRanges[i].X;
  76. }
  77. if (Type <= 2)
  78. {
  79. ScreenRanges = new Rectangle[2];
  80. foreach (var i in Enumerable.Range(0, ScreenRanges.Length))
  81. {
  82. ScreenRanges[i].Y = br.ReadInt16();
  83. ScreenRanges[i].Height = br.ReadInt16();
  84. ScreenRanges[i].Width = br.ReadInt16();
  85. ScreenRanges[i].X = br.ReadInt16();
  86. ScreenRanges[i].Height -= ScreenRanges[i].Y;
  87. ScreenRanges[i].Width -= ScreenRanges[i].X;
  88. }
  89. }
  90. Gateways = Gateways.Read(br, Type);
  91. Triggers = Triggers.Read(br);
  92. Debug.Assert(br.BaseStream.Length == br.BaseStream.Position);
  93. }
  94. }
  95. #endregion Methods
  96. }
  97. }