private void parse(Stream stream) { _streamStartPosition = stream.Position; _items = new List<QbItemBase>(); //if (stream.Position != 0) // throw new ApplicationException("The stream must start at position 0 as this parser uses the position to validate pointers."); using (BinaryEndianReader br = new BinaryEndianReader(stream)) { _magic = br.ReadUInt32(this.PakFormat.EndianType); _fileSize = br.ReadUInt32(this.PakFormat.EndianType); uint sectionValue; QbItemBase qib = new QbItemUnknown(20, this); qib.Construct(br, QbItemType.Unknown); AddItem(qib); while (this.StreamPos(br.BaseStream) < _fileSize) { sectionValue = br.ReadUInt32(this.PakFormat.EndianType); QbItemType sectionType = this.PakFormat.GetQbItemType(sectionValue); switch (sectionType) { case QbItemType.SectionString: case QbItemType.SectionStringW: qib = new QbItemString(this); break; case QbItemType.SectionArray: qib = new QbItemArray(this); break; case QbItemType.SectionStruct: qib = new QbItemStruct(this); break; case QbItemType.SectionScript: qib = new QbItemScript(this); break; case QbItemType.SectionFloat: qib = new QbItemFloat(this); break; case QbItemType.SectionFloatsX2: case QbItemType.SectionFloatsX3: qib = new QbItemFloatsArray(this); break; case QbItemType.SectionInteger: case QbItemType.SectionStringPointer: qib = new QbItemInteger(this); break; case QbItemType.SectionQbKey: case QbItemType.SectionQbKeyString: case QbItemType.SectionQbKeyStringQs: //GH:GH qib = new QbItemQbKey(this); break; default: throw new ApplicationException(string.Format("Location 0x{0}: Unknown section type 0x{1}", (this.StreamPos(br.BaseStream) - 4).ToString("X").PadLeft(8, '0'), sectionValue.ToString("X").PadLeft(8, '0'))); } qib.Construct(br, sectionType); AddItem(qib); } } uint f = this.FileId; //gettin this sets the file id }
public override void Construct(BinaryEndianReader br, QbItemType type) { //System.Diagnostics.Debug.WriteLine(string.Format("{0} - 0x{1}", type.ToString(), (base.StreamPos(br) - 4).ToString("X").PadLeft(8, '0'))); base.Construct(br, type); uint pointer; if (type != QbItemType.StructHeader) _headerValue = br.ReadUInt32(base.Root.PakFormat.EndianType); else _headerValue = base.Root.PakFormat.GetQbItemValue(type, this.Root); _headerType = base.Root.PakFormat.GetQbItemType(_headerValue); QbItemBase qib = null; QbItemType structType; uint structValue; if (_headerType == QbItemType.StructHeader) { pointer = br.ReadUInt32(base.Root.PakFormat.EndianType); //Should be the current stream position after reading _iniNextItemPointer = pointer; if (pointer != 0 && base.StreamPos(br) != pointer) //pointer test throw new ApplicationException(QbFile.FormatBadPointerExceptionMessage(this, base.StreamPos(br), pointer)); while (pointer != 0) { structValue = br.ReadUInt32(this.Root.PakFormat.EndianType); structType = this.Root.PakFormat.GetQbItemType(structValue); switch (structType) { case QbItemType.StructItemStruct: this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.StructItems; qib = new QbItemStruct(this.Root); break; case QbItemType.StructItemStringPointer: case QbItemType.StructItemInteger: this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.StructItems; qib = new QbItemInteger(this.Root); break; case QbItemType.StructItemQbKeyString: case QbItemType.StructItemQbKeyStringQs: case QbItemType.StructItemQbKey: this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.StructItems; qib = new QbItemQbKey(this.Root); break; case QbItemType.StructItemString: case QbItemType.StructItemStringW: this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.StructItems; qib = new QbItemString(this.Root); break; case QbItemType.StructItemFloat: this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.StructItems; qib = new QbItemFloat(this.Root); break; case QbItemType.StructItemFloatsX2: case QbItemType.StructItemFloatsX3: this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.StructItems; qib = new QbItemFloatsArray(this.Root); break; case QbItemType.StructItemArray: this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.StructItems; qib = new QbItemArray(this.Root); break; //Convert array types to structitems to fit in with this parser (if QbFile.HasStructItems is false then internal type will be swapped back to array) case QbItemType.ArrayStruct: structType = QbItemType.StructItemStruct; qib = new QbItemArray(this.Root); break; case QbItemType.ArrayInteger: structType = QbItemType.StructItemInteger; qib = new QbItemInteger(this.Root); break; case QbItemType.ArrayQbKeyString: structType = QbItemType.StructItemQbKeyString; qib = new QbItemQbKey(this.Root); break; case QbItemType.ArrayStringPointer: structType = QbItemType.StructItemStringPointer; qib = new QbItemInteger(this.Root); break; case QbItemType.ArrayQbKeyStringQs: structType = QbItemType.StructItemQbKeyStringQs; qib = new QbItemQbKey(this.Root); break; case QbItemType.ArrayQbKey: structType = QbItemType.StructItemQbKey; qib = new QbItemQbKey(this.Root); break; case QbItemType.ArrayString: structType = QbItemType.StructItemString; qib = new QbItemString(this.Root); break; case QbItemType.ArrayStringW: structType = QbItemType.StructItemStringW; qib = new QbItemString(this.Root); break; case QbItemType.ArrayFloat: structType = QbItemType.StructItemFloat; qib = new QbItemFloat(this.Root); break; case QbItemType.ArrayFloatsX2: structType = QbItemType.StructItemFloatsX2; qib = new QbItemFloatsArray(this.Root); break; case QbItemType.ArrayFloatsX3: structType = QbItemType.StructItemFloatsX3; qib = new QbItemFloatsArray(this.Root); break; case QbItemType.ArrayArray: structType = QbItemType.StructItemArray; qib = new QbItemArray(this.Root); break; default: qib = null; break; } if (qib != null) { if (this.Root.PakFormat.StructItemChildrenType == StructItemChildrenType.NotSet) //will have been set to structItem if qib is not null) this.Root.PakFormat.StructItemChildrenType = StructItemChildrenType.ArrayItems; qib.Construct(br, structType); AddItem(qib); pointer = qib.NextItemPointer; } else throw new ApplicationException(string.Format("Location 0x{0}: Unknown item type 0x{1} in struct ", (base.StreamPos(br) - 4).ToString("X").PadLeft(8, '0'), structValue.ToString("X").PadLeft(8, '0'))); } } else throw new ApplicationException(string.Format("Location 0x{0}: Struct without header type", (base.StreamPos(br) - 4).ToString("X").PadLeft(8, '0'))); base.ConstructEnd(br); }
public static AudioFormat GetAudioFormat(FormatData data) { SongData song = data.Song; AudioFormat audioformat = new AudioFormat(); QbItemStruct item = GetSongItem(data); if (item == null) { return(null); } float bandvolume = 0; float guitarvolume = 0; float bassvolume = 0; float drumvolume = 0; QbItemFloat subitem = item.FindItem(QbKey.Create(0xD8F335CF), false) as QbItemFloat; // GH3: band_playback_volume if (subitem != null) { bandvolume = (subitem as QbItemFloat).Values[0]; bassvolume = bandvolume; } subitem = item.FindItem(QbKey.Create(0xA449CAD3), false) as QbItemFloat; // GH3: guitar_playback_volume if (subitem != null) { guitarvolume = (subitem as QbItemFloat).Values[0]; } subitem = item.FindItem(QbKey.Create(0x46507438), false) as QbItemFloat; // GH4: overall_song_volume if (subitem != null) { bandvolume = (subitem as QbItemFloat).Values[0]; guitarvolume = bandvolume; bassvolume = bandvolume; drumvolume = bandvolume; } // GH4 engine games that came out after GHWT use a different drum audio scheme; the GH5 engine uses the same as GHWT bool gh4v2 = NeversoftMetadata.IsGuitarHero4(song.Game) && song.Game != Game.GuitarHeroWorldTour; // GHVH is the only BIK-based GH game with stereo bass bool ghvh = song.Game == Game.GuitarHeroVanHalen; if (gh4v2) { // Kick audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, -1, Instrument.Drums)); audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, 1, Instrument.Drums)); // Snare audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, -1, Instrument.Drums)); audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, 1, Instrument.Drums)); } else { // Kick audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, 0, Instrument.Drums)); // Snare audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, 0, Instrument.Drums)); } // Overhead audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, -1, Instrument.Drums)); audioformat.Mappings.Add(new AudioFormat.Mapping(drumvolume, 1, Instrument.Drums)); // Guitar audioformat.Mappings.Add(new AudioFormat.Mapping(guitarvolume, -1, Instrument.Guitar)); audioformat.Mappings.Add(new AudioFormat.Mapping(guitarvolume, 1, Instrument.Guitar)); // Bass audioformat.Mappings.Add(new AudioFormat.Mapping(bassvolume, ghvh ? -1 : 0, Instrument.Bass)); if (ghvh) { audioformat.Mappings.Add(new AudioFormat.Mapping(bassvolume, 1, Instrument.Bass)); } // Else / Vocals audioformat.Mappings.Add(new AudioFormat.Mapping(bandvolume, -1, Instrument.Ambient)); audioformat.Mappings.Add(new AudioFormat.Mapping(bandvolume, 1, Instrument.Ambient)); // Preview audioformat.Mappings.Add(new AudioFormat.Mapping(bandvolume, -1, Instrument.Preview)); audioformat.Mappings.Add(new AudioFormat.Mapping(bandvolume, 1, Instrument.Preview)); return(audioformat); }
private static QbItemBase createQbItemType(QbFile qbFile, QbItemType type, QbFormat qbFormat, bool hasQbFormat) { QbItemBase qib = null; if (qbFile.PakFormat.GetQbItemValue(type, qbFile) == 0xFFFFFFFF) throw new ApplicationException(string.Format("'{0}' data value not known for {1}", type.ToString(), qbFile.PakFormat.FriendlyName)); switch (type) { //case QbItemType.Unknown: // break; case QbItemType.SectionString: case QbItemType.SectionStringW: case QbItemType.ArrayString: case QbItemType.ArrayStringW: case QbItemType.StructItemString: case QbItemType.StructItemStringW: qib = new QbItemString(qbFile); break; case QbItemType.SectionArray: case QbItemType.ArrayArray: case QbItemType.StructItemArray: qib = new QbItemArray(qbFile); break; case QbItemType.SectionStruct: case QbItemType.StructItemStruct: case QbItemType.StructHeader: qib = new QbItemStruct(qbFile); break; case QbItemType.SectionScript: qib = new QbItemScript(qbFile); break; case QbItemType.SectionFloat: case QbItemType.ArrayFloat: case QbItemType.StructItemFloat: qib = new QbItemFloat(qbFile); break; case QbItemType.SectionFloatsX2: case QbItemType.SectionFloatsX3: case QbItemType.ArrayFloatsX2: case QbItemType.ArrayFloatsX3: case QbItemType.StructItemFloatsX2: case QbItemType.StructItemFloatsX3: qib = new QbItemFloatsArray(qbFile); break; case QbItemType.SectionInteger: case QbItemType.SectionStringPointer: case QbItemType.ArrayInteger: case QbItemType.ArrayStringPointer: //GH:GH case QbItemType.StructItemStringPointer: case QbItemType.StructItemInteger: qib = new QbItemInteger(qbFile); break; case QbItemType.SectionQbKey: case QbItemType.SectionQbKeyString: case QbItemType.SectionQbKeyStringQs: //GH:GH case QbItemType.ArrayQbKey: case QbItemType.ArrayQbKeyString: case QbItemType.ArrayQbKeyStringQs: //GH:GH case QbItemType.StructItemQbKey: case QbItemType.StructItemQbKeyString: case QbItemType.StructItemQbKeyStringQs: qib = new QbItemQbKey(qbFile); break; case QbItemType.Floats: qib = new QbItemFloats(qbFile); break; case QbItemType.ArrayStruct: qib = new QbItemStructArray(qbFile); break; default: throw new ApplicationException(string.Format("'{0}' is not recognised by CreateQbItemType.", type.ToString())); } if (qib != null) qib.Create(type); return qib; }
public static SongData GetSongData(PlatformData platformdata, QbItemStruct item, StringList strings) { if (strings == null) { strings = new StringList(); } SongData data = new SongData(platformdata); data.ID = GetSongDataString(item, QbKeysID, strings); data.Name = GetSongDataString(item, QbKeysName, strings); data.Artist = GetSongDataString(item, QbKeysArtist, strings); data.Album = GetSongDataString(item, QbKeysAlbum, strings); if (strings.FindItem(QbKey.Create(QbKeysGenres[0].Key[0])) == null) { strings.Items.AddRange(QbKeysGenres.Select(g => new KeyValuePair <QbKey, string>(QbKey.Create(g.Key[0]), g.Value))); // TODO: Expand the Key array } data.Genre = GetSongDataString(item, QbKeysGenre, strings); QbItemInteger year = GetQbItem(item, QbKeysYear) as QbItemInteger; if (year != null) { data.Year = (int)year.Values[0]; } else { int yearnum; if (int.TryParse(GetSongDataString(item, QbKeysYear, strings).TrimStart(',', ' '), out yearnum)) // ", 2009" { data.Year = yearnum; } } QbItemInteger master = GetQbItem(item, QbKeysMaster) as QbItemInteger; if (master != null) { data.Master = master.Values[0] == 1; } QbItemInteger rank = GetQbItem(item, QbKeysDifficulty[Instrument.Ambient]) as QbItemInteger; if (rank != null) { data.Difficulty[Instrument.Ambient] = (int)rank.Values[0] * 60; } rank = GetQbItem(item, QbKeysDifficulty[Instrument.Drums]) as QbItemInteger; if (rank != null) { data.Difficulty[Instrument.Drums] = (int)rank.Values[0] * 50; } rank = GetQbItem(item, QbKeysDifficulty[Instrument.Vocals]) as QbItemInteger; if (rank != null) { data.Difficulty[Instrument.Vocals] = (int)rank.Values[0] * 45; } rank = GetQbItem(item, QbKeysDifficulty[Instrument.Bass]) as QbItemInteger; if (rank != null) { data.Difficulty[Instrument.Bass] = (int)rank.Values[0] * 55; } rank = GetQbItem(item, QbKeysDifficulty[Instrument.Guitar]) as QbItemInteger; if (rank != null) { data.Difficulty[Instrument.Guitar] = (int)rank.Values[0] * 60; } QbKey vocalmale = QbKey.Create(0xAA721F56); QbKey vocalfemale = QbKey.Create("female"); if (strings.FindItem(vocalmale) == null) { strings.Items.Add(new KeyValuePair <QbKey, string>(vocalmale, "male")); } if (strings.FindItem(vocalfemale) == null) { strings.Items.Add(new KeyValuePair <QbKey, string>(vocalfemale, "female")); } data.Vocalist = GetSongDataString(item, QbKeysVocalist, strings); if (!data.Vocalist.HasValue()) { data.Vocalist = "male"; } QbItemFloat hopo = GetQbItem(item, QbKeysHopo) as QbItemFloat; if (hopo != null) { data.HopoThreshold = (int)((float)NoteChart.DefaultTicksPerBeat / hopo.Values[0]); } // TODO: Better handling of QB items; this uses up a shitload of memory MemoryStream itemstream = new MemoryStream(); item.Root.Write(itemstream); data.Data.SetValue("NeversoftSongItem", itemstream.GetBuffer()); data.Data.SetValue("NeversoftSongType", (int)item.Root.PakFormat.PakFormatType); data.Data.SetValue("NeversoftSongItemKey", item.ItemQbKey.Crc); return(data); }
internal SongQb(Project project, QbItemStruct song) { _song = song; QbItemBase temp; _hopoMeasure = null; _checksum = (QbItemQbKey)song.FindItem(QbKey.Create("checksum"), false); //_key = song.ItemQbKey; _key = QbKey.Create(((QbItemString)song.FindItem(QbKey.Create("name"), false)).Strings[0]); _title = (QbItemString)song.FindItem(QbKey.Create("title"), false); _artist = (QbItemString)song.FindItem(QbKey.Create("artist"), false); _leaderboard = (QbItemInteger)song.FindItem(QbKey.Create("leaderboard"), false); _year = (QbItemString)song.FindItem(QbKey.Create("year"), false); _boss = song.FindItem(QbKey.Create("boss"), false) as QbItemQbKey; //is this a boss temp = song.FindItem(QbKey.Create("band_playback_volume"), false); //sometimes integer instead of float if (temp == null) { _songVolume = new QbItemFloat(song.Root); _songVolume.Create(QbItemType.StructItemFloat); _songVolume.ItemQbKey = QbKey.Create("band_playback_volume"); _songVolume.Values = new float[1]; _songVolume.Values[0] = 0; song.AddItem(_songVolume); song.Root.AlignPointers(); } else if (temp is QbItemInteger) _songVolume = replaceItemIntForFloat(song, (QbItemInteger)temp); else _songVolume = (QbItemFloat)temp; temp = song.FindItem(QbKey.Create("guitar_playback_volume"), false); //sometimes integer instead of float if (temp == null) { _guitarVolume = new QbItemFloat(song.Root); _guitarVolume.Create(QbItemType.StructItemFloat); _guitarVolume.ItemQbKey = QbKey.Create("guitar_playback_volume"); _guitarVolume.Values = new float[1]; _guitarVolume.Values[0] = 0; song.AddItem(_guitarVolume); song.Root.AlignPointers(); } else if (temp is QbItemInteger) _guitarVolume = replaceItemIntForFloat(song, (QbItemInteger)temp); else _guitarVolume = (QbItemFloat)temp; _rhythmTrack = (QbItemInteger)song.FindItem(QbKey.Create("rhythm_track"), false); temp = song.FindItem(QbKey.Create("artist_text"), false); if (temp is QbItemString) { _artistTextString = (QbItemString)temp; _artistText = null; } else { _artistText = song.FindItem(QbKey.Create("artist_text"), false) as QbItemQbKey; _artistTextString = null; } _originalArtist = (QbItemInteger)song.FindItem(QbKey.Create("original_artist"), false); temp = song.FindItem(QbKey.Create("singer"), false); if (temp == null) //GH3 wii Cream sunshine for your love has no singer item { _singer = new QbItemQbKey(song.Root); _singer.Create(QbItemType.StructItemQbKey); _singer.ItemQbKey = QbKey.Create("singer"); _singer.Values = new QbKey[1]; _singer.Values[0] = QbKey.Create("male"); song.AddItem(_singer); song.Root.AlignPointers(); } else _singer = (QbItemQbKey)temp; _fretbarOffset = song.FindItem(QbKey.Create("fretbar_offset"), false) as QbItemInteger; _gemOffset = song.FindItem(QbKey.Create("gem_offset"), false) as QbItemInteger; _inputOffset = song.FindItem(QbKey.Create("input_offset"), false) as QbItemInteger; //this fixes an issue with GH3(cult of personality) and GHA (talk talking) if (this.key.Crc != this.checksum.Crc) _id = (project.GameInfo.Game == Game.GH3_Wii) ? this.checksum : this.key; else _id = this.checksum.HasText ? this.checksum : this.key; }
/// <summary> /// Some items are not the correct type, replace them. /// </summary> /// <param name="song"></param> /// <param name="item"></param> /// <returns></returns> private QbItemFloat replaceItemIntForFloat(QbItemStruct song, QbItemInteger item) { QbItemFloat f = new QbItemFloat(song.Root); f.Create(QbItemType.StructItemFloat); f.ItemQbKey = item.ItemQbKey; f.Values[0] = item.Values[0]; song.InsertItem(f, item, true); song.RemoveItem(item); song.Root.AlignPointers(); return f; }
public static QbItemStruct CreateSong(QbFile root, string songname) { QbItemStruct song = new QbItemStruct(root); song.Create(QbItemType.StructItemStruct); song.ItemQbKey = QbKey.Create(songname); QbItemQbKey checksum = new QbItemQbKey(root); checksum.Create(QbItemType.StructItemQbKey); checksum.ItemQbKey = QbKey.Create("checksum"); checksum.Values = new QbKey[] { QbKey.Create(songname) }; song.AddItem(checksum); QbItemString name = new QbItemString(root); name.Create(QbItemType.StructItemString); name.ItemQbKey = QbKey.Create("name"); name.Strings = new string[] { songname }; song.AddItem(name); QbItemString title = new QbItemString(root); title.Create(QbItemType.StructItemString); title.ItemQbKey = QbKey.Create("title"); title.Strings = new string[] { songname }; song.AddItem(title); QbItemString artist = new QbItemString(root); artist.Create(QbItemType.StructItemString); artist.ItemQbKey = QbKey.Create("artist"); artist.Strings = new string[] { songname }; song.AddItem(artist); QbItemString year = new QbItemString(root); year.Create(QbItemType.StructItemString); year.ItemQbKey = QbKey.Create("year"); year.Strings = new string[] { string.Empty }; song.AddItem(year); QbItemQbKey artistText = new QbItemQbKey(root); artistText.Create(QbItemType.StructItemQbKeyString); artistText.ItemQbKey = QbKey.Create("artist_text"); artistText.Values = new QbKey[] { QbKey.Create("artist_text_by") }; song.AddItem(artistText); QbItemInteger originalArtist = new QbItemInteger(root); originalArtist.Create(QbItemType.StructItemInteger); originalArtist.ItemQbKey = QbKey.Create("original_artist"); originalArtist.Values = new uint[] { 1 }; song.AddItem(originalArtist); QbItemQbKey version = new QbItemQbKey(root); version.Create(QbItemType.StructItemQbKey); version.ItemQbKey = QbKey.Create("version"); version.Values = new QbKey[] { QbKey.Create("gh3") }; song.AddItem(version); QbItemInteger leaderboard = new QbItemInteger(root); leaderboard.Create(QbItemType.StructItemInteger); leaderboard.ItemQbKey = QbKey.Create("leaderboard"); leaderboard.Values = new uint[] { 1 }; song.AddItem(leaderboard); QbItemInteger gemOffset = new QbItemInteger(root); gemOffset.Create(QbItemType.StructItemInteger); gemOffset.ItemQbKey = QbKey.Create("gem_offset"); gemOffset.Values = new uint[] { 0 }; song.AddItem(gemOffset); QbItemInteger inputOffset = new QbItemInteger(root); inputOffset.Create(QbItemType.StructItemInteger); inputOffset.ItemQbKey = QbKey.Create("input_offset"); inputOffset.Values = new uint[] { 0 }; song.AddItem(inputOffset); QbItemQbKey singer = new QbItemQbKey(root); singer.Create(QbItemType.StructItemQbKey); singer.ItemQbKey = QbKey.Create("singer"); singer.Values = new QbKey[] { QbKey.Create("male") }; song.AddItem(singer); QbItemQbKey keyboard = new QbItemQbKey(root); keyboard.Create(QbItemType.StructItemQbKey); keyboard.ItemQbKey = QbKey.Create("keyboard"); keyboard.Values = new QbKey[] { QbKey.Create("false") }; song.AddItem(keyboard); QbItemFloat bandPlaybackVolume = new QbItemFloat(root); bandPlaybackVolume.Create(QbItemType.StructItemFloat); bandPlaybackVolume.ItemQbKey = QbKey.Create("band_playback_volume"); bandPlaybackVolume.Values = new float[] { 0F }; song.AddItem(bandPlaybackVolume); QbItemFloat guitarPlaybackVolume = new QbItemFloat(root); guitarPlaybackVolume.Create(QbItemType.StructItemFloat); guitarPlaybackVolume.ItemQbKey = QbKey.Create("guitar_playback_volume"); guitarPlaybackVolume.Values = new float[] { 0F }; song.AddItem(guitarPlaybackVolume); QbItemString countOff = new QbItemString(root); countOff.Create(QbItemType.StructItemString); countOff.ItemQbKey = QbKey.Create("countoff"); countOff.Strings = new string[] { "sticks_normal" }; song.AddItem(countOff); QbItemInteger rhythmTrack = new QbItemInteger(root); rhythmTrack.Create(QbItemType.StructItemInteger); rhythmTrack.ItemQbKey = QbKey.Create("rhythm_track"); rhythmTrack.Values = new uint[] { 0 }; song.AddItem(rhythmTrack); return song; }
public override void Construct(BinaryEndianReader br, QbItemType type) { //System.Diagnostics.Debug.WriteLine(string.Format("{0} - 0x{1}", type.ToString(), (base.StreamPos(br) - 4).ToString("X").PadLeft(8, '0'))); base.Construct(br, type); QbItemBase qib = null; QbItemType arrayType; uint arrayValue; for (int i = 0; i < base.ItemCount; i++) { arrayValue = br.ReadUInt32(this.Root.PakFormat.EndianType); arrayType = this.Root.PakFormat.GetQbItemType(arrayValue); switch (arrayType) { case QbItemType.Floats: qib = new QbItemFloats(this.Root); break; case QbItemType.ArrayStruct: qib = new QbItemStructArray(this.Root); break; case QbItemType.ArrayFloat: qib = new QbItemFloat(this.Root); break; case QbItemType.ArrayString: case QbItemType.ArrayStringW: qib = new QbItemString(this.Root); break; case QbItemType.ArrayFloatsX2: case QbItemType.ArrayFloatsX3: qib = new QbItemFloatsArray(this.Root); break; case QbItemType.ArrayStringPointer: case QbItemType.ArrayInteger: qib = new QbItemInteger(this.Root); break; case QbItemType.ArrayArray: qib = new QbItemArray(this.Root); break; case QbItemType.ArrayQbKey: case QbItemType.ArrayQbKeyString: case QbItemType.ArrayQbKeyStringQs: //GH:GH qib = new QbItemQbKey(this.Root); break; case QbItemType.StructHeader: qib = new QbItemStruct(this.Root); break; default: throw new ApplicationException(string.Format("Location 0x{0}: Unknown array type 0x{1}", (base.StreamPos(br) - 4).ToString("X").PadLeft(8, '0'), arrayValue.ToString("X").PadLeft(8, '0'))); } qib.Construct(br, arrayType); AddItem(qib); } base.ConstructEnd(br); }