Encounters.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. namespace OpenVIII.Battle
  7. {
  8. public class Encounters : IReadOnlyList<Encounter>, IEnumerable<Encounter>, IReadOnlyCollection<Encounter>
  9. {
  10. #region Fields
  11. private List<Encounter> encounters;
  12. private int _currentIndex;
  13. private int encounterCount;
  14. public Encounters(int encounterCount) => encounters = new List<Encounter>(encounterCount);
  15. #endregion Fields
  16. #region Constructors
  17. #endregion Constructors
  18. #region Properties
  19. #endregion Properties
  20. #region Indexers
  21. #endregion Indexers
  22. #region Methods
  23. public static Encounters Read(byte[] enc)
  24. {
  25. Memory.Log.WriteLine($"{nameof(InitDebuggerBattle)} :: {nameof(Encounters)} :: {nameof(Read)}");
  26. if (enc == null || enc.Length == 0) return null;
  27. var encounterCount = enc.Length / 128;
  28. var e = new Encounters(encounterCount);
  29. MemoryStream ms = null;
  30. using (var br = new BinaryReader(ms = new MemoryStream(enc)))
  31. {
  32. for (var i = 0; i < encounterCount; i++)
  33. e.encounters.Add(Encounter.Read(br,e.Count));
  34. ms = null;
  35. }
  36. e.encounters = e.OrderBy(x => x.Scenario).ThenBy(x => x.ID).ToList();
  37. return e;
  38. }
  39. public Encounter Current => encounters[_currentIndex];
  40. public Encounter Next()
  41. {
  42. _currentIndex++;
  43. if (_currentIndex >= encounters.Count)
  44. _currentIndex = 0;
  45. return Current;
  46. }
  47. public Encounter Previous()
  48. {
  49. _currentIndex--;
  50. if (_currentIndex < 0)
  51. _currentIndex = encounters.Count - 1;
  52. return Current;
  53. }
  54. public int ID { get => Current.ID; set => _currentIndex = encounters.FindIndex(x => x.ID == value); }
  55. public byte AlternativeCamera => Current.AlternativeCamera;
  56. public EncounterFlag BattleFlags => Current.BattleFlags;
  57. public BitArray EnabledEnemy => Current.EnabledEnemy;
  58. public EnemyCoordinates enemyCoordinates => Current.EnemyCoordinates;
  59. public BitArray HiddenEnemies => Current.HiddenEnemies;
  60. public byte PrimaryCamera => Current.PrimaryCamera;
  61. public byte Scenario => Current.Scenario;
  62. public BitArray UnloadedEnemy => Current.UnloadedEnemy;
  63. public BitArray UntargetableEnemy => Current.UntargetableEnemy;
  64. public byte[] BEnemies => Current.BEnemies;
  65. public string Filename => Current.Filename;
  66. public int Count => ((IReadOnlyList<Encounter>)encounters).Count;
  67. public Encounter this[int index] => ((IReadOnlyList<Encounter>)encounters)[index];
  68. public int ResolveCameraAnimation(byte cameraPointerValue) => Current.ResolveCameraAnimation(cameraPointerValue);
  69. public int ResolveCameraSet(byte cameraPointerValue) => Current.ResolveCameraSet(cameraPointerValue);
  70. public IEnumerator<Encounter> GetEnumerator() => ((IReadOnlyList<Encounter>)encounters).GetEnumerator();
  71. IEnumerator IEnumerable.GetEnumerator() => ((IReadOnlyList<Encounter>)encounters).GetEnumerator();
  72. #endregion Methods
  73. }
  74. }