private bool ReadSceneCard(string fileName, CardTypes cardType, BinaryReader reader, long pngEnd) { var finderArr = new CardTypeFinder[] { new CardTypeFinder(CardTypes.KoiKatuChara), new CardTypeFinder(CardTypes.KoiKatuCharaS), new CardTypeFinder(CardTypes.KoiKatuCharaSP), new CardTypeFinder(CardTypes.AIS_Chara), new CardTypeFinder(CardTypes.HoneySelectCharaMale), new CardTypeFinder(CardTypes.HoneySelectCharaFemale) }; if (cardType == CardTypes.PHStudio) { PHSceneCard pHScene = new PHSceneCard(fileName); pHScene.Parse(reader, pngEnd); if (pHScene.CharaCards.Count > 0) { this.Cards.AddRange(pHScene.CharaCards); } return(true); } foreach (var finder in finderArr) { reader.Seek(pngEnd, SeekOrigin.Begin); if (finder.Find(reader, false)) { try { do { long charaPos = finder.Position; reader.Seek(charaPos + finder.MarkerPattern.Length, SeekOrigin.Begin); ICharaCard card = null; switch (finder.CardType) { case CardTypes.KoiKatuChara: case CardTypes.KoiKatuCharaS: case CardTypes.KoiKatuCharaSP: card = new KKCharaCard(fileName, 100, finder.Marker); break; case CardTypes.AIS_Chara: card = new AISCharaCard(fileName, 100, finder.Marker); break; case CardTypes.HoneySelectCharaMale: card = new HSCharaCard(fileName, finder.Marker, 0); break; case CardTypes.HoneySelectCharaFemale: card = new HSCharaCard(fileName, finder.Marker, 1); break; default: break; } if (card != null && card.Parse(reader, 0)) { Cards.Add(card); } reader.Seek(charaPos + finder.MarkerPattern.Length + 1, SeekOrigin.Begin); } while (finder.Find(reader, false)); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); } } } return(true); }
protected virtual void ReadOICharInfo(BinaryReader reader, Version version) { ReadObjectInfo(reader, version, true); var sex = reader.ReadInt32(); var mark = reader.ReadString(); HSCharaCard charaCard = new HSCharaCard(this.SourceFileName, mark, (short)sex); charaCard.Parse(reader, 0L); this.CharaCards.Add(charaCard); // bones int countBones = reader.ReadInt32(); for (int i = 0; i < countBones; i++) { reader.ReadBytes(4); // key ReadObjectInfo(reader, version, false); } // IkTarget int countIkTarget = reader.ReadInt32(); for (int i = 0; i < countIkTarget; i++) { reader.ReadBytes(4); // key ReadObjectInfo(reader, version, false); } int countChild = reader.ReadInt32(); for (int i = 0; i < countChild; i++) { reader.ReadBytes(4); ReadChild(reader, version); } // kinematicMode, animeInfo.group, animeInfo.category, animeInfo.no // handPtnL, handPtnR, skinRate, nipple reader.ReadBytes(32); if (version >= VersionOf(0, 1, 3)) { reader.ReadBytes(5); // siru } if (version >= VersionOf(0, 1, 1)) { reader.ReadBytes(4); // mouthOpen } // lipSync reader.ReadByte(); // lookAtTarget ReadObjectInfo(reader, version, false); // enableIK, activeIK, enableFK, activeFK, expression // 18 // animeSpeed, animePattern reader.ReadBytes(26); if (version >= VersionOf(0, 1, 1)) { reader.ReadByte(); // animeOptionVisible } if (version >= VersionOf(0, 1, 5)) { reader.ReadByte(); // isAnimeForceLoop } // VoiceCtrl int cVoice = reader.ReadInt32(); for (int i = 0; i < cVoice; i++) { // group, category, no reader.ReadBytes(12); } reader.ReadBytes(4); // repeat if (sex == 0) { // visibleSimple, colorType, simpleColor, visibleSon reader.ReadBytes(78); if (version >= VersionOf(0, 1, 2)) { // animeOptionParam[0], animeOptionParam[1] reader.ReadBytes(8); } } // neckByteData int cNeckByte = reader.ReadInt32(); reader.ReadBytes(cNeckByte); if (version >= VersionOf(0, 1, 4)) { // eyesByteData int cEyesByte = reader.ReadInt32(); reader.ReadBytes(cEyesByte); } // animeNormalizedTime reader.ReadBytes(4); if (version >= VersionOf(0, 1, 2)) { // dicAccessGroup int accessGroup = reader.ReadInt32(); if (accessGroup > 0) { reader.ReadBytes(8 * accessGroup); } // dicAccessNo int accessNo = reader.ReadInt32(); if (accessNo > 0) { reader.ReadBytes(8 * accessNo); } } }