diff --git a/src/Ryujinx/Utilities/PlayReport/Analyzer.cs b/src/Ryujinx/Utilities/PlayReport/Analyzer.cs index 668eb526c..0b5284673 100644 --- a/src/Ryujinx/Utilities/PlayReport/Analyzer.cs +++ b/src/Ryujinx/Utilities/PlayReport/Analyzer.cs @@ -31,8 +31,7 @@ namespace Ryujinx.Ava.Utilities.PlayReport Guard.Ensure(ulong.TryParse(titleId, NumberStyles.HexNumber, null, out _), $"Cannot use a non-hexadecimal string as the Title ID for a {nameof(GameSpec)}."); - _specs.Add(transform(new GameSpec { TitleIds = [titleId] })); - return this; + return AddSpec(transform(GameSpec.Create(titleId))); } /// @@ -46,8 +45,7 @@ namespace Ryujinx.Ava.Utilities.PlayReport Guard.Ensure(ulong.TryParse(titleId, NumberStyles.HexNumber, null, out _), $"Cannot use a non-hexadecimal string as the Title ID for a {nameof(GameSpec)}."); - _specs.Add(new GameSpec { TitleIds = [titleId] }.Apply(transform)); - return this; + return AddSpec(GameSpec.Create(titleId).Apply(transform)); } /// @@ -63,8 +61,7 @@ namespace Ryujinx.Ava.Utilities.PlayReport Guard.Ensure(tids.All(x => ulong.TryParse(x, NumberStyles.HexNumber, null, out _)), $"Cannot use a non-hexadecimal string as the Title ID for a {nameof(GameSpec)}."); - _specs.Add(transform(new GameSpec { TitleIds = [..tids] })); - return this; + return AddSpec(transform(GameSpec.Create(tids))); } /// @@ -79,7 +76,17 @@ namespace Ryujinx.Ava.Utilities.PlayReport Guard.Ensure(tids.All(x => ulong.TryParse(x, NumberStyles.HexNumber, null, out _)), $"Cannot use a non-hexadecimal string as the Title ID for a {nameof(GameSpec)}."); - _specs.Add(new GameSpec { TitleIds = [..tids] }.Apply(transform)); + return AddSpec(GameSpec.Create(tids).Apply(transform)); + } + + /// + /// Add an analysis spec matching a specific game by title ID, with the provided pre-configured spec. + /// + /// The to add. + /// The current , for chaining convenience. + public Analyzer AddSpec(GameSpec spec) + { + _specs.Add(spec); return this; } diff --git a/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs b/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs index 3b7699191..f0d7f87ba 100644 --- a/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs +++ b/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs @@ -294,8 +294,67 @@ namespace Ryujinx.Ava.Utilities.PlayReport }; } - private static FormattedValue N64_LaunchedGame(SingleValue value) => value.Matched.StringValue switch + private static FormattedValue NsoEmulator_LaunchedGame(SingleValue value) => value.Matched.StringValue switch { + #region SEGA Genesis + + "m_0054_e" => Playing("Alien Soldier"), + "m_3978_e" => Playing("Alien Storm"), + "m_5234_e" => Playing("ALISIA DRAGOON"), + "m_5003_e" => Playing("Streets of Rage 2"), + "m_4843_e" => Playing("Kid Chameleon"), + "m_2874_e" => Playing("Columns"), + "m_3167_e" => Playing("Comix Zone"), + "m_5007_e" => Playing("Contra: Hard Corps"), + "m_0865_e" => Playing("Ghouls 'n Ghosts"), + "m_0935_e" => Playing("Dynamite Headdy"), + "m_8314_e" => Playing("Earthworm Jim"), + "m_5012_e" => Playing("Ecco the Dolphin"), + "m_2207_e" => Playing("Flicky"), + "m_9432_e" => Playing("Golden Axe II"), + "m_5015_e" => Playing("Golden Axe"), + "m_5017_e" => Playing("Gunstar Heroes"), + "m_0732_e" => Playing("Altered Beast"), + "m_2245_e" or "m_2245_pd" or "m_2245_pf" => Playing("Landstalker"), + "m_1654_e" => Playing("Target Earth"), + "m_7050_e" => Playing("Light Crusader"), + "m_5027_e" => Playing("M.U.S.H.A."), + "m_5028_e" => Playing("Phantasy Star IV"), + "m_9155_e" => Playing("Pulseman"), + "m_5030_e" => Playing("Dr. Robotnik's Mean Bean Machine"), + "m_0098_e" => Playing("Crusader of Centy"), + "m_0098_k" => Playing("신창세기 라그나센티"), + "m_0098_pd" or "m_0098_pf" or "m_0098_ps" => Playing("Soleil"), + "m_5033_e" => Playing("Ristar"), + "m_1987_e" => Playing("MEGA MAN: THE WILY WARS"), + "m_2609_e" => Playing("WOLF OF THE BATTLEFIELD: MERCS"), + "m_3353_e" => Playing("Shining Force II"), + "m_5036_e" => Playing("Shining Force"), + "m_9866_e" => Playing("Sonic The Hedgehog Spinball"), + "m_5041_e" => Playing("Sonic The Hedgehog 2"), + "m_5523_e" => Playing("Space Harrier II"), + "m_0041_e" => Playing("STREET FIGHTER II' : SPECIAL CHAMPION EDITION"), + "m_5044_e" => Playing("STRIDER"), + "m_6353_e" => Playing("Super Fantasy Zone"), + "m_9569_e" => Playing("Beyond Oasis"), + "m_9569_k" => Playing("스토리 오브 도어"), + "m_9569_pd" or "m_9569_ps" => Playing("The Story of Thor"), + "m_9569_pf" => Playing("La Légende de Thor"), + "m_5049_e" => Playing("Shinobi III: Return of the Ninja Master"), + "m_6811_e" => Playing("The Revenge of Shinobi"), + "m_4372_e" => Playing("Thunder Force II"), + "m_1535_e" => Playing("ToeJam & Earl in Panic on Funkotron"), + "m_0432_e" => Playing("ToeJam & Earl"), + "m_5052_e" => Playing("Castlevania: BLOODLINES"), + "m_3626_e" => Playing("VectorMan"), + "m_7955_e" => Playing("Sword of Vermilion"), + "m_0394_e" => Playing("Virtua Fighter 2"), + "m_9417_e" => Playing("Zero Wing"), + + #endregion + + #region Nintendo 64 + "n_1653_e" or "n_1653_p" => Playing("1080º ™ Snowboarding"), "n_4868_e" or "n_4868_p" => Playing("Banjo Kazooie™"), "n_1226_e" or "n_1226_p" => Playing("Banjo-Tooie™"), @@ -331,11 +390,11 @@ namespace Ryujinx.Ava.Utilities.PlayReport "n_3036_e" or "n_3036_p" => Playing("Yoshi's Story™"), "n_1407_e" or "n_1407_p" => Playing("The Legend of Zelda™: Majora's Mask™"), "n_3038_e" or "n_3038_p" => Playing("The Legend of Zelda™: Ocarina of Time™"), - _ => FormattedValue.ForceReset - }; - private static FormattedValue NES_LaunchedGame(SingleValue value) => value.Matched.StringValue switch - { + #endregion + + #region NES + "clv_p_naaae" => Playing("Super Mario Bros.™"), "clv_p_naabe" => Playing("Super Mario Bros.™: The Lost Levels"), "clv_p_naace" or "clv_p_naace_sp1" => Playing("Super Mario Bros.™ 3"), @@ -415,11 +474,11 @@ namespace Ryujinx.Ava.Utilities.PlayReport "clv_p_najre" => Playing("COBRA TRIANGLE™"), "clv_p_najse" => Playing("SNAKE RATTLE N ROLL™"), "clv_p_najte" => Playing("SOLAR® JETMAN"), - _ => FormattedValue.ForceReset - }; - private static FormattedValue SNES_LaunchedGame(SingleValue value) => value.Matched.StringValue switch - { + #endregion + + #region SNES + "s_2180_e" => Playing("BATTLETOADS™ DOUBLE DRAGON™"), "s_2179_e" => Playing("BATTLETOADS™ IN BATTLEMANIACS"), "s_2182_e" => Playing("BIG RUN"), @@ -490,98 +549,11 @@ namespace Ryujinx.Ava.Utilities.PlayReport "s_2096_e" => Playing("Wrecking Crew™ '98"), "s_2023_e" => Playing("Super Mario World™ 2: Yoshi's Island™"), "s_2024_e" => Playing("The Legend of Zelda™: A Link to the Past™"), - _ => FormattedValue.ForceReset - }; - private static FormattedValue Genesis_LaunchedGame(SingleValue value) => value.Matched.StringValue switch - { - "m_0054_e" => Playing("Alien Soldier"), - "m_3978_e" => Playing("Alien Storm"), - "m_5234_e" => Playing("ALISIA DRAGOON"), - "m_5003_e" => Playing("Streets of Rage 2"), - "m_4843_e" => Playing("Kid Chameleon"), - "m_2874_e" => Playing("Columns"), - "m_3167_e" => Playing("Comix Zone"), - "m_5007_e" => Playing("Contra: Hard Corps"), - "m_0865_e" => Playing("Ghouls 'n Ghosts"), - "m_0935_e" => Playing("Dynamite Headdy"), - "m_8314_e" => Playing("Earthworm Jim"), - "m_5012_e" => Playing("Ecco the Dolphin"), - "m_2207_e" => Playing("Flicky"), - "m_9432_e" => Playing("Golden Axe II"), - "m_5015_e" => Playing("Golden Axe"), - "m_5017_e" => Playing("Gunstar Heroes"), - "m_0732_e" => Playing("Altered Beast"), - "m_2245_e" or "m_2245_pd" or "m_2245_pf" => Playing("Landstalker"), - "m_1654_e" => Playing("Target Earth"), - "m_7050_e" => Playing("Light Crusader"), - "m_5027_e" => Playing("M.U.S.H.A."), - "m_5028_e" => Playing("Phantasy Star IV"), - "m_9155_e" => Playing("Pulseman"), - "m_5030_e" => Playing("Dr. Robotnik's Mean Bean Machine"), - "m_0098_e" => Playing("Crusader of Centy"), - "m_0098_k" => Playing("신창세기 라그나센티"), - "m_0098_pd" or "m_0098_pf" or "m_0098_ps" => Playing("Soleil"), - "m_5033_e" => Playing("Ristar"), - "m_1987_e" => Playing("MEGA MAN: THE WILY WARS"), - "m_2609_e" => Playing("WOLF OF THE BATTLEFIELD: MERCS"), - "m_3353_e" => Playing("Shining Force II"), - "m_5036_e" => Playing("Shining Force"), - "m_9866_e" => Playing("Sonic The Hedgehog Spinball"), - "m_5041_e" => Playing("Sonic The Hedgehog 2"), - "m_5523_e" => Playing("Space Harrier II"), - "m_0041_e" => Playing("STREET FIGHTER II' : SPECIAL CHAMPION EDITION"), - "m_5044_e" => Playing("STRIDER"), - "m_6353_e" => Playing("Super Fantasy Zone"), - "m_9569_e" => Playing("Beyond Oasis"), - "m_9569_k" => Playing("스토리 오브 도어"), - "m_9569_pd" or "m_9569_ps" => Playing("The Story of Thor"), - "m_9569_pf" => Playing("La Légende de Thor"), - "m_5049_e" => Playing("Shinobi III: Return of the Ninja Master"), - "m_6811_e" => Playing("The Revenge of Shinobi"), - "m_4372_e" => Playing("Thunder Force II"), - "m_1535_e" => Playing("ToeJam & Earl in Panic on Funkotron"), - "m_0432_e" => Playing("ToeJam & Earl"), - "m_5052_e" => Playing("Castlevania: BLOODLINES"), - "m_3626_e" => Playing("VectorMan"), - "m_7955_e" => Playing("Sword of Vermilion"), - "m_0394_e" => Playing("Virtua Fighter 2"), - "m_9417_e" => Playing("Zero Wing"), - _ => FormattedValue.ForceReset - }; - - private static FormattedValue GBA_LaunchedGame(SingleValue value) => value.Matched.StringValue switch - { - "a_9694_e" => Playing("Densetsu no Starfy 1"), - "a_5600_e" => Playing("Densetsu no Starfy 2"), - "a_7565_e" => Playing("Densetsu no Starfy 3"), - "a_6553_e" => Playing("F-ZERO CLIMAX"), - "a_7842_e" or "a_7842_p" => Playing("F-Zero™- GP Legend"), - "a_9283_e" => Playing("F-Zero™ Maximum Velocity"), - "a_3744_e" or "a_3744_x" or "a_3744_y" => Playing("Fire Emblem™"), - "a_8978_d" or "a_8978_e" or "a_8978_f" or "a_8978_i" or "a_8978_s" => Playing("Golden Sun™: The Lost Age"), - "a_3108_d" or "a_3108_e" or "a_3108_f" or "a_3108_i" or "a_3108_s" => Playing("Golden Sun™"), - "a_3654_e" or "a_3654_p" => Playing("Kirby™ & The Amazing Mirror"), - "a_7279_p" => Playing("Kuru Kuru Kururin™"), - "a_7311_e" or "a_7311_p" => Playing("Mario & Luigi™: Superstar Saga"), - "a_6845_e" => Playing("Mario Kart™: Super Circuit™"), - "a_4139_e" or "a_4139_p" => Playing("Metroid™ Fusion"), - "a_6834_e" or "a_6834_p" => Playing("Metroid™: Zero Mission"), - "a_8989_e" or "a_8989_p" => Playing("Pokémon™ Mystery Dungeon: Red Rescue Team"), - "a_9444_e" => Playing("Super Mario™ Advance"), - "a_9901_e" or "a_9901_p" => Playing("Super Mario™ Advance 4: Super Mario Bros.™ 3"), - "a_2939_e" => Playing("Super Mario World™: Super Mario Advance 2"), - "a_2939_p" => Playing("Super Mario World™: Super Mario Advance 2™"), - "a_1302_e" => Playing("WarioWare™, Inc.: Mega Microgame$!"), - "a_1302_p" => Playing("WarioWare™, Inc.: Minigame Mania."), - "a_6960_e" or "a_6960_p" => Playing("Yoshi's Island™: Super Mario™ Advance 3"), - "a_5190_e" or "a_5190_p" => Playing("The Legend of Zelda™: A Link to the Past™ Four Swords"), - "a_8665_e" or "a_8665_p" => Playing("The Legend of Zelda™: The Minish Cap"), - _ => FormattedValue.ForceReset - }; - - private static FormattedValue GB_LaunchedGame(SingleValue value) => value.Matched.StringValue switch - { + #endregion + + #region GameBoy + "c_7224_e" or "c_7224_p" => Playing("Alone in the Dark: The New Nightmare"), "c_5022_e" => Playing("Blaster Master: Enemy Below"), "c_3381_e" => Playing("Game & Watch™ Gallery 3"), @@ -615,6 +587,39 @@ namespace Ryujinx.Ava.Utilities.PlayReport "d_5124_e" => Playing("Super Mario Land™ 2 - 6 Golden Coins™"), "d_7970_e" => Playing("Super Mario Land™"), "d_8484_e" => Playing("Tetris®"), + + #endregion + + #region GameBoy Advance + + "a_9694_e" => Playing("Densetsu no Starfy 1"), + "a_5600_e" => Playing("Densetsu no Starfy 2"), + "a_7565_e" => Playing("Densetsu no Starfy 3"), + "a_6553_e" => Playing("F-ZERO CLIMAX"), + "a_7842_e" or "a_7842_p" => Playing("F-Zero™- GP Legend"), + "a_9283_e" => Playing("F-Zero™ Maximum Velocity"), + "a_3744_e" or "a_3744_x" or "a_3744_y" => Playing("Fire Emblem™"), + "a_8978_d" or "a_8978_e" or "a_8978_f" or "a_8978_i" or "a_8978_s" => Playing("Golden Sun™: The Lost Age"), + "a_3108_d" or "a_3108_e" or "a_3108_f" or "a_3108_i" or "a_3108_s" => Playing("Golden Sun™"), + "a_3654_e" or "a_3654_p" => Playing("Kirby™ & The Amazing Mirror"), + "a_7279_p" => Playing("Kuru Kuru Kururin™"), + "a_7311_e" or "a_7311_p" => Playing("Mario & Luigi™: Superstar Saga"), + "a_6845_e" => Playing("Mario Kart™: Super Circuit™"), + "a_4139_e" or "a_4139_p" => Playing("Metroid™ Fusion"), + "a_6834_e" or "a_6834_p" => Playing("Metroid™: Zero Mission"), + "a_8989_e" or "a_8989_p" => Playing("Pokémon™ Mystery Dungeon: Red Rescue Team"), + "a_9444_e" => Playing("Super Mario™ Advance"), + "a_9901_e" or "a_9901_p" => Playing("Super Mario™ Advance 4: Super Mario Bros.™ 3"), + "a_2939_e" => Playing("Super Mario World™: Super Mario Advance 2"), + "a_2939_p" => Playing("Super Mario World™: Super Mario Advance 2™"), + "a_1302_e" => Playing("WarioWare™, Inc.: Mega Microgame$!"), + "a_1302_p" => Playing("WarioWare™, Inc.: Minigame Mania."), + "a_6960_e" or "a_6960_p" => Playing("Yoshi's Island™: Super Mario™ Advance 3"), + "a_5190_e" or "a_5190_p" => Playing("The Legend of Zelda™: A Link to the Past™ Four Swords"), + "a_8665_e" or "a_8665_p" => Playing("The Legend of Zelda™: The Minish Cap"), + + #endregion + _ => FormattedValue.ForceReset }; } diff --git a/src/Ryujinx/Utilities/PlayReport/PlayReports.cs b/src/Ryujinx/Utilities/PlayReport/PlayReports.cs index e012a92ad..5f6ba3446 100644 --- a/src/Ryujinx/Utilities/PlayReport/PlayReports.cs +++ b/src/Ryujinx/Utilities/PlayReport/PlayReports.cs @@ -62,25 +62,10 @@ namespace Ryujinx.Ava.Utilities.PlayReport ) ) .AddSpec( - "0100c9a00ece6000", - spec => spec.AddValueFormatter("launch_title_id", N64_LaunchedGame) - ) - .AddSpec( - "01008d300c50c000", - spec => spec.AddValueFormatter("launch_title_id", SNES_LaunchedGame) - ) - .AddSpec( - "0100d870045b6000", - spec => spec.AddValueFormatter("launch_title_id", NES_LaunchedGame) - ).AddSpec( - "010012f017576000", - spec => spec.AddValueFormatter("launch_title_id", GBA_LaunchedGame) - ).AddSpec( - "0100c62011050000", - spec => spec.AddValueFormatter("launch_title_id", GB_LaunchedGame) - ).AddSpec( - "0100b3c014bda000", - spec => spec.AddValueFormatter("launch_title_id", Genesis_LaunchedGame) + [ + "0100c9a00ece6000", "01008d300c50c000", "0100d870045b6000", + "010012f017576000", "0100c62011050000", "0100b3c014bda000"], + spec => spec.AddValueFormatter("launch_title_id", NsoEmulator_LaunchedGame) ); private static string Playing(string game) => $"Playing {game}"; diff --git a/src/Ryujinx/Utilities/PlayReport/Specs.cs b/src/Ryujinx/Utilities/PlayReport/Specs.cs index e7972fbb4..be9232dc8 100644 --- a/src/Ryujinx/Utilities/PlayReport/Specs.cs +++ b/src/Ryujinx/Utilities/PlayReport/Specs.cs @@ -14,8 +14,14 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// public class GameSpec { + public static GameSpec Create(string requiredTitleId, params IEnumerable otherTitleIds) + => new() { TitleIds = otherTitleIds.Prepend(requiredTitleId).ToArray() }; + + public static GameSpec Create(IEnumerable titleIds) + => new() { TitleIds = titleIds.ToArray() }; + private int _lastPriority; - + public required string[] TitleIds { get; init; } public List ValueFormatters { get; } = []; @@ -28,8 +34,10 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// The key name to match. /// The function which can return a potential formatted value. /// The current , for chaining convenience. - public GameSpec AddValueFormatter(string reportKey, SingleValueFormatter valueFormatter) - => AddValueFormatter(_lastPriority++, reportKey, valueFormatter); + public GameSpec AddValueFormatter( + string reportKey, + SingleValueFormatter valueFormatter + ) => AddValueFormatter(_lastPriority++, reportKey, valueFormatter); /// /// Add a value formatter at a specific priority to the current @@ -39,15 +47,14 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// The key name to match. /// The function which can return a potential formatted value. /// The current , for chaining convenience. - public GameSpec AddValueFormatter(int priority, string reportKey, - SingleValueFormatter valueFormatter) + public GameSpec AddValueFormatter( + int priority, + string reportKey, + SingleValueFormatter valueFormatter + ) => AddValueFormatter(new FormatterSpec { - ValueFormatters.Add(new FormatterSpec - { - Priority = priority, ReportKeys = [reportKey], Formatter = valueFormatter - }); - return this; - } + Priority = priority, ReportKeys = [reportKey], Formatter = valueFormatter + }); /// /// Add a multi-value formatter to the current @@ -56,8 +63,10 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// The key names to match. /// The function which can format the values. /// The current , for chaining convenience. - public GameSpec AddMultiValueFormatter(string[] reportKeys, MultiValueFormatter valueFormatter) - => AddMultiValueFormatter(_lastPriority++, reportKeys, valueFormatter); + public GameSpec AddMultiValueFormatter( + string[] reportKeys, + MultiValueFormatter valueFormatter + ) => AddMultiValueFormatter(_lastPriority++, reportKeys, valueFormatter); /// /// Add a multi-value formatter at a specific priority to the current @@ -67,15 +76,14 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// The key names to match. /// The function which can format the values. /// The current , for chaining convenience. - public GameSpec AddMultiValueFormatter(int priority, string[] reportKeys, - MultiValueFormatter valueFormatter) + public GameSpec AddMultiValueFormatter( + int priority, + string[] reportKeys, + MultiValueFormatter valueFormatter + ) => AddValueFormatter(new MultiFormatterSpec { - ValueFormatters.Add(new MultiFormatterSpec - { - Priority = priority, ReportKeys = reportKeys, Formatter = valueFormatter - }); - return this; - } + Priority = priority, ReportKeys = reportKeys, Formatter = valueFormatter + }); /// /// Add a multi-value formatter to the current @@ -87,8 +95,10 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// The key names to match. /// The function which can format the values. /// The current , for chaining convenience. - public GameSpec AddSparseMultiValueFormatter(string[] reportKeys, SparseMultiValueFormatter valueFormatter) - => AddSparseMultiValueFormatter(_lastPriority++, reportKeys, valueFormatter); + public GameSpec AddSparseMultiValueFormatter( + string[] reportKeys, + SparseMultiValueFormatter valueFormatter + ) => AddSparseMultiValueFormatter(_lastPriority++, reportKeys, valueFormatter); /// /// Add a multi-value formatter at a specific priority to the current @@ -101,13 +111,18 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// The key names to match. /// The function which can format the values. /// The current , for chaining convenience. - public GameSpec AddSparseMultiValueFormatter(int priority, string[] reportKeys, - SparseMultiValueFormatter valueFormatter) + public GameSpec AddSparseMultiValueFormatter( + int priority, + string[] reportKeys, + SparseMultiValueFormatter valueFormatter + ) => AddValueFormatter(new SparseMultiFormatterSpec { - ValueFormatters.Add(new SparseMultiFormatterSpec - { - Priority = priority, ReportKeys = reportKeys, Formatter = valueFormatter - }); + Priority = priority, ReportKeys = reportKeys, Formatter = valueFormatter + }); + + private GameSpec AddValueFormatter(T formatterSpec) where T : FormatterSpecBase + { + ValueFormatters.Add(formatterSpec); return this; } } @@ -174,16 +189,17 @@ namespace Ryujinx.Ava.Utilities.PlayReport return true; } } - + public abstract class FormatterSpecBase { public abstract bool GetData(Horizon.Prepo.Types.PlayReport playReport, out object data); - + public int Priority { get; init; } public string[] ReportKeys { get; init; } public Delegate Formatter { get; init; } - public bool Format(ApplicationMetadata appMeta, Horizon.Prepo.Types.PlayReport playReport, out FormattedValue formattedValue) + public bool Format(ApplicationMetadata appMeta, Horizon.Prepo.Types.PlayReport playReport, + out FormattedValue formattedValue) { formattedValue = default; if (!GetData(playReport, out object data)) @@ -201,11 +217,16 @@ namespace Ryujinx.Ava.Utilities.PlayReport formattedValue = svf(new SingleValue(mpo) { Application = appMeta, PlayReport = playReport }); return true; case MultiValueFormatter mvf when data is List messagePackObjects: - formattedValue = mvf(new MultiValue(messagePackObjects) { Application = appMeta, PlayReport = playReport }); + formattedValue = + mvf(new MultiValue(messagePackObjects) { Application = appMeta, PlayReport = playReport }); return true; case SparseMultiValueFormatter smvf when data is Dictionary sparseMessagePackObjects: - formattedValue = smvf(new SparseMultiValue(sparseMessagePackObjects) { Application = appMeta, PlayReport = playReport }); + formattedValue = + smvf(new SparseMultiValue(sparseMessagePackObjects) + { + Application = appMeta, PlayReport = playReport + }); return true; default: throw new InvalidOperationException("Formatter delegate is not of a known type!");