public override void ReadBinary(ESPReader reader) { List <string> readTags = new List <string>(); while (reader.BaseStream.Position < reader.BaseStream.Length) { string subTag = reader.PeekTag(); switch (subTag) { case "PRKE": if (readTags.Contains("PRKE")) { return; } Header.ReadBinary(reader); break; case "DATA": if (readTags.Contains("DATA")) { return; } switch (Header.Type) { case PerkType.QuestStage: EffectData = new PerkQuestStageData(); break; case PerkType.Ability: EffectData = new PerkAbilityData(); break; case PerkType.EntryPoint: EffectData = new PerkEntryPointData(); break; } EffectData.ReadBinary(reader); break; case "PRKC": if (Conditions == null) { Conditions = new List <PerkCondition>(); } PerkCondition tempPRKC = new PerkCondition(); tempPRKC.ReadBinary(reader); Conditions.Add(tempPRKC); break; case "EPFT": if (readTags.Contains("EPFT")) { return; } if (EntryPointFunctionType == null) { EntryPointFunctionType = new SimpleSubrecord <EntryPointFunctionType>(); } EntryPointFunctionType.ReadBinary(reader); break; case "EPFD": if (readTags.Contains("EPFD")) { return; } switch (EntryPointFunctionType.Value) { case Enums.EntryPointFunctionType.None: EntryPointFunctionData = new SimpleSubrecord <byte[]>(); break; case Enums.EntryPointFunctionType.Float: EntryPointFunctionData = new SimpleSubrecord <float>(); break; case Enums.EntryPointFunctionType.FloatFloat: EntryPointFunctionData = new EntryPointRandRange(); break; case Enums.EntryPointFunctionType.LeveledItem: EntryPointFunctionData = new RecordReference(); break; case Enums.EntryPointFunctionType.Script: EntryPointFunctionData = new SimpleSubrecord <byte[]>(); break; case Enums.EntryPointFunctionType.ActorValueMult: EntryPointFunctionData = new EntryPointActorValMult(); break; } EntryPointFunctionData.ReadBinary(reader); break; case "EPF2": if (readTags.Contains("EPF2")) { return; } if (ButtonLabel == null) { ButtonLabel = new SimpleSubrecord <String>(); } ButtonLabel.ReadBinary(reader); break; case "EPF3": if (readTags.Contains("EPF3")) { return; } if (RunImmediately == null) { RunImmediately = new SimpleSubrecord <NoYesShort>(); } RunImmediately.ReadBinary(reader); break; case "SCHR": if (readTags.Contains("SCHR")) { return; } if (Script == null) { Script = new EmbeddedScript(); } Script.ReadBinary(reader); break; case "PRKF": if (readTags.Contains("PRKF")) { return; } if (EndMarker == null) { EndMarker = new SubMarker(); } EndMarker.ReadBinary(reader); break; default: return; } readTags.Add(subTag); } }