public BNDEntry GetEntry(DSBinaryReader bin) { if (FileOffset < 0 || FileOffset > bin.Length) { throw new Exception("Invalid BND3 Entry File Offset."); } bin.StepIn(FileOffset); var bytes = bin.ReadBytes(FileSize); bin.StepOut(); string fileName = null; if (FileNameOffset > -1) { bin.StepIn(FileNameOffset); { fileName = bin.ReadStringShiftJIS(); } bin.StepOut(); } return(new BNDEntry(FileID, fileName, Unknown1, bytes)); }
public EzCommandArg GetEzCommandArg(int offset) { if (DictEzCommandArg.ContainsKey(offset)) { return(DictEzCommandArg[offset]); } var esfp = new EzCommandArg(); DictEzCommandArg.Add(offset, esfp); bin.StepIn(offset); { int bytesOffset = bin.ReadInt32(); int bytesCount = bin.ReadInt32(); bin.StepIn(FILE_OFFSET + bytesOffset); { esfp.Bytes = bin.ReadBytes(bytesCount); } bin.StepOut(); } bin.StepOut(); return(esfp); }
public TPFEntry ReadNext(DSBinaryReader bin) { Offset = bin.ReadInt32(); Size = bin.ReadInt32(); FlagsA = bin.ReadUInt32(); if (TpfFlags == 0x00020300) //Dark Souls { NameOffset = bin.ReadInt32(); FlagsB = bin.ReadUInt32(); } else if (TpfFlags == 0x02010200 || TpfFlags == 0x02010000) //Demon's Souls { FlagsB = bin.ReadUInt32(); NameOffset = bin.ReadInt32(); } var newEntry = new TPFEntry() { FlagsA = FlagsA, FlagsB = FlagsB }; bin.StepIn(NameOffset); { newEntry.Name = bin.ReadStringShiftJIS(); } bin.StepOut(); bin.StepIn(Offset); { newEntry.DDSBytes = bin.ReadBytes(Size); } bin.StepOut(); return(newEntry); }
public void ReadEntries(DSBinaryReader bin, ObservableCollection <FMGEntryRef> entries) { count = (LastStringID - FirstStringID) + 1; if (count > buffer.Length) { Array.Resize(ref buffer, count * 2 /*Extra "wiggle room"*/); } bin.StepIn(StringOffsetsBeginOffset + (FirstStringIndex * 4)); { for (int i = 0; i < count; i++) { buffer[i] = bin.ReadInt32(); } for (int i = 0; i < count; i++) { string stringContents = null; if (buffer[i] == 0) { stringContents = DataFiles.FMG.NullString; } else { bin.Position = buffer[i]; stringContents = bin.ReadStringUnicode(length: null); if (string.IsNullOrWhiteSpace(stringContents.Trim())) { stringContents = DataFiles.FMG.EmptyString; } } if (stringContents == null) { throw new Exception(":trashcat:"); } entries.Add(new FMGEntryRef(FirstStringID + i, stringContents)); } } bin.StepOut(); }
public static FlverVertexStructLayout Read(DSBinaryReader bin) { var val = new FlverVertexStructLayout(); int memberCount = bin.ReadInt32(); val.Unknown1 = bin.ReadInt32(); val.Unknown2 = bin.ReadInt32(); int startOffset = bin.ReadInt32(); bin.StepIn(startOffset); { val.Members = new List <FlverVertexStructMember>(); for (int i = 0; i < memberCount; i++) { val.Members.Add(FlverVertexStructMember.Read(bin)); } } return(val); }
private AnimationRef LoadAnimationFromOffset(DSBinaryReader bin, int offset, int id, Dictionary <int, List <int> > debugUnkTypesReport) { int oldOffset = (int)bin.BaseStream.Position; bin.BaseStream.Seek(offset, SeekOrigin.Begin); var anim = new AnimationRef(); anim.ID = id; try { Dictionary <int, TimeActEventBase> eventOffsetLookupForEventGroup = new Dictionary <int, TimeActEventBase>(); int eventCount = bin.ReadInt32(); int eventHeadersOffset = bin.ReadInt32(); int eventGroupCount = bin.ReadInt32(); int eventGroupOffset = bin.ReadInt32(); var timeConstantsCount = bin.ReadInt32(); var timeConstantsOffset = bin.ReadInt32(); int animFileOffset = bin.ReadInt32(); if (Header.IsBigEndian) { bin.AssertInt32(0); bin.AssertInt32(0); bin.AssertInt32(0); bin.AssertInt32(0); bin.AssertInt32(0); } if (eventCount > 0) { for (int i = 0; i < eventCount; i++) { var thisEventOffset = eventHeadersOffset + (EventHeaderSize * i); //lazily seek to the start of each event manually. bin.BaseStream.Seek(thisEventOffset, SeekOrigin.Begin); int startTimeOffset = bin.ReadInt32(); int endTimeOffset = bin.ReadInt32(); int eventBodyOffset = bin.ReadInt32(); //if (EventHeaderSize >= 0x10) //{ // int unk = bin.ReadInt32(); // throw new Exception(); //} float startTime = -1; float endTime = -1; bin.StepIn(startTimeOffset); { startTime = bin.ReadSingle(); } bin.StepOut(); bin.StepIn(endTimeOffset); { endTime = bin.ReadSingle(); } bin.StepOut(); bin.StepIn(eventBodyOffset); { int eventTypeInt = bin.ReadInt32(); TimeActEventType eventType = (TimeActEventType)eventTypeInt; int eventParamOffset = bin.ReadInt32(); if (eventParamOffset <= 0) { var newEvent = TimeActEventBase.GetNewEvent(eventType, startTime, endTime); newEvent.Index = anim.EventList.Count; anim.EventList.Add(newEvent); eventOffsetLookupForEventGroup.Add(thisEventOffset, newEvent); } else { bin.StepIn(eventParamOffset); { var newEvent = TimeActEventBase.GetNewEvent(eventType, startTime, endTime); if (newEvent == null) { if (!debugUnkTypesReport.ContainsKey(eventTypeInt)) { debugUnkTypesReport.Add(eventTypeInt, new List <int>()); } if (i < eventCount - 1) { bin.StepIn(eventHeadersOffset + (EventHeaderSize * (i + 1))); { bin.ReadInt32(); //startTimeOffset bin.ReadInt32(); //endTimeOffset var nextEventBodyOffset = bin.ReadInt32(); int thisUnkParamByteCount = nextEventBodyOffset - eventParamOffset; if (!debugUnkTypesReport[eventTypeInt].Contains(thisUnkParamByteCount)) { debugUnkTypesReport[eventTypeInt].Add(thisUnkParamByteCount); } //bin.StepIn(nextEventBodyOffset); //{ // bin.ReadInt32();//eventType // var nextEventParamOffset = bin.ReadInt32(); // int thisUnkParamByteCount = nextEventParamOffset - eventParamOffset; // debugUnkTypesReport[eventTypeInt].Add(thisUnkParamByteCount); //} //bin.StepOut(); } bin.StepOut(); } else { //debugUnkTypesReport[eventTypeInt].Add(-1); } } else { newEvent.ReadParameters(bin); newEvent.Index = anim.EventList.Count; anim.EventList.Add(newEvent); eventOffsetLookupForEventGroup.Add(thisEventOffset, newEvent); } } bin.StepOut(); } } bin.StepOut(); } } if (eventGroupCount > 0 && eventGroupOffset > 0) { bin.StepIn(eventGroupOffset); { for (int i = 0; i < eventGroupCount; i++) { var group = new TimeActEventGroup(); int groupEntryCount = bin.ReadInt32(); int groupPointerOffset = bin.ReadInt32(); int groupTypeOffset = bin.ReadInt32(); bin.StepIn(groupPointerOffset); { for (int j = 0; j < groupEntryCount; j++) { var groupEventOffset = bin.ReadInt32(); if (eventOffsetLookupForEventGroup.ContainsKey(groupEventOffset)) { var thisGroupEvent = eventOffsetLookupForEventGroup[groupEventOffset]; group.Events.Add(thisGroupEvent); } } } bin.StepOut(); bin.StepIn(groupTypeOffset); { group.GeneralType = (TimeActEventType)bin.ReadInt32(); } bin.StepOut(); anim.EventGroupList.Add(group); } } bin.StepOut(); } bin.BaseStream.Seek(animFileOffset, SeekOrigin.Begin); int fileType = bin.ReadInt32(); if (fileType == 0) { anim.IsReference = false; int dataOffset = bin.ReadInt32(); //bin.BaseStream.Seek(dataOffset, SeekOrigin.Begin); int nameOffset = -1; if (Header.IsBigEndian) { anim.OriginalAnimID = bin.ReadInt32(); bin.AssertByte(0); anim.TAEDataOnly = bin.ReadBoolean(); anim.UseHKXOnly = bin.ReadBoolean(); anim.IsLoopingObjAnim = bin.ReadBoolean(); nameOffset = bin.ReadInt32(); var secondaryNameOffset = bin.ReadInt32(); } else { nameOffset = bin.ReadInt32(); anim.IsLoopingObjAnim = bin.ReadBoolean(); anim.UseHKXOnly = bin.ReadBoolean(); anim.TAEDataOnly = bin.ReadBoolean(); bin.AssertByte(0); anim.OriginalAnimID = bin.ReadInt32(); bin.AssertInt32(0); } if (nameOffset <= 0) { //throw new Exception("Anim file type was that of a named one but the name pointer was NULL."); } else { bin.BaseStream.Seek(nameOffset, SeekOrigin.Begin); anim.FileName = ReadUnicodeString(bin); } } else if (fileType == 1) { anim.IsReference = true; anim.FileName = null; if (Header.IsBigEndian) { var nullA = bin.ReadInt32(); var nullB = bin.ReadInt32(); var offsetPointingToNextDword = bin.ReadInt32(); var offsetPointingToStartOfNextAnimFileStruct = bin.ReadInt32(); anim.RefAnimID = bin.ReadInt32(); var nullC = bin.ReadInt32(); } else { var offsetPointingToNextDword = bin.ReadInt32(); var offsetPointingToStartOfNextAnimFileStruct = bin.ReadInt32(); anim.RefAnimID = bin.ReadInt32(); var nullA = bin.ReadInt32(); var nullB = bin.ReadInt32(); var nullC = bin.ReadInt32(); } } else { throw new Exception($"Unknown anim file type code: {fileType}"); } return(anim); } catch (EndOfStreamException) { MiscUtil.PrintlnDX($"Warning: reached end of file while parsing animation {id}; data may not be complete.", ConsoleColor.Yellow); //if (!MiscUtil.ConsolePrompYesNo("Would you like to continue loading the file and run the risk of " + // "accidentally outputting a file that might be missing some of its original data?")) //{ // throw new LoadAbortedException(); //} //else //{ // return a; //} return(anim); } finally { bin.BaseStream.Seek(oldOffset, SeekOrigin.Begin); } }
private Animation LoadAnimationFromOffset(DSBinaryReader bin, int offset, int animID_ForDebug) { int oldOffset = (int)bin.BaseStream.Position; bin.BaseStream.Seek(offset, SeekOrigin.Begin); var anim = new Animation(); try { int eventCount = bin.ReadInt32(); int eventHeadersOffset = bin.ReadInt32(); bin.BaseStream.Seek(0x10, SeekOrigin.Current); //skip shit we don't need int animFileOffset = bin.ReadInt32(); for (int i = 0; i < eventCount; i++) { //lazily seek to the start of each event manually. bin.BaseStream.Seek(eventHeadersOffset + (EventHeaderSize * i), SeekOrigin.Begin); int startTimeOffset = bin.ReadInt32(); int endTimeOffset = bin.ReadInt32(); int eventBodyOffset = bin.ReadInt32(); float startTime = -1; float endTime = -1; bin.StepIn(startTimeOffset); { startTime = bin.ReadSingle(); } bin.StepOut(); bin.StepIn(endTimeOffset); { endTime = bin.ReadSingle(); } bin.StepOut(); bin.StepIn(eventBodyOffset); { TimeActEventType eventType = (TimeActEventType)bin.ReadInt32(); int eventParamOffset = bin.ReadInt32(); bin.StepIn(eventParamOffset); { switch (eventType) { case TimeActEventType.Type000: var newType000 = new Tae000(startTime, endTime); newType000.ReadParameters(bin); anim.EventList.Add(newType000); break; case TimeActEventType.Type001: var newType001 = new Tae001(startTime, endTime); newType001.ReadParameters(bin); anim.EventList.Add(newType001); break; case TimeActEventType.Type002: var newType002 = new Tae002(startTime, endTime); newType002.ReadParameters(bin); anim.EventList.Add(newType002); break; case TimeActEventType.Type005: var newType005 = new Tae005(startTime, endTime); newType005.ReadParameters(bin); anim.EventList.Add(newType005); break; case TimeActEventType.Type008: var newType008 = new Tae008(startTime, endTime); newType008.ReadParameters(bin); anim.EventList.Add(newType008); break; case TimeActEventType.Type016: var newType016 = new Tae016(startTime, endTime); newType016.ReadParameters(bin); anim.EventList.Add(newType016); break; case TimeActEventType.Type024: var newType024 = new Tae024(startTime, endTime); newType024.ReadParameters(bin); anim.EventList.Add(newType024); break; case TimeActEventType.Type032: var newType032 = new Tae032(startTime, endTime); newType032.ReadParameters(bin); anim.EventList.Add(newType032); break; case TimeActEventType.Type033: var newType033 = new Tae033(startTime, endTime); newType033.ReadParameters(bin); anim.EventList.Add(newType033); break; case TimeActEventType.Type064: var newType064 = new Tae064(startTime, endTime); newType064.ReadParameters(bin); anim.EventList.Add(newType064); break; case TimeActEventType.Type065: var newType065 = new Tae065(startTime, endTime); newType065.ReadParameters(bin); anim.EventList.Add(newType065); break; case TimeActEventType.Type066: var newType066 = new Tae066(startTime, endTime); newType066.ReadParameters(bin); anim.EventList.Add(newType066); break; case TimeActEventType.Type067: var newType067 = new Tae067(startTime, endTime); newType067.ReadParameters(bin); anim.EventList.Add(newType067); break; case TimeActEventType.Type096: var newType096 = new Tae096(startTime, endTime); newType096.ReadParameters(bin); anim.EventList.Add(newType096); break; case TimeActEventType.Type099: var newType099 = new Tae099(startTime, endTime); newType099.ReadParameters(bin); anim.EventList.Add(newType099); break; case TimeActEventType.Type100: var newType100 = new Tae100(startTime, endTime); newType100.ReadParameters(bin); anim.EventList.Add(newType100); break; case TimeActEventType.Type101: var newType101 = new Tae101(startTime, endTime); newType101.ReadParameters(bin); anim.EventList.Add(newType101); break; case TimeActEventType.Type104: var newType104 = new Tae104(startTime, endTime); newType104.ReadParameters(bin); anim.EventList.Add(newType104); break; case TimeActEventType.Type108: var newType108 = new Tae108(startTime, endTime); newType108.ReadParameters(bin); anim.EventList.Add(newType108); break; case TimeActEventType.Type109: var newType109 = new Tae109(startTime, endTime); newType109.ReadParameters(bin); anim.EventList.Add(newType109); break; case TimeActEventType.Type110: var newType110 = new Tae110(startTime, endTime); newType110.ReadParameters(bin); anim.EventList.Add(newType110); break; case TimeActEventType.Type112: var newType112 = new Tae112(startTime, endTime); newType112.ReadParameters(bin); anim.EventList.Add(newType112); break; case TimeActEventType.Type114: var newType114 = new Tae114(startTime, endTime); newType114.ReadParameters(bin); anim.EventList.Add(newType114); break; case TimeActEventType.Type115: var newType115 = new Tae115(startTime, endTime); newType115.ReadParameters(bin); anim.EventList.Add(newType115); break; case TimeActEventType.Type116: var newType116 = new Tae116(startTime, endTime); newType116.ReadParameters(bin); anim.EventList.Add(newType116); break; case TimeActEventType.Type118: var newType118 = new Tae118(startTime, endTime); newType118.ReadParameters(bin); anim.EventList.Add(newType118); break; case TimeActEventType.Type119: var newType119 = new Tae119(startTime, endTime); newType119.ReadParameters(bin); anim.EventList.Add(newType119); break; case TimeActEventType.Type120: var newType120 = new Tae120(startTime, endTime); newType120.ReadParameters(bin); anim.EventList.Add(newType120); break; case TimeActEventType.Type121: var newType121 = new Tae121(startTime, endTime); newType121.ReadParameters(bin); anim.EventList.Add(newType121); break; case TimeActEventType.Type128: var newType128 = new Tae128(startTime, endTime); newType128.ReadParameters(bin); anim.EventList.Add(newType128); break; case TimeActEventType.Type129: var newType129 = new Tae129(startTime, endTime); newType129.ReadParameters(bin); anim.EventList.Add(newType129); break; case TimeActEventType.Type130: var newType130 = new Tae130(startTime, endTime); newType130.ReadParameters(bin); anim.EventList.Add(newType130); break; case TimeActEventType.Type144: var newType144 = new Tae144(startTime, endTime); newType144.ReadParameters(bin); anim.EventList.Add(newType144); break; case TimeActEventType.Type145: var newType145 = new Tae145(startTime, endTime); newType145.ReadParameters(bin); anim.EventList.Add(newType145); break; case TimeActEventType.Type193: var newType193 = new Tae193(startTime, endTime); newType193.ReadParameters(bin); anim.EventList.Add(newType193); break; case TimeActEventType.Type224: var newType224 = new Tae224(startTime, endTime); newType224.ReadParameters(bin); anim.EventList.Add(newType224); break; case TimeActEventType.Type225: var newType225 = new Tae225(startTime, endTime); newType225.ReadParameters(bin); anim.EventList.Add(newType225); break; case TimeActEventType.Type226: var newType226 = new Tae226(startTime, endTime); newType226.ReadParameters(bin); anim.EventList.Add(newType226); break; case TimeActEventType.Type228: var newType228 = new Tae228(startTime, endTime); newType228.ReadParameters(bin); anim.EventList.Add(newType228); break; case TimeActEventType.Type229: var newType229 = new Tae229(startTime, endTime); newType229.ReadParameters(bin); anim.EventList.Add(newType229); break; case TimeActEventType.Type231: var newType231 = new Tae231(startTime, endTime); newType231.ReadParameters(bin); anim.EventList.Add(newType231); break; case TimeActEventType.Type232: var newType232 = new Tae232(startTime, endTime); newType232.ReadParameters(bin); anim.EventList.Add(newType232); break; case TimeActEventType.Type233: var newType233 = new Tae233(startTime, endTime); newType233.ReadParameters(bin); anim.EventList.Add(newType233); break; case TimeActEventType.Type236: var newType236 = new Tae236(startTime, endTime); newType236.ReadParameters(bin); anim.EventList.Add(newType236); break; case TimeActEventType.Type300: var newType300 = new Tae300(startTime, endTime); newType300.ReadParameters(bin); anim.EventList.Add(newType300); break; case TimeActEventType.Type301: var newType301 = new Tae301(startTime, endTime); newType301.ReadParameters(bin); anim.EventList.Add(newType301); break; case TimeActEventType.Type302: var newType302 = new Tae302(startTime, endTime); newType302.ReadParameters(bin); anim.EventList.Add(newType302); break; case TimeActEventType.Type303: var newType303 = new Tae303(startTime, endTime); newType303.ReadParameters(bin); anim.EventList.Add(newType303); break; case TimeActEventType.Type304: var newType304 = new Tae304(startTime, endTime); newType304.ReadParameters(bin); anim.EventList.Add(newType304); break; case TimeActEventType.Type306: var newType306 = new Tae306(startTime, endTime); newType306.ReadParameters(bin); anim.EventList.Add(newType306); break; case TimeActEventType.Type307: var newType307 = new Tae307(startTime, endTime); newType307.ReadParameters(bin); anim.EventList.Add(newType307); break; case TimeActEventType.Type308: var newType308 = new Tae308(startTime, endTime); newType308.ReadParameters(bin); anim.EventList.Add(newType308); break; case TimeActEventType.Type401: var newType401 = new Tae401(startTime, endTime); newType401.ReadParameters(bin); anim.EventList.Add(newType401); break; case TimeActEventType.Type500: var newType500 = new Tae500(startTime, endTime); newType500.ReadParameters(bin); anim.EventList.Add(newType500); break; } } bin.StepOut(); } bin.StepOut(); } bin.BaseStream.Seek(animFileOffset, SeekOrigin.Begin); int fileType = bin.ReadInt32(); if (fileType == 0) { anim.IsReference = false; int dataOffset = bin.ReadInt32(); //bin.BaseStream.Seek(dataOffset, SeekOrigin.Begin); int nameOffset = bin.ReadInt32(); anim.Unk1 = bin.ReadInt32(); anim.Unk2 = bin.ReadInt32(); if (nameOffset <= 0) { throw new Exception("Anim file type was that of a named one but the name pointer was NULL."); } bin.BaseStream.Seek(nameOffset, SeekOrigin.Begin); anim.FileName = ReadUnicodeString(bin); } else if (fileType == 1) { anim.IsReference = true; anim.FileName = null; bin.ReadInt32(); //offset pointing to next dword for some reason. bin.ReadInt32(); //offset pointing to start of next anim file struct anim.RefAnimID = bin.ReadInt32(); //Null 1 //Null 2 //Null 3 } else { throw new Exception($"Unknown anim file type code: {fileType}"); } return(anim); } catch (EndOfStreamException) { MiscUtil.PrintlnDX($"Warning: reached end of file while parsing animation {animID_ForDebug}; data may not be complete.", ConsoleColor.Yellow); //if (!MiscUtil.ConsolePrompYesNo("Would you like to continue loading the file and run the risk of " + // "accidentally outputting a file that might be missing some of its original data?")) //{ // throw new LoadAbortedException(); //} //else //{ // return a; //} return(anim); } finally { bin.BaseStream.Seek(oldOffset, SeekOrigin.Begin); } }