private void setCareerTiers(QbItemStruct careerSongsSec, int existingTierCount, int newTierCount, bool setUnlockIfOneTier) { //if setUnlockIfOneTier is false and we only have only 1 tier then don't unlock the new tiers, if tier 2 exists the lock is clones from that int add = newTierCount - existingTierCount; int clone; QbKey qkTier; QbKey qkNewTier; QbKey qkLastTier = QbKey.Create(string.Format("tier{0}", newTierCount.ToString())); for (int t = existingTierCount + 1; t <= newTierCount; t++) { int origTiersCount = Math.Min(existingTierCount, (_project.GameInfo.Game == Game.GH3_Wii) ? 8 : 6); //6 for aerosmith clone = t % origTiersCount; if (clone == 0) clone = origTiersCount; qkTier = QbKey.Create(string.Format("tier{0}", clone.ToString())); qkNewTier = QbKey.Create(string.Format("tier{0}", t.ToString())); QbItemStruct clonedTier = careerSongsSec.FindItem(qkTier, false).Clone() as QbItemStruct; clonedTier.ItemQbKey = qkNewTier.Clone(); if (clone == 1) //if tier 1 is being cloned then check is tier 1 has the unlocked value and make this the same { QbItemStruct tier2 = careerSongsSec.FindItem(QbKey.Create("tier2"), false) as QbItemStruct; if (tier2 != null) { tier2 = tier2.Clone() as QbItemStruct; QbItemInteger ul = tier2.FindItem(QbKey.Create("defaultunlocked"), false) as QbItemInteger; if (ul == null) //remove the cloned item { if ((ul = clonedTier.FindItem(QbKey.Create("defaultunlocked"), false) as QbItemInteger) != null) clonedTier.RemoveItem(ul); } } else if (!setUnlockIfOneTier) { //clear lock QbItemInteger ul = clonedTier.FindItem(QbKey.Create("defaultunlocked"), false) as QbItemInteger; if (ul != null) clonedTier.RemoveItem(ul); } } careerSongsSec.AddItem(clonedTier); } while (careerSongsSec.Items.Count > 3 && careerSongsSec.Items[careerSongsSec.Items.Count - 1].ItemQbKey.Crc != qkLastTier.Crc) careerSongsSec.RemoveItem(careerSongsSec.Items[careerSongsSec.Items.Count - 1]); //remove last item careerSongsSec.Root.AlignPointers(); careerSongsSec.Root.IsValid(); }
/// <summary> /// Add song to bonus list and shop /// </summary> /// <param name="songQk"></param> public void AddBonusSongQbItems(QbKey songQk, QbFile qbStore, bool insertAdd) { QbKey qkCreditsSong = _project.GameInfo.Game == Game.GH3_Wii ? QbKey.Create("thrufireandflames") : QbKey.Create("kingsandqueenscredits"); //find bonus song list QbItemArray bonusSongs = qbStore.FindItem(QbKey.Create("songs"), true) as QbItemArray; //find bonus song price list QbItemStruct songData = qbStore.FindItem(QbKey.Create("store_song_data"), true) as QbItemStruct; //find bonus song info QbItemArray bonusInfo = qbStore.FindItem(QbKey.Create("Bonus_Songs_Info"), true) as QbItemArray; //add bonus song to list if (bonusSongs != null) { List<QbKey> songs = new List<QbKey>((bonusSongs.Items[0] as QbItemQbKey).Values); if (!songs.Contains(songQk)) { if (insertAdd) songs.Insert(0, songQk.Clone()); else { //insert second from the end (before TTFAF / kingandqueenscredits) if (songs.Count == 0 || songs[songs.Count - 1].Crc != qkCreditsSong.Crc) songs.Add(songQk.Clone()); //clone qbkey else songs.Insert(songs.Count - 1, songQk.Clone()); //clone qbkey } (bonusSongs.Items[0] as QbItemQbKey).Values = songs.ToArray(); } } if (songData != null) { //add bonus song price if (null == songData.FindItem(false, delegate(QbItemBase qib) { return (qib.ItemQbKey.Crc == songQk.Crc); })) { QbItemStruct songDataItem = new QbItemStruct(qbStore); songDataItem.Create(QbItemType.StructItemStruct); songDataItem.ItemQbKey = songQk.Clone(); QbItemInteger songDataItemPrice = new QbItemInteger(qbStore); songDataItemPrice.Create(QbItemType.StructItemInteger); songDataItemPrice.ItemQbKey = QbKey.Create("price"); songDataItemPrice.Values = new uint[] { 0 }; songDataItem.AddItem(songDataItemPrice); if (!insertAdd || songData.Items.Count == 0) songData.AddItem(songDataItem); else songData.InsertItem(songDataItem, songData.Items[0], true); } } if (bonusInfo != null) { //add bonus info QbKey itemQk = QbKey.Create("item"); QbItemStructArray infoArray = (bonusInfo.Items[0] as QbItemStructArray); if (null == infoArray.FindItem(false, delegate(QbItemBase qib) { QbItemQbKey iqk = (QbItemQbKey)(qib.Items[0]); return iqk.ItemQbKey.Crc == itemQk.Crc && iqk.Values[0] == songQk.Crc; })) { QbItemStruct infoStruct = new QbItemStruct(qbStore); infoStruct.Create(QbItemType.StructHeader); if (!insertAdd || infoArray.Items.Count == 0) infoArray.AddItem(infoStruct); else infoArray.InsertItem(infoStruct, infoArray.Items[0], true); qbStore.AlignPointers(); qbStore.IsValid(); QbItemQbKey infoItem = new QbItemQbKey(qbStore); infoItem.Create(QbItemType.StructItemQbKey); infoItem.ItemQbKey = itemQk; //"item" infoItem.Values = new QbKey[] { songQk.Clone() }; infoStruct.AddItem(infoItem); qbStore.AlignPointers(); qbStore.IsValid(); QbItemString infoText = new QbItemString(qbStore); infoText.Create(QbItemType.StructItemString); infoText.ItemQbKey = QbKey.Create("text"); infoText.Strings = new string[] { "Bonus song added with TheGHOST" }; infoStruct.AddItem(infoText); qbStore.AlignPointers(); qbStore.IsValid(); QbItemQbKey infoCover = new QbItemQbKey(qbStore); infoCover.Create(QbItemType.StructItemQbKey); infoCover.ItemQbKey = QbKey.Create("album_cover"); infoCover.Values = new QbKey[] { QbKey.Create("store_song_default") }; infoStruct.AddItem(infoCover); qbStore.AlignPointers(); qbStore.IsValid(); } } }
/// <summary> /// All but this tier 1 have a dependency on the previous tier being completed /// </summary> /// <param name="tier"></param> private void addDependencyToTier1SongsComplete(QbItemStruct prog) { //insert dependency on previous tier. Obviously tier 0 does exist, it's just for replacement purposes QbItemBase qbs = prog.Items[prog.Items.Count - 1]; if (qbs is QbItemArray) { QbItemStructArray qsa = (QbItemStructArray)qbs.Items[0]; QbItemStruct qis = new QbItemStruct(prog.Root); qis.Create(QbItemType.StructHeader); QbItemQbKey qbQk = new QbItemQbKey(prog.Root); qbQk.Create(QbItemType.StructItemQbKey); qbQk.ItemQbKey = QbKey.Create("type"); qbQk.Values = new QbKey[] { QbKey.Create("atom") }; qis.AddItem(qbQk); qbQk = new QbItemQbKey(prog.Root); qbQk.Create(QbItemType.StructItemQbKey); qbQk.ItemQbKey = QbKey.Create("atom"); qbQk.Values = new QbKey[] { QbKey.Create("career_tier0_complete") }; qis.AddItem(qbQk); qsa.InsertItem(qis, qsa.Items[0], true); } }
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; }
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; }
private void calculateMarkers(int[] frets, QbItemArray arr, QbFile text) { int minNote = this.Notes.MinNoteOffsetSynced + _startPaddingMs + _fretPadding; int maxNote = this.Notes.MaxNoteOffsetSynced + _startPaddingMs + _fretPadding; int pos = minNote; int sectionSecs = 20000; int sections = (maxNote - minNote) / sectionSecs; //every x seconds for (int c = text.Items.Count - 1; c > 0; c--) text.RemoveItem(text.Items[c]); QbItemStructArray sa = new QbItemStructArray(arr.Root); sa.Create(QbItemType.ArrayStruct); arr.Items.Clear(); arr.AddItem(sa); QbItemStruct s; QbItemInteger i; QbItemQbKey q; string sectionTitle; QbKey qbKey; QbItemString txt; for (int c = 0; c < sections; c++) { if (pos + 3000 > this.Length) break; //don't create a section less than 3 seconds long sectionTitle = string.Format("Section {0}", (c + 1).ToString()); qbKey = QbKey.Create(string.Format("{0}_markers_text_{1}", this.SongQb.Id, QbKey.Create(sectionTitle).Crc.ToString("x").ToLower())); txt = new QbItemString(text); txt.Create(QbItemType.SectionString); txt.ItemQbKey = qbKey; txt.Strings = new string[] { sectionTitle }; text.AddItem(txt); s = new QbItemStruct(arr.Root); s.Create(QbItemType.StructHeader); sa.AddItem(s); i = new QbItemInteger(arr.Root); i.Create(QbItemType.StructItemInteger); i.ItemQbKey = QbKey.Create("time"); i.Values = new uint[] { findNearestFret((uint)pos, frets) }; s.AddItem(i); pos += sectionSecs; q = new QbItemQbKey(arr.Root); q.Create(QbItemType.StructItemQbKeyString); q.ItemQbKey = QbKey.Create("marker"); q.Values = new QbKey[] { qbKey }; s.AddItem(q); } text.AlignPointers(); arr.Root.AlignPointers(); }
private void setMarkers(int[] frets, QbItemArray arr, QbFile text, NotesMarker[] markers) { int minNote = this.Notes.MinNoteOffsetSynced + _startPaddingMs + _fretPadding; QbItemStruct s; QbItemInteger i; QbItemQbKey q; QbKey qbKey; QbItemString txt; for (int c = text.Items.Count - 1; c > 0; c--) text.RemoveItem(text.Items[c]); if (arr.Items[0] is QbItemFloats) { QbItemStructArray newArr = new QbItemStructArray(arr.Root); newArr.Create(QbItemType.ArrayStruct); arr.AddItem(newArr); arr.RemoveItem(arr.Items[0]); } QbItemStructArray sa = (QbItemStructArray)arr.Items[0]; sa.Items.Clear(); NotesMarker marker; List<NotesMarker> mrk = new List<NotesMarker>(markers); if (mrk.Count > 0 && mrk[0].Offset > minNote) //some charts don't have sections at the start so you can't practice the start notes :-( { if (mrk[0].Offset > minNote + 5000) // if > 5secs then add new mrk.Insert(0, new NotesMarker("Start", minNote)); else //else move first marker back to start mrk[0].Offset = minNote; } for (int c = 0; c < mrk.Count; c++) { marker = mrk[c]; if (c < mrk.Count - 1 && mrk[c + 1].Offset < minNote) continue; //don't add sections at the start that would have no notes (crashes song??) qbKey = QbKey.Create(string.Format("{0}_markers_text_{1}", this.SongQb.Id, QbKey.Create(marker.Title).Crc.ToString("x").ToLower())); txt = new QbItemString(text); txt.Create(QbItemType.SectionString); txt.ItemQbKey = qbKey; txt.Strings = new string[] { marker.Title }; text.AddItem(txt); s = new QbItemStruct(arr.Root); s.Create(QbItemType.StructHeader); sa.AddItem(s); i = new QbItemInteger(arr.Root); i.Create(QbItemType.StructItemInteger); i.ItemQbKey = QbKey.Create("time"); i.Values = new uint[] { findNearestFret((uint)marker.Offset, frets) }; s.AddItem(i); q = new QbItemQbKey(arr.Root); q.Create(QbItemType.StructItemQbKeyString); q.ItemQbKey = QbKey.Create("marker"); q.Values = new QbKey[] { qbKey }; s.AddItem(q); } text.AlignPointers(); arr.Root.AlignPointers(); }