public ClearData(Chapter chapter) : base(chapter) { if (!this.Signature.Equals(ValidSignature, StringComparison.Ordinal)) { throw new InvalidDataException("Signature"); } if (this.Version != ValidVersion) { throw new InvalidDataException("Version"); } if (this.Size != ValidSize) { throw new InvalidDataException("Size"); } var levels = Utils.GetEnumerator <Level>(); var levelsExceptExtra = levels.Where(lv => lv != Level.Extra); var stages = Utils.GetEnumerator <Stage>(); var stagesExceptExtra = stages.Where(st => st != Stage.Extra); var numLevels = levels.Count(); var numPairs = levelsExceptExtra.Count() * stagesExceptExtra.Count(); this.Rankings = new Dictionary <Level, ScoreData[]>(numLevels); this.ClearCounts = new Dictionary <Level, int>(numLevels); this.Practices = new Dictionary <LevelStagePair, Practice>(numPairs); this.Cards = new Dictionary <int, SpellCard>(CardTable.Count); using (var stream = new MemoryStream(this.Data, false)) { var reader = new BinaryReader(stream); this.Chara = (CharaWithTotal)reader.ReadInt32(); foreach (var level in levels) { if (!this.Rankings.ContainsKey(level)) { this.Rankings.Add(level, new ScoreData[10]); } for (var rank = 0; rank < 10; rank++) { var score = new ScoreData(); score.ReadFrom(reader); this.Rankings[level][rank] = score; } } this.TotalPlayCount = reader.ReadInt32(); this.PlayTime = reader.ReadInt32(); foreach (var level in levels) { var clearCount = reader.ReadInt32(); if (!this.ClearCounts.ContainsKey(level)) { this.ClearCounts.Add(level, clearCount); } } foreach (var level in levelsExceptExtra) { foreach (var stage in stagesExceptExtra) { var practice = new Practice(); practice.ReadFrom(reader); var key = new LevelStagePair(level, stage); if (!this.Practices.ContainsKey(key)) { this.Practices.Add(key, practice); } } } for (var number = 0; number < CardTable.Count; number++) { var card = new SpellCard(); card.ReadFrom(reader); if (!this.Cards.ContainsKey(card.Id)) { this.Cards.Add(card.Id, card); } } } }