public override void Load(Stream fileStream) { ExtendedBinaryReader reader = new ExtendedBinaryReader(fileStream) { Offset = 0x20 }; long pos = 0; NinjaInfo = new NinjaInfo() { NodeName = new string(reader.ReadChars(4)) }; uint NodeLength = reader.ReadUInt32(); uint NodeCount = reader.ReadUInt32(); uint Unknown1 = reader.ReadUInt32(); //Seems to always be 0x20 (at least in XN*s)? uint Unknown2 = reader.ReadUInt32(); //Footer Offset Table Start? uint Unknown3 = reader.ReadUInt32(); //Footer Offset Table Data Start? uint Unknown4 = reader.ReadUInt32(); //Footer Offset Table Length? uint Unknown5 = reader.ReadUInt32(); //Seems to always be 1 (at least in XN*s)? for (int i = 0; i < NodeCount; i++) { //Determine type of node to read string NextNodeName = new string(reader.ReadChars(4)); uint NextNodeLength = reader.ReadUInt32(); reader.JumpBehind(8); switch (NextNodeName) { case "NXTL": case "NZTL": NinjaTextureList = ReadNinjaTextureList(reader, pos); break; case "NXEF": NinjaEffectList = ReadNinjaEffectList(reader, pos); break; case "NXNN": NinjaNodeNameList = ReadNinjaNodeNameList(reader, pos); break; case "NXOB": case "NZOB": NinjaObject = ReadNinjaObject(reader, pos); break; default: reader.JumpAhead(8); reader.JumpAhead(NextNodeLength); //Console.WriteLine($"Block {NextNodeName} Not Implemented!"); break; } } }
public NinjaEffectList ReadNinjaEffectList(ExtendedBinaryReader reader, long pos) { NinjaEffectList = new NinjaEffectList() { NodeName = new string(reader.ReadChars(4)) }; uint NodeLength = reader.ReadUInt32(); pos = reader.BaseStream.Position; //Save Position uint NodeOffset = reader.ReadUInt32(); reader.JumpTo(NodeOffset, false); uint Unknown1 = reader.ReadUInt32(); //Seems to always be 0 (at least in XN*s)? (Padding?) uint EffectTypeCount = reader.ReadUInt32(); uint EffectTypeOffset = reader.ReadUInt32(); uint TechniqueCount = reader.ReadUInt32(); uint TechniqueOffset = reader.ReadUInt32(); uint TechniqueIDXCount = reader.ReadUInt32(); uint TechniqueIDXOffset = reader.ReadUInt32(); //Effect Files reader.JumpTo(EffectTypeOffset, false); for (int i = 0; i < EffectTypeCount; i++) { NinjaEffectFile EffectFile = new NinjaEffectFile() { Type = reader.ReadUInt32() }; uint EffectFilenameOffset = reader.ReadUInt32(); long currentPos = reader.BaseStream.Position; //Save Position reader.JumpTo(EffectFilenameOffset, false); EffectFile.Filename = reader.ReadNullTerminatedString(); reader.JumpTo(currentPos, true); NinjaEffectList.EffectFiles.Add(EffectFile); } //Effect List reader.JumpTo(TechniqueOffset, false); for (int i = 0; i < TechniqueCount; i++) { NinjaEffectTechnique Technique = new NinjaEffectTechnique() { Type = reader.ReadUInt32(), ID = reader.ReadUInt32() }; uint TechniqueNameOffset = reader.ReadUInt32(); long currentPos = reader.BaseStream.Position; //Save Position reader.JumpTo(TechniqueNameOffset, false); Technique.TechniqueName = reader.ReadNullTerminatedString(); reader.JumpTo(currentPos, true); NinjaEffectList.Techniques.Add(Technique); } //Technique IDX (not sure what this is for) reader.JumpTo(TechniqueIDXOffset, false); for (int i = 0; i < TechniqueIDXCount; i++) { NinjaEffectList.TechniqueIDX.Add(reader.ReadUInt16()); } reader.JumpTo(pos, true); reader.JumpAhead(NodeLength); return(NinjaEffectList); }