diff --git a/MHFZ_Overlay/Models/Collections/QuestsGamePatches.cs b/MHFZ_Overlay/Models/Collections/QuestsGamePatches.cs new file mode 100644 index 00000000..8dd142c0 --- /dev/null +++ b/MHFZ_Overlay/Models/Collections/QuestsGamePatches.cs @@ -0,0 +1,126 @@ +// © 2023 The mhfz-overlay developers. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +namespace MHFZ_Overlay.Models.Collections; + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using MHFZ_Overlay.Models.Structures; + +/// +/// The patches list. +/// +public static class QuestsGamePatches +{ + public static ReadOnlyDictionary> datHashInfo { get; } = new (new Dictionary> + { + { "593C418FA1408B76F655F0BB8D7DF8AA307CD89613A7734EB057A175825A4DA5", new Dictionary() + { + { GamePatch.Vanilla, GamePatchLanguage.JA } + } + }, + { "3E6FD419AD668AA973454B9AE9F1C49C739A0CA41FCE15CBF1DB1D2068E8C29D", new Dictionary() + { + { GamePatch.Seph, GamePatchLanguage.EN } + } + }, + { "F65080754B99BED5BE91BF1B4B0EC8EE61D7DED06831E3E7824F62B63F60E624", new Dictionary() + { + { GamePatch.Ezemania, GamePatchLanguage.FR } + } + }, + { "E1B0C47FE8BFA222BE1284CC232DAB63459574F40F8DA90FAE7FF20638480F96", new Dictionary() + { + { GamePatch.Otyav1_1, GamePatchLanguage.JA } + } + }, + { "735EFD86140E835E8DA2670CEA15A19154AE37ED046CBBB5A8918C39FC88B9E8", new Dictionary() + { + { GamePatch.Otyav1_1, GamePatchLanguage.EN } + } + }, + { "2B328D91626DB1DC8DD3FB9520D1AE52CF0C6F412B595D5795298DDC550FD06D", new Dictionary() + { + { GamePatch.Otyav1_1, GamePatchLanguage.FR } + } + }, + { "EE39C4776A1CF1271D0728D450F723B035144503298DB4C771C0376BF43AD4B8", new Dictionary() + { + { GamePatch.Mezelounge, GamePatchLanguage.EN } + } + }, + }); + + public static ReadOnlyDictionary> emdHashInfo { get; } = new(new Dictionary> + { + { "E68E03F1274D9D055CC8E42B0427BB99B0CEBFE9C905F951900B991F4CC8AFD1", new Dictionary() + { + { GamePatch.Vanilla, GamePatchLanguage.JA } + } + }, + { "5B70CE51EC6F95337B615C76C8BE8A0C42B16B14ED698739ADC097C4C507503E", new Dictionary() + { + { GamePatch.Vanilla, GamePatchLanguage.JA } + } + }, + { "1755B8C5DA0D488901BF4FC7179E0B036AC6F9C936C7CA5911C693119173F8E5", new Dictionary() + { + { GamePatch.Vanilla, GamePatchLanguage.JA } + } + }, + { "A90B90E6A66F1983C1807DB1298EF2BF94BFD05681021307C8F4213BBE31B890", new Dictionary() + { + { GamePatch.FiveMusous, GamePatchLanguage.ZH } + } + }, + }); + + public static ReadOnlyDictionary> mhfodllHashInfo { get; } = new(new Dictionary> + { + { "69B65205B1F23A6989395CD811C414D410FE43D7ACD3C33A565E2C564AD184F4", new Dictionary() + { + { GamePatch.Standard, GamePatchLanguage.JA } + } + }, + { "A21322CA5864D6A4C8599FD4522FDBCC8997225C05D82D958D9AEBA2678ADFC7", new Dictionary() + { + { GamePatch.Standard, GamePatchLanguage.EN } + } + }, + { "23177AECAEB8222392461F5B6F714D810953329E4622E948F387B9B318D97589", new Dictionary() + { + { GamePatch.Mezelounge, GamePatchLanguage.EN } + } + }, + { "514DC802AABE3C7709EC1AABEB25B586839EE86E15CC9C569C87CC459E9206A0", new Dictionary() + { + { GamePatch.Tenrou, GamePatchLanguage.EN } + } + }, + }); + + public static ReadOnlyDictionary> mhfohddllHashInfo { get; } = new(new Dictionary> + { + { "95C580195F4080D2E9582C8C9DF36ABEB280476E088B6366583C5F138DA8F301", new Dictionary() + { + { GamePatch.Standard, GamePatchLanguage.JA } + } + }, + { "01F980A4B892CA0DBEBAD8EB54B224D080B32253BB8E793E23CD060089003D25", new Dictionary() + { + { GamePatch.Standard, GamePatchLanguage.EN } + } + }, + { "6FD7A31663D7AF23D9A8D903E4FFB84F45390D5AEE7BC6C70347D2F17988FA02", new Dictionary() + { + { GamePatch.Mezelounge, GamePatchLanguage.EN } + } + }, + { "5A65673537E97522E4767A32EAA8622312AC118AF3ED64F02D56751A27FE0B90", new Dictionary() + { + { GamePatch.Tenrou, GamePatchLanguage.EN } + } + }, + }); +} diff --git a/MHFZ_Overlay/Models/QuestsGamePatch.cs b/MHFZ_Overlay/Models/QuestsGamePatch.cs new file mode 100644 index 00000000..52f80815 --- /dev/null +++ b/MHFZ_Overlay/Models/QuestsGamePatch.cs @@ -0,0 +1,23 @@ +// © 2023 The mhfz-overlay developers. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +namespace MHFZ_Overlay.Models; + +using System; + +// TODO: ORM +public sealed class QuestsGamePatch +{ + public long? QuestsGamePatchID { get; set; } + + public long? RunID { get; set; } + + public string? mhfdatInfo { get; set; } + + public string? mhfemdInfo { get; set; } + + public string? mhfodllInfo { get; set; } + + public string? mhfohddllInfo { get; set; } +} diff --git a/MHFZ_Overlay/Models/Structures/Enums.cs b/MHFZ_Overlay/Models/Structures/Enums.cs index 2e2d7bff..fd7b0c2a 100644 --- a/MHFZ_Overlay/Models/Structures/Enums.cs +++ b/MHFZ_Overlay/Models/Structures/Enums.cs @@ -843,6 +843,9 @@ public enum DivaPrayerGemColor Blue, } +/// +/// Creator, origin or purpose. +/// public enum GamePatch { Vanilla, @@ -855,13 +858,23 @@ public enum GamePatch /// TODO /// Standard, + FiveMusous, } +/// +/// https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes. Could also describe the origin rather than language. +/// public enum GamePatchLanguage { - JP, + JA, EN, FR, + ZH, + ES, + PT, + RU, + EL, + DE, } public enum GamePatchFile diff --git a/MHFZ_Overlay/Services/DatabaseService.cs b/MHFZ_Overlay/Services/DatabaseService.cs index af02c9d9..ec76d698 100644 --- a/MHFZ_Overlay/Services/DatabaseService.cs +++ b/MHFZ_Overlay/Services/DatabaseService.cs @@ -8107,6 +8107,56 @@ public QuestsOverlayHash GetOverlayHash(long runID) return data; } + public QuestsGamePatch GetQuestsGamePatch(long runID) + { + QuestsGamePatch data = new(); + if (string.IsNullOrEmpty(this.dataSource)) + { + Logger.Warn(CultureInfo.InvariantCulture, "Cannot get game patch. dataSource: {0}", this.dataSource); + return data; + } + + // Use a SQL query to retrieve the Quest for the specific RunID from the database + using (var conn = new SQLiteConnection(this.dataSource)) + { + conn.Open(); + using (var transaction = conn.BeginTransaction()) + { + try + { + using (var cmd = new SQLiteCommand("SELECT * FROM QuestsGamePatch WHERE RunID = @runID", conn)) + { + cmd.Parameters.AddWithValue("@runID", runID); + + using (var reader = cmd.ExecuteReader()) + { + if (reader.Read()) + { + data = new QuestsGamePatch + { + QuestsGamePatchID = long.Parse(reader["QuestsGamePatchID"]?.ToString() ?? "0", CultureInfo.InvariantCulture), + mhfdatInfo = reader["mhfdatInfo"]?.ToString() ?? "Unknown", + mhfemdInfo = reader["mhfemdInfo"]?.ToString() ?? "Unknown", + mhfodllInfo = reader["mhfodllInfo"]?.ToString() ?? "Unknown", + mhfohddllInfo = reader["mhfohddllInfo"]?.ToString() ?? "Unknown", + RunID = long.Parse(reader["RunID"]?.ToString() ?? "0", CultureInfo.InvariantCulture), + }; + } + } + } + + transaction.Commit(); + } + catch (Exception ex) + { + HandleError(transaction, ex); + } + } + } + + return data; + } + private Quest GetLastQuest(SQLiteConnection conn) { Quest quest = new(); @@ -18045,7 +18095,7 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d { var questID = long.Parse(reader["QuestID"]?.ToString() ?? "0", CultureInfo.InvariantCulture); - if (questID != Numbers.QuestIDFirstDistrictDuremudira || questID != Numbers.QuestIDSecondDistrictDuremudira) + if (questID != Numbers.QuestIDFirstDistrictDuremudira && questID != Numbers.QuestIDSecondDistrictDuremudira && questID != Numbers.QuestIDArrogantDuremudira && questID != Numbers.QuestIDArrogantDuremudiraRepel) { continue; } @@ -18058,7 +18108,7 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d } string monster1AttackMultiplierString = reader["Monster1AttackMultiplierDictionary"].ToString() ?? "{}"; - string monster1DefenseRateString = reader["Monster1DefenseRateictionary"].ToString() ?? "{}"; + string monster1DefenseRateString = reader["Monster1DefenseRateDictionary"].ToString() ?? "{}"; string monster1SizeMultiplierString = reader["Monster1SizeMultiplierDictionary"].ToString() ?? "{}"; string monster1StunThresholdString = reader["Monster1StunThresholdDictionary"].ToString() ?? "{}"; string monster1PartThresholdString = reader["Monster1PartThresholdDictionary"].ToString() ?? "{}"; @@ -18066,9 +18116,9 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d var runID = long.Parse(reader["RunID"]?.ToString() ?? "0", CultureInfo.InvariantCulture); var monster1HPDictionary = JsonConvert.DeserializeObject>>(monster1HPString); - var monster1AttackMultiplierDictionary = JsonConvert.DeserializeObject>>(monster1AttackMultiplierString); - var monster1DefenseRateDictionary = JsonConvert.DeserializeObject>>(monster1DefenseRateString); - var monster1SizeMultiplierDictionary = JsonConvert.DeserializeObject>>(monster1SizeMultiplierString); + var monster1AttackMultiplierDictionary = JsonConvert.DeserializeObject>>(monster1AttackMultiplierString); + var monster1DefenseRateDictionary = JsonConvert.DeserializeObject>>(monster1DefenseRateString); + var monster1SizeMultiplierDictionary = JsonConvert.DeserializeObject>>(monster1SizeMultiplierString); var monster1StunThresholdDictionary = JsonConvert.DeserializeObject>>(monster1StunThresholdString); var monster1PartThresholdDictionary = JsonConvert.DeserializeObject>>>(monster1PartThresholdString); @@ -18078,9 +18128,9 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d } Dictionary> newMonster1HPDictionary = new(); - Dictionary> newMonster1AttackMultiplierDictionary = new(); - Dictionary> newMonster1DefenseRateDictionary = new(); - Dictionary> newMonster1SizeMultiplierDictionary = new(); + Dictionary> newMonster1AttackMultiplierDictionary = new(); + Dictionary> newMonster1DefenseRateDictionary = new(); + Dictionary> newMonster1SizeMultiplierDictionary = new(); Dictionary> newMonster1StunThresholdDictionary = new(); Dictionary>> newMonster1PartThresholdDictionary = new(); @@ -18135,7 +18185,7 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d } } - Dictionary monsterEntry = new Dictionary() + Dictionary monsterEntry = new Dictionary() { {monsterID, entry.Value.FirstOrDefault().Value}, }; @@ -18165,7 +18215,7 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d } } - Dictionary monsterEntry = new Dictionary() + Dictionary monsterEntry = new Dictionary() { {monsterID, entry.Value.FirstOrDefault().Value}, }; @@ -18195,7 +18245,7 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d } } - Dictionary monsterEntry = new Dictionary() + Dictionary monsterEntry = new Dictionary() { {monsterID, entry.Value.FirstOrDefault().Value}, }; @@ -18271,18 +18321,18 @@ private void UpdateQuestsMonsterDictionaries(SQLiteConnection conn, DataLoader d SET Monster1HPDictionary = @Monster1HPDictionary, Monster1AttackMultiplierDictionary = @Monster1AttackMultiplierDictionary, - Monster1DefenseRateictionary = @Monster1DefenseRateictionary, + Monster1DefenseRateDictionary = @Monster1DefenseRateDictionary, Monster1SizeMultiplierDictionary = @Monster1SizeMultiplierDictionary, Monster1StunThresholdDictionary = @Monster1StunThresholdDictionary, Monster1PartThresholdDictionary = @Monster1PartThresholdDictionary WHERE RunID = @RunID"; cmd2.Parameters.AddWithValue("@RunID", runID); - cmd2.Parameters.AddWithValue("@Monster1HPDictionary", newMonster1HPDictionary); - cmd2.Parameters.AddWithValue("@Monster1AttackMultiplierDictionary", newMonster1AttackMultiplierDictionary); - cmd2.Parameters.AddWithValue("@Monster1DefenseRateictionary", newMonster1DefenseRateDictionary); - cmd2.Parameters.AddWithValue("@Monster1SizeMultiplierDictionary", newMonster1SizeMultiplierDictionary); - cmd2.Parameters.AddWithValue("@Monster1StunThresholdDictionary", newMonster1StunThresholdDictionary); - cmd2.Parameters.AddWithValue("@Monster1PartThresholdDictionary", newMonster1PartThresholdDictionary); + cmd2.Parameters.AddWithValue("@Monster1HPDictionary", JsonConvert.SerializeObject(newMonster1HPDictionary)); + cmd2.Parameters.AddWithValue("@Monster1AttackMultiplierDictionary", JsonConvert.SerializeObject(newMonster1AttackMultiplierDictionary)); + cmd2.Parameters.AddWithValue("@Monster1DefenseRateDictionary", JsonConvert.SerializeObject(newMonster1DefenseRateDictionary)); + cmd2.Parameters.AddWithValue("@Monster1SizeMultiplierDictionary", JsonConvert.SerializeObject(newMonster1SizeMultiplierDictionary)); + cmd2.Parameters.AddWithValue("@Monster1StunThresholdDictionary", JsonConvert.SerializeObject(newMonster1StunThresholdDictionary)); + cmd2.Parameters.AddWithValue("@Monster1PartThresholdDictionary", JsonConvert.SerializeObject(newMonster1PartThresholdDictionary)); cmd2.ExecuteNonQuery(); } diff --git a/MHFZ_Overlay/ViewModels/Windows/AddressModel.cs b/MHFZ_Overlay/ViewModels/Windows/AddressModel.cs index c185e5a3..c319f36d 100644 --- a/MHFZ_Overlay/ViewModels/Windows/AddressModel.cs +++ b/MHFZ_Overlay/ViewModels/Windows/AddressModel.cs @@ -14,6 +14,7 @@ namespace MHFZ_Overlay.ViewModels.Windows; using System.Globalization; using System.IO; using System.Linq; +using System.Security.Policy; using System.Security.RightsManagement; using System.Text; using System.Windows; @@ -1966,28 +1967,28 @@ public string GetGamePatchInfo(GamePatchFile file, string hash) QuestsGamePatches.datHashInfo.TryGetValue(hash, out var datInfo); if (datInfo != null) { - var a = datInfo.Keys.FirstOrDefault(); - var b = datInfo.Keys.FirstOrDefault().ToString(); + //var a = datInfo.Keys.FirstOrDefault(); + //var b = datInfo.Keys.FirstOrDefault().ToString(); return $"{datInfo.Keys.FirstOrDefault().ToString()}-{datInfo.Values.FirstOrDefault().ToString()}"; } break; case GamePatchFile.emd: - QuestsGamePatches.datHashInfo.TryGetValue(hash, out var emdInfo); + QuestsGamePatches.emdHashInfo.TryGetValue(hash, out var emdInfo); if (emdInfo != null) { return $"{emdInfo.Keys.FirstOrDefault().ToString()}-{emdInfo.Values.FirstOrDefault().ToString()}"; } break; case GamePatchFile.dll: - QuestsGamePatches.datHashInfo.TryGetValue(hash, out var dllInfo); + QuestsGamePatches.mhfodllHashInfo.TryGetValue(hash, out var dllInfo); if (dllInfo != null) { return $"{dllInfo.Keys.FirstOrDefault().ToString()}-{dllInfo.Values.FirstOrDefault().ToString()}"; } break; case GamePatchFile.hddll: - QuestsGamePatches.datHashInfo.TryGetValue(hash, out var hddllInfo); + QuestsGamePatches.mhfohddllHashInfo.TryGetValue(hash, out var hddllInfo); if (hddllInfo != null) { return $"{hddllInfo.Keys.FirstOrDefault().ToString()}-{hddllInfo.Values.FirstOrDefault().ToString()}"; @@ -8219,6 +8220,14 @@ public string GenerateGearStats(long? runID = null) showGouBoost = " (After Gou/Muscle Boost)"; } + var s = (Settings)Application.Current.TryFindResource("Settings"); + + var gameFolderPathStatus = s.GameFolderPath == @"C:\Program Files (x86)\CAPCOM\Monster Hunter Frontier Online" ? "Standard" : "Custom"; + var mhfdatHash = DatabaseService.CalculateFileHash(s.GameFolderPath, @"\dat\mhfdat.bin"); + var mhfemdHash = DatabaseService.CalculateFileHash(s.GameFolderPath, @"\dat\mhfemd.bin"); + var mhfodllHash = DatabaseService.CalculateFileHash(s.GameFolderPath, @"\mhfo.dll"); + var mhfohddllHash = DatabaseService.CalculateFileHash(s.GameFolderPath, @"\mhfo-hd.dll"); + // zp in bold for markdown // fruits and speedrunner items also in bold var stats = string.Format( @@ -8291,9 +8300,15 @@ public string GenerateGearStats(long? runID = null) Attack {HalkAttack()} Defense {HalkDefense()} Intellect {HalkIntellect()} -{HalkSkill1()} | {HalkSkill2()} | {HalkSkill3()} +{(HalkSkill1() == 0 ? "None" : EZlion.Mapper.SkillHalk.IDName[HalkSkill1()])} | {(HalkSkill2() == 0 ? "None" : EZlion.Mapper.SkillHalk.IDName[HalkSkill2()])} | {(HalkSkill3() == 0 ? "None" : EZlion.Mapper.SkillHalk.IDName[HalkSkill3()])} Overlay Hash: {DatabaseManagerInstance.GetOverlayHash()} + +Game Patch Information: +dat: {GetGamePatchInfo(GamePatchFile.dat, mhfdatHash)} +emd: {GetGamePatchInfo(GamePatchFile.emd, mhfemdHash)} +dll: {GetGamePatchInfo(GamePatchFile.dll, mhfodllHash)} +hddll: {GetGamePatchInfo(GamePatchFile.hddll, mhfohddllHash)} "); this.SavedGearStats = stats; var formattedStats = string.Format( @@ -8366,9 +8381,15 @@ public string GenerateGearStats(long? runID = null) Attack {HalkAttack()} Defense {HalkDefense()} Intellect {HalkIntellect()} -{HalkSkill1()} | {HalkSkill2()} | {HalkSkill3()} +{(HalkSkill1() == 0 ? "None" : EZlion.Mapper.SkillHalk.IDName[HalkSkill1()])} | {(HalkSkill2() == 0 ? "None" : EZlion.Mapper.SkillHalk.IDName[HalkSkill2()])} | {(HalkSkill3() == 0 ? "None" : EZlion.Mapper.SkillHalk.IDName[HalkSkill3()])} **Overlay Hash:** {DatabaseManagerInstance.GetOverlayHash()} + +**Game Patch Information:** +dat: {GetGamePatchInfo(GamePatchFile.dat, mhfdatHash)} +emd: {GetGamePatchInfo(GamePatchFile.emd, mhfemdHash)} +dll: {GetGamePatchInfo(GamePatchFile.dll, mhfodllHash)} +hddll: {GetGamePatchInfo(GamePatchFile.hddll, mhfohddllHash)} "); this.MarkdownSavedGearStats = formattedStats; return stats; @@ -8445,142 +8466,96 @@ public string GenerateGearStats(long? runID = null) var halkSkill2 = halk.HalkSkill2 == null ? "None" : EZlion.Mapper.SkillHalk.IDName[(int)halk.HalkSkill2]; var halkSkill3 = halk.HalkSkill3 == null ? "None" : EZlion.Mapper.SkillHalk.IDName[(int)halk.HalkSkill3]; + var courseInfo = $"Main: {GetMainCourses(courses.Rights)}\nAdditional: {GetAdditionalCourses(courses.Rights)}"; + var patchInfo = DatabaseManagerInstance.GetQuestsGamePatch((long)runID); + // TODO: fix + // TODO partnyaBagItems // var partnyaBagItems = GetItemsForRunID(new int[] { (int)partnyaBag.Item1ID, (int)partnyaBag.Item2ID, (int)partnyaBag.Item3ID, (int)partnyaBag.Item4ID, (int)partnyaBag.Item5ID, (int)partnyaBag.Item6ID, (int)partnyaBag.Item7ID, (int)partnyaBag.Item8ID, (int)partnyaBag.Item9ID, (int)partnyaBag.Item10ID }); return string.Format( CultureInfo.InvariantCulture, - @"{0} {1}({2}){3} + $@"{createdBy} {weaponClass}({gender}){metadata} -Set Name: {4} -{5}: {6} -Head: {7} -Chest: {8} -Arms: {9} -Waist: {10} -Legs: {11} -Cuffs: {12} +Set Name: {gearName} +{weaponName}: {realweaponName} +Head: {head} +Chest: {chest} +Arms: {arms} +Waist: {waist} +Legs: {legs} +Cuffs: {cuffs} -Run Date: {13} | Run Hash: {14} +Run Date: {date} | Run Hash: {hash} Zenith Skills: -{15} +{zenithSkillsList} Automatic Skills: -{16} +{automaticSkillsList} -Active Skills{17}: -{18} +Active Skills{gouBoost}: +{armorSkills} Caravan Skills: -{19} +{caravanSkillsList} Diva: -{20} -Song {21} +{(divaSkill == "None" ? "No Skill" : divaSkill)} +Song {(diva.DivaSongBuffOn > 0 ? "ON" : "OFF")} Diva Prayer Gems: -{22} +{GetDivaPrayerGems(diva)} Guild: -{23} -{24} +{guildFood} +{GetGuildPoogieEffect(guildPoogie)} Style Rank: -{25} +{styleRankSkillsList} Items: -{26} +{inventory} Ammo: -{27} +{ammo} Poogie Item: -{28} +{poogieItem} Road/Duremudira Skills: -{29} +{roadDureSkillsList} -Quest: {30} -{31} {32} {33} -Category: {34} -Party Size: {35} -Mode: {36} -Active Feature {37} +Quest: {questName} +{questObjectiveType} {questObjectiveQuantity} {questObjectiveName} +Category: {questCategory} +Party Size: {partySize} +Mode: {toggleModeName} +Active Feature {(activeFeatureState == true ? "ON" : "OFF")} Courses: -{38} +{courseInfo} Halk: -{39} -Halk Pot {40} -LV{41} -Element Type {42} -Status Type {43} -Intimacy {44} -Health {45} -Attack {46} -Defense {47} -Intellect {48} -{49} | {50} | {51} - -Overlay Hash: {52} -", - createdBy, - weaponClass, - gender, - metadata, - gearName, - weaponName, - realweaponName, - head, - chest, - arms, - waist, - legs, - cuffs, - date, - hash, - zenithSkillsList, - automaticSkillsList, - gouBoost, - armorSkills, - caravanSkillsList, - divaSkill == "None" ? "No Skill" : divaSkill, - diva.DivaSongBuffOn > 0 ? "ON" : "OFF", - GetDivaPrayerGems(diva), - guildFood, - GetGuildPoogieEffect(guildPoogie), - styleRankSkillsList, - inventory, - ammo, - poogieItem, - roadDureSkillsList, - - // TODO partnyaBagItems - questName, - questObjectiveType, - questObjectiveQuantity, - questObjectiveName, - questCategory, - partySize, - toggleModeName, - activeFeatureState == true ? "ON" : "OFF", - $"Main: {GetMainCourses(courses.Rights)}\nAdditional: {GetAdditionalCourses(courses.Rights)}", - halk.HalkOn > 0 ? "Active" : "Inactive", - halk.HalkPotEffectOn > 0 ? "ON" : "OFF", - halk.HalkLevel, - GetHalkElement(halk), - GetHalkStatus(halk), - halk.HalkIntimacy, - halk.HalkHealth, - halk.HalkAttack, - halk.HalkDefense, - halk.HalkIntellect, - halkSkill1, - halkSkill2, - halkSkill3, - overlayHash.OverlayHash - ); +{(halk.HalkOn > 0 ? "Active" : "Inactive")} +Halk Pot {(halk.HalkPotEffectOn > 0 ? "ON" : "OFF")} +LV{halk.HalkLevel} +Element Type {GetHalkElement(halk)} +Status Type {GetHalkStatus(halk)} +Intimacy {halk.HalkIntimacy} +Health {halk.HalkHealth} +Attack {halk.HalkAttack} +Defense {halk.HalkDefense} +Intellect {halk.HalkIntellect} +{halkSkill1} | {halkSkill2} | {halkSkill3} + +Overlay Hash: {overlayHash.OverlayHash} + +Game Patch Information: +dat: {patchInfo.mhfdatInfo} +emd: {patchInfo.mhfemdInfo} +dll: {patchInfo.mhfodllInfo} +hddll: {patchInfo.mhfohddllInfo} +"); } }