/// <summary> /// Loads the file from the specified stream. /// </summary> /// <param name="stream">The stream to read from.</param> public override void Load(Stream stream) { BinaryReader reader = new BinaryReader(stream, CodePagesEncodingProvider.Instance.GetEncoding("EUC-KR")); AlignedBinaryReader alignedReader = new AlignedBinaryReader(stream, CodePagesEncodingProvider.Instance.GetEncoding("EUC-KR")); int patternCount = reader.ReadInt32(); IdleInterval = reader.ReadInt32(); DamageRate = reader.ReadInt32(); Name = reader.ReadIntString(); for (int i = 0; i < patternCount; i++) { var pattern = new ArtificialIntelligencePattern(); pattern.Name = reader.ReadString(32).TrimEnd('\0'); int eventCount = reader.ReadInt32(); for (int j = 0; j < eventCount; j++) { var @event = new ArtificialIntelligenceEvent(); @event.Name = reader.ReadString(32).TrimEnd('\0'); int conditionCount = reader.ReadInt32(); for (int k = 0; k < conditionCount; k++) { long position = stream.Position; int size = reader.ReadInt32(); var type = (ArtificialIntelligenceCondition)(reader.ReadInt32() ^ CONDITION_MASK); if (!Enum.IsDefined(typeof(ArtificialIntelligenceCondition), type)) { throw new InvalidArtificialIntelligenceConditionException((int)type); } Type classType = type.GetAttributeValue <ArtificialIntelligenceTypeAttribute, Type>(x => x.Type); var condition = (IArtificialIntelligenceCondition)Activator.CreateInstance(classType); alignedReader.Reset(); condition.Read(alignedReader); alignedReader.Align(); @event.Conditions.Add(condition); if (stream.Position - position != size) { stream.Seek(position + size, SeekOrigin.Begin); } } int actionCount = reader.ReadInt32(); for (int k = 0; k < actionCount; k++) { long position = stream.Position; int size = reader.ReadInt32(); var type = (ArtificialIntelligenceAction)(reader.ReadInt32() ^ ACTION_MASK); if (!Enum.IsDefined(typeof(ArtificialIntelligenceAction), type)) { throw new InvalidArtificialIntelligenceActionException((int)type); } Type classType = type.GetAttributeValue <ArtificialIntelligenceTypeAttribute, Type>(x => x.Type); var action = (IArtificialIntelligenceAction)Activator.CreateInstance(classType); alignedReader.Reset(); action.Read(alignedReader); alignedReader.Align(); @event.Actions.Add(action); if (stream.Position - position != size) { stream.Seek(position + size, SeekOrigin.Begin); } } pattern.Events.Add(@event); } Patterns.Add(pattern); } }
/// <summary> /// Loads the file from the specified stream. /// </summary> /// <param name="stream">The stream to read from.</param> public override void Load(Stream stream) { BinaryReader reader = new BinaryReader(stream, Encoding.GetEncoding("EUC-KR")); AlignedBinaryReader alignedReader = new AlignedBinaryReader(stream, Encoding.GetEncoding("EUC-KR")); int patternCount = reader.ReadInt32(); IdleInterval = reader.ReadInt32(); DamageRate = reader.ReadInt32(); Name = reader.ReadIntString(); for (int i = 0; i < patternCount; i++) { var pattern = new ArtificialIntelligencePattern(); pattern.Name = reader.ReadString(32).TrimEnd('\0'); int eventCount = reader.ReadInt32(); for (int j = 0; j < eventCount; j++) { var @event = new ArtificialIntelligenceEvent(); @event.Name = reader.ReadString(32).TrimEnd('\0'); int conditionCount = reader.ReadInt32(); for (int k = 0; k < conditionCount; k++) { long position = stream.Position; int size = reader.ReadInt32(); var type = (ArtificialIntelligenceCondition)(reader.ReadInt32() ^ CONDITION_MASK); if (!Enum.IsDefined(typeof(ArtificialIntelligenceCondition), type)) { throw new InvalidArtificialIntelligenceConditionException((int)type); } Type classType = type.GetAttributeValue<ArtificialIntelligenceTypeAttribute, Type>(x => x.Type); var condition = (IArtificialIntelligenceCondition)Activator.CreateInstance(classType); alignedReader.Reset(); condition.Read(alignedReader); alignedReader.Align(); @event.Conditions.Add(condition); if (stream.Position - position != size) { stream.Seek(position + size, SeekOrigin.Begin); } } int actionCount = reader.ReadInt32(); for (int k = 0; k < actionCount; k++) { long position = stream.Position; int size = reader.ReadInt32(); var type = (ArtificialIntelligenceAction)(reader.ReadInt32() ^ ACTION_MASK); if (!Enum.IsDefined(typeof(ArtificialIntelligenceAction), type)) { throw new InvalidArtificialIntelligenceActionException((int)type); } Type classType = type.GetAttributeValue<ArtificialIntelligenceTypeAttribute, Type>(x => x.Type); var action = (IArtificialIntelligenceAction)Activator.CreateInstance(classType); alignedReader.Reset(); action.Read(alignedReader); alignedReader.Align(); @event.Actions.Add(action); if (stream.Position - position != size) { stream.Seek(position + size, SeekOrigin.Begin); } } pattern.Events.Add(@event); } Patterns.Add(pattern); } }