protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent) { while (true) { byte next = reader.ReadByte(); reader.BaseStream.Position--; if (next == 0xFF) { break; } SR1_String name = new SR1_String(16); name.SetReadMax(true).Read(reader, this, "[" + _List.Count.ToString() + "]"); _List.Add(name); } pad.Read(reader, this, "pad"); listStart.Read(reader, this, "listStart"); for (int i = 0; i < _List.Count; i++) { string objectName = _List[i].ToString(); if (objectName == "Shadow" || objectName == "Shadow2" || objectName == "Shadow3") { continue; } reader.File._ObjectNames.Add(_List[i].ToString()); } }
public void Read(SR1_Reader reader, SR1_Structure parent, string name) { Start = (uint)reader.BaseStream.Position; End = (uint)reader.BaseStream.Position; Parent = parent; Name = name; if (Parent == null) { reader.File._Structures.Add(Start, this); } else { Parent.MembersRead.Add(this); } try { ReadMembers(reader, parent); if (_padding != null && reader.PlanMarkerList != null && reader.PlanMarkerList.Offset != 0 && reader.BaseStream.Position == reader.PlanMarkerList.Offset) { _padding = null; } if (_padding != null) { uint mod = (uint)reader.BaseStream.Position % (uint)_padding.Length; if (mod > 0) { uint padding = (uint)_padding.Length - mod; for (int i = 0; i < padding; i++) { _padding[i] = reader.ReadByte(); } } } End = (uint)reader.BaseStream.Position; ReadReferences(reader, parent); } catch (Exception exception) { reader.LogError(GetTypeName(true) + " (0x" + Start.ToString("X8") + "):\r\n" + exception.Message); } reader.BaseStream.Position = End; }
protected static object ReadPrimativeType <T>(SR1_Reader reader) { TypeCode typeCode = Type.GetTypeCode(typeof(T)); switch (typeCode) { case TypeCode.Boolean: return(reader.ReadBoolean()); case TypeCode.Char: return((char)reader.ReadSByte()); case TypeCode.SByte: return(reader.ReadSByte()); case TypeCode.Byte: return(reader.ReadByte()); case TypeCode.Int16: return(reader.ReadInt16()); case TypeCode.UInt16: return(reader.ReadUInt16()); case TypeCode.Int32: return(reader.ReadInt32()); case TypeCode.UInt32: return(reader.ReadUInt32()); case TypeCode.Int64: return(reader.ReadInt64()); case TypeCode.UInt64: return(reader.ReadUInt64()); case TypeCode.Single: return(reader.ReadSingle()); case TypeCode.Double: return(reader.ReadDouble()); default: throw new Exception("Unhandled primative type."); } }
protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent) { int bufferLength = 0; long oldPos = reader.BaseStream.Position; while (true) { bufferLength++; byte next = reader.ReadByte(); if (next == 0xD3) { break; } } reader.BaseStream.Position = oldPos; data = new SR1_PrimativeArray <byte>(bufferLength); data.SetPadding(4); data.Read(reader, this, "data"); }
protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent) { sectionCount.Read(reader, this, "sectionCount"); s0TailTime.Read(reader, this, "s0TailTime"); s1TailTime.Read(reader, this, "s1TailTime"); s2TailTime.Read(reader, this, "s2TailTime"); keyCount.Read(reader, this, "keyCount"); if (sectionCount.Value == 255) { objectName.SetPadding(4); objectName.Read(reader, this, "objectName"); } else { ReadSectionData(reader); timePerKey.Read(reader, this, "timePerKey"); pad00.Read(reader, this, "pad00"); pad01.Read(reader, this, "pad01"); pad10.Read(reader, this, "pad10"); pad11.Read(reader, this, "pad11"); fxList.Read(reader, this, "fxList"); uint mod; long segKeyList = 0; if (sectionData.numSections > 0) { segKeyList = channels[0].ReadChanData(reader, this); } if (sectionData.numSections > 1) { segKeyList = channels[1].ReadChanData(reader, this); } if (sectionData.numSections > 2) { segKeyList = channels[2].ReadChanData(reader, this); } int flagBitOffset = 8; int segIndex = ((sectionData.numSegments * 3) + 7) & unchecked ((int)0xfffffff8); byte wombatFlags = reader.ReadByte(); reader.BaseStream.Position--; if ((wombatFlags & 0x01) != 0) { flagBitOffset += segIndex; } if ((wombatFlags & 0x02) != 0) { flagBitOffset += segIndex; } if ((wombatFlags & 0x04) != 0) { flagBitOffset += segIndex; } int nextOffset = 0; mod = (uint)flagBitOffset % 16; // Need 16 bits to pad the buffer to 2 bytes. if (mod > 0) { flagBitOffset += (int)(16 - mod); // Need 16 bits to pad the buffer to 2 bytes. } nextOffset += flagBitOffset / 8; chanDataflags = new SR1_PrimativeArray <byte>(nextOffset); chanDataflags.Read(reader, this, "chanDataFlags"); if (sectionData.numSections > 0) { channels[0].ReadChanDataBuf(reader, this, keyCount.Value, 0, sectionData.sectionA, sectionData.numSegments, segKeyList); } if (sectionData.numSections > 1) { channels[1].ReadChanDataBuf(reader, this, keyCount.Value, sectionData.sectionA + 1, sectionData.sectionB, sectionData.numSegments, segKeyList); } if (sectionData.numSections > 2) { channels[2].ReadChanDataBuf(reader, this, keyCount.Value, sectionData.sectionB + 1, sectionData.sectionC, sectionData.numSegments, segKeyList); } if (padOverrideLength >= 0) { pad = new SR1_PrimativeArray <byte>(padOverrideLength); } else { mod = (uint)(reader.BaseStream.Position) % 4; if (mod > 0) { uint padding = 4 - mod; pad = new SR1_PrimativeArray <byte>((int)padding); } } pad.Read(reader, this, "pad"); //G2EmulationSetStartAndEndSegment(&Raziel.State, 0, 0, 0xd); //G2EmulationSetStartAndEndSegment(&Raziel.State, 1, 0xe, 0x31); //G2EmulationSetStartAndEndSegment(&Raziel.State, 2, 0x32, 0x41); } }
static int FooBar(SR1_Reader reader, long segKeyList, int chanData, int keyCount, int firstSeg, int lastSeg, int totalSegments) { long oldPos = reader.BaseStream.Position; reader.BaseStream.Position = segKeyList; int oldChanData = chanData; int flagBitOffset = (firstSeg * 3) + 8; int segIndex = ((totalSegments * 3) + 7) & unchecked ((int)0xfffffff8); G2AnimSegKeyflagInfo_Type[] kfInfos = new G2AnimSegKeyflagInfo_Type[3]; byte wombatFlags = reader.ReadByte(); reader.BaseStream.Position = segKeyList; if ((wombatFlags & 0x01) != 0) { Wombat(reader, segKeyList, flagBitOffset, ref kfInfos[0]); flagBitOffset += segIndex; } if ((wombatFlags & 0x02) != 0) { Wombat(reader, segKeyList, flagBitOffset, ref kfInfos[1]); flagBitOffset += segIndex; } if ((wombatFlags & 0x04) != 0) { Wombat(reader, segKeyList, flagBitOffset, ref kfInfos[2]); flagBitOffset += segIndex; } flagBitOffset = 0; for (int i = firstSeg; i <= lastSeg; i++) { uint kangaroo0 = Kangaroo(reader, ref kfInfos[0]); uint kangaroo1 = Kangaroo(reader, ref kfInfos[1]); uint kangaroo2 = Kangaroo(reader, ref kfInfos[2]); uint kangarooAll = kangaroo0 | (kangaroo1 << 4) | (kangaroo2 << 8); while (kangarooAll != 0) { int currentChanData = chanData; if ((kangaroo0 & 1) != 0) { reader.BaseStream.Position = chanData + 1; byte channelType = reader.ReadByte(); reader.BaseStream.Position--; channelType &= 0xE0; if (channelType == 0xE0) { channelType = 0; } if (channelType == 0) { currentChanData = chanData + (keyCount * 2); } else { currentChanData = chanData + 4; // Short pointer, so add double. (Quadruple, based on no$psx???) if (channelType != 0x20) { if (flagBitOffset == 0) { flagBitOffset = 8; } if (channelType == 0x40) { // _G2Anim_InitializeChannel_AdaptiveDelta chanData += (((keyCount + 3) >> 2) + 2) * 2; // Short pointer, so add double. } else if (channelType == 0x60) { // _G2Anim_InitializeChannel_Linear long oldPos0 = reader.BaseStream.Position; reader.BaseStream.Position = chanData; short sVar4 = reader.ReadInt16(); chanData += ((sVar4 & 0xfff) + 1) * 2; // Short pointer, so add double. reader.BaseStream.Position = oldPos0; } flagBitOffset--; currentChanData = chanData; } } } chanData = currentChanData; kangarooAll >>= 1; kangaroo0 = kangarooAll; } } reader.BaseStream.Position = oldPos; return(chanData - oldChanData); }