diff --git a/TaikoWebUI/GlobalUsings.cs b/TaikoWebUI/GlobalUsings.cs index c9a23b1..f644645 100644 --- a/TaikoWebUI/GlobalUsings.cs +++ b/TaikoWebUI/GlobalUsings.cs @@ -6,6 +6,7 @@ global using Microsoft.AspNetCore.Components.Web; global using MudBlazor; global using TaikoWebUI; global using TaikoWebUI.Services; +global using TaikoWebUI.Shared; global using SharedProject.Models; global using SharedProject.Models.Requests; global using SharedProject.Models.Responses; diff --git a/TaikoWebUI/Pages/Profile.razor b/TaikoWebUI/Pages/Profile.razor index a77e060..8e93555 100644 --- a/TaikoWebUI/Pages/Profile.razor +++ b/TaikoWebUI/Pages/Profile.razor @@ -1,5 +1,6 @@ @page "/Cards/{baid:int}/Profile" @inject HttpClient Client +@inject IGameDataService GameDataService @@ -9,213 +10,212 @@ @if (response is not null) { - - - - - -

Profile Options

+ + + + + +

Profile Options

- + - - - @if (EnterTextDirectly) + + + @if (enterTextDirectly) + { + + } + else + { + + } + Enter Text Directly + + + + @for (uint i = 0; i < 8; i++) { - + var index = i; + @TitlePlateStrings[index] } - else - { - - } - Enter Text Directly - - - - @for (uint i = 0; i < 8; i++) + + + + + + @foreach (var item in Enum.GetValues()) + { + + } + + + + +
+
+ + + +

Costume Options

+ + + + + @for (var i = 0; i < Constants.COSTUME_HEAD_MAX; i++) { - var index = i; - @titlePlateStrings[index] + var index = (uint)i; + var costumeTitle = GameDataService.GetHeadTitle(index); + @index - @costumeTitle } - - - - @foreach (var item in Enum.GetValues()) - { - - } - + + @for (var i = 0; i < Constants.COSTUME_BODY_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetBodyTitle(index); + @index - @costumeTitle + } + - - -
-
+ + @for (var i = 0; i < Constants.COSTUME_FACE_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetFaceTitle(index); + @index - @costumeTitle + } + - - -

Costume Options

- - - - - @for (uint i = 0; i < GameDataService.COSTUME_HEAD_MAX; i++) - { - var index = i; - var costumeTitle = GameDataService.headMap[index]; - @index - @costumeTitle - } - + + @for (var i = 0; i < Constants.COSTUME_KIGURUMI_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetKigurumiTitle(index); + @index - @costumeTitle + } + - - @for (uint i = 0; i < GameDataService.COSTUME_BODY_MAX; i++) - { - var index = i; - var costumeTitle = GameDataService.bodyMap[index]; - @index - @costumeTitle - } - + + @for (var i = 0; i < Constants.COSTUME_PUCHI_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetPuchiTitle(index); + @index - @costumeTitle + } + + - - @for (uint i = 0; i < GameDataService.COSTUME_FACE_MAX; i++) - { - var index = i; - var costumeTitle = GameDataService.faceMap[index]; - @index - @costumeTitle - } - + + + @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++) + { + var index = i; + +
+ @index +
+ } +
+ + @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++) + { + var index = i; + +
+ @index +
+ } +
+ + @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++) + { + var index = i; + +
+ @index +
+ } +
+
+
+
+
+
- - @for (uint i = 0; i < GameDataService.COSTUME_KIGURUMI_MAX; i++) - { - var index = i; - var costumeTitle = GameDataService.kigurumiMap[index]; - @index - @costumeTitle - } - + + +

Song Options

+ + + + + + + + + + + + + @for (uint i = 0; i < 15; i++) + { + var index = i; + @SpeedStrings[index] + } + - - @for (uint i = 0; i < GameDataService.COSTUME_PUCHI_MAX; i++) - { - var index = i; - var costumeTitle = GameDataService.puchiMap[index]; - @index - @costumeTitle - } - - + + @foreach (var item in Enum.GetValues()) + { + + } + - - - @for (uint i = 0; i < GameDataService.COSTUME_COLOR_MAX; i++) - { - var index = i; - -
- @index -
- } -
- - @for (uint i = 0; i < GameDataService.COSTUME_COLOR_MAX; i++) - { - var index = i; - -
- @index -
- } -
- - @for (uint i = 0; i < GameDataService.COSTUME_COLOR_MAX; i++) - { - var index = i; - -
- @index -
- } -
-
-
-
-
-
+ + @for (uint i = 0; i < 19; i++) + { + var index = i; + @ToneStrings[index] + } + - - -

Song Options

- - - - - - - - - - - - - @for (uint i = 0; i < 15; i++) - { - var index = i; - @speedStrings[index] - } - + + Notes Position + + + + +
+
+
+
+
- - @foreach (var item in Enum.GetValues()) - { - - } - + + + + @if (isSavingOptions) + { + + Saving... + } + else + { + + Save + } + + - - @for (uint i = 0; i < 19; i++) - { - var index = i; - @toneStrings[index] - } - - - - Notes Position - -
-
-
- - - - - - - - - - @if (isSavingOptions) - { - - Saving... - } - else - { - - Save - } - - - - + - - @code { - private bool EnterTextDirectly; - } } \ No newline at end of file diff --git a/TaikoWebUI/Pages/Profile.razor.cs b/TaikoWebUI/Pages/Profile.razor.cs index 9c37a68..f3e1fda 100644 --- a/TaikoWebUI/Pages/Profile.razor.cs +++ b/TaikoWebUI/Pages/Profile.razor.cs @@ -11,8 +11,10 @@ public partial class Profile private UserSetting? response; private bool isSavingOptions; + + private bool enterTextDirectly; - public string[] costumeColors = + private static readonly string[] CostumeColors = { "#F84828", "#68C0C0", "#DC1500", "#F8F0E0", "#009687", "#00BF87", "#00FF9A", "#66FFC2", "#FFFFFF", "#690000", "#FF0000", "#FF6666", @@ -27,16 +29,16 @@ public partial class Profile "#FF66BF", "#FFB3DF", "#000000" }; - private readonly string[] speedStrings = + private static readonly string[] SpeedStrings = { "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "2.0", "2.5", "3.0", "3.5", "4.0" }; - private readonly string[] notePositionStrings = { "-5", "-4", "-3", "-2", "-1", "0", "+1", "+2", "+3", "+4", "+5" }; + private static readonly string[] NotePositionStrings = { "-5", "-4", "-3", "-2", "-1", "0", "+1", "+2", "+3", "+4", "+5" }; - private readonly string[] toneStrings = + private static readonly string[] ToneStrings = { "Taiko", "Festival", "Dogs & Cats", "Deluxe", "Drumset", "Tambourine", "Don Wada", "Clapping", @@ -45,13 +47,13 @@ public partial class Profile "Synth Drum", "Shuriken", "Bubble Pop", "Electric Guitar" }; - private readonly string[] titlePlateStrings = + private static readonly string[] TitlePlateStrings = { "Wood", "Rainbow", "Gold", "Purple", "AI 1", "AI 2", "AI 3", "AI 4" }; - private List breadcrumbs = new() + private readonly List breadcrumbs = new() { new BreadcrumbItem("Cards", href: "/Cards"), }; @@ -73,15 +75,12 @@ public partial class Profile isSavingOptions = false; } +#pragma warning disable CS1998 private async Task> SearchForTitle(string value) +#pragma warning restore CS1998 { - var titles = GameDataService.titleMap; + var titles = GameDataService.GetTitles(); - if (string.IsNullOrWhiteSpace(value)) - { - return titles.Values; - } - - return titles.Values.Where(x => x.Contains(value, StringComparison.OrdinalIgnoreCase)); + return string.IsNullOrWhiteSpace(value) ? titles : titles.Where(x => x.Contains(value, StringComparison.OrdinalIgnoreCase)); } } \ No newline at end of file diff --git a/TaikoWebUI/Services/GameDataService.cs b/TaikoWebUI/Services/GameDataService.cs index c30d6bf..c1a3527 100644 --- a/TaikoWebUI/Services/GameDataService.cs +++ b/TaikoWebUI/Services/GameDataService.cs @@ -11,23 +11,15 @@ public class GameDataService : IGameDataService private readonly Dictionary musicMap = new(); - private ImmutableDictionary danMap = null!; + private ImmutableDictionary danMap = ImmutableDictionary.Empty; + + private ImmutableHashSet titles = ImmutableHashSet.Empty; - public const int COSTUME_HEAD_MAX = 140; - public const int COSTUME_FACE_MAX = 58; - public const int COSTUME_BODY_MAX = 156; - public const int COSTUME_KIGURUMI_MAX = 154; - public const int COSTUME_PUCHI_MAX = 129; - public const int COSTUME_COLOR_MAX = 63; - public const int PLAYER_TITLE_MAX = 750; - - public static string[] headMap = new string[COSTUME_HEAD_MAX]; - public static string[] faceMap = new string[COSTUME_FACE_MAX]; - public static string[] bodyMap = new string[COSTUME_BODY_MAX]; - public static string[] kigurumiMap = new string[COSTUME_KIGURUMI_MAX]; - public static string[] puchiMap = new string[COSTUME_PUCHI_MAX]; - - public static Dictionary titleMap = new(); + private readonly string[] headTitles = new string[Constants.COSTUME_HEAD_MAX]; + private readonly string[] faceTitles = new string[Constants.COSTUME_FACE_MAX]; + private readonly string[] bodyTitles = new string[Constants.COSTUME_BODY_MAX]; + private readonly string[] kigurumiMTitles = new string[Constants.COSTUME_KIGURUMI_MAX]; + private readonly string[] puchiTitles = new string[Constants.COSTUME_PUCHI_MAX]; public GameDataService(HttpClient client) { @@ -51,6 +43,88 @@ public class GameDataService : IGameDataService // To prevent duplicate entries in wordlist var dict = wordList.WordListEntries.GroupBy(entry => entry.Key) .ToImmutableDictionary(group => group.Key, group => group.First()); + await Task.Run(()=>InitializeMusicMap(musicInfo, dict, musicOrder)); + + await Task.Run(() => InitializeHeadTitles(dict)); + await Task.Run(() => InitializeFaceTitles(dict)); + await Task.Run(() => InitializeBodyTitles(dict)); + await Task.Run(() => InitializePuchiTitles(dict)); + await Task.Run(() => InitializeKigurumiTitles(dict)); + await Task.Run(() => InitializeTitles(dict)); + } + + private void InitializeTitles(ImmutableDictionary dict) + { + var set = ImmutableHashSet.CreateBuilder(); + for (var i = 1; i < Constants.PLAYER_TITLE_MAX; i++) + { + var key = $"syougou_{i}"; + + var titleWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); + + set.Add(titleWordlistItem.JapaneseText); + } + + titles = set.ToImmutable(); + } + + private void InitializePuchiTitles(ImmutableDictionary dict) + { + for (var i = 0; i < Constants.COSTUME_PUCHI_MAX; i++) + { + var key = $"costume_puchi_{i}"; + + var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); + puchiTitles[i] = costumeWordlistItem.JapaneseText; + } + } + + private void InitializeKigurumiTitles(ImmutableDictionary dict) + { + for (var i = 0; i < Constants.COSTUME_KIGURUMI_MAX; i++) + { + var key = $"costume_kigurumi_{i}"; + + var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); + kigurumiMTitles[i] = costumeWordlistItem.JapaneseText; + } + } + + private void InitializeBodyTitles(ImmutableDictionary dict) + { + for (var i = 0; i < Constants.COSTUME_BODY_MAX; i++) + { + var key = $"costume_body_{i}"; + + var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); + bodyTitles[i] = costumeWordlistItem.JapaneseText; + } + } + + private void InitializeFaceTitles(ImmutableDictionary dict) + { + for (var i = 0; i < Constants.COSTUME_FACE_MAX; i++) + { + var key = $"costume_face_{i}"; + + var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); + faceTitles[i] = costumeWordlistItem.JapaneseText; + } + } + + private void InitializeHeadTitles(ImmutableDictionary dict) + { + for (var i = 0; i < Constants.COSTUME_HEAD_MAX; i++) + { + var key = $"costume_head_{i}"; + + var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); + headTitles[i] = costumeWordlistItem.JapaneseText; + } + } + + private void InitializeMusicMap(MusicInfo musicInfo, ImmutableDictionary dict, MusicOrder musicOrder) + { foreach (var music in musicInfo.Items) { var songNameKey = $"song_{music.Id}"; @@ -76,67 +150,6 @@ public class GameDataService : IGameDataService musicMap[songId].Index = index; } } - - for (var i = 0; i < COSTUME_HEAD_MAX; i++) - { - var index = i; - var key = $"costume_head_{index}"; - - var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); - headMap[index] = costumeWordlistItem.JapaneseText; - } - - for (var i = 0; i < COSTUME_FACE_MAX; i++) - { - var index = i; - var key = $"costume_face_{index}"; - - var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); - faceMap[index] = costumeWordlistItem.JapaneseText; - } - - for (var i = 0; i < COSTUME_BODY_MAX; i++) - { - var index = i; - var key = $"costume_body_{index}"; - - var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); - bodyMap[index] = costumeWordlistItem.JapaneseText; - } - - for (var i = 0; i < COSTUME_KIGURUMI_MAX; i++) - { - var index = i; - var key = $"costume_kigurumi_{index}"; - - var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); - kigurumiMap[index] = costumeWordlistItem.JapaneseText; - } - - for (var i = 0; i < COSTUME_PUCHI_MAX; i++) - { - var index = i; - var key = $"costume_puchi_{index}"; - - var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); - puchiMap[index] = costumeWordlistItem.JapaneseText; - } - - for (var i = 1; i < PLAYER_TITLE_MAX; i++) - { - var index = i; - var key = $"syougou_{index}"; - - var titleWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); - - // prevent duplicate values with different keys - if (titleMap.ContainsValue(titleWordlistItem.JapaneseText)) - { - continue; - } - - titleMap.TryAdd(index, titleWordlistItem.JapaneseText); - } } public string GetMusicNameBySongId(uint songId) @@ -176,4 +189,34 @@ public class GameDataService : IGameDataService _ => throw new ArgumentOutOfRangeException(nameof(difficulty), difficulty, null) }; } + + public string GetHeadTitle(uint index) + { + return index < headTitles.Length ? headTitles[index] : string.Empty; + } + + public string GetKigurumiTitle(uint index) + { + return index < kigurumiMTitles.Length ? kigurumiMTitles[index] : string.Empty; + } + + public string GetBodyTitle(uint index) + { + return index < bodyTitles.Length ? bodyTitles[index] : string.Empty; + } + + public string GetFaceTitle(uint index) + { + return index < faceTitles.Length ? faceTitles[index] : string.Empty; + } + + public string GetPuchiTitle(uint index) + { + return index < puchiTitles.Length ? puchiTitles[index] : string.Empty; + } + + public IEnumerable GetTitles() + { + return titles.ToArray(); + } } \ No newline at end of file diff --git a/TaikoWebUI/Services/IGameDataService.cs b/TaikoWebUI/Services/IGameDataService.cs index fbad860..95eb397 100644 --- a/TaikoWebUI/Services/IGameDataService.cs +++ b/TaikoWebUI/Services/IGameDataService.cs @@ -1,4 +1,6 @@ -namespace TaikoWebUI.Services; +using System.Collections.Immutable; + +namespace TaikoWebUI.Services; public interface IGameDataService { @@ -15,4 +17,12 @@ public interface IGameDataService public DanData GetDanDataById(uint danId); public int GetMusicStarLevel(uint songId, Difficulty difficulty); + + public string GetHeadTitle(uint index); + public string GetKigurumiTitle(uint index); + public string GetBodyTitle(uint index); + public string GetFaceTitle(uint index); + public string GetPuchiTitle(uint index); + + public IEnumerable GetTitles(); } \ No newline at end of file diff --git a/TaikoWebUI/Shared/Constants.cs b/TaikoWebUI/Shared/Constants.cs new file mode 100644 index 0000000..47eb065 --- /dev/null +++ b/TaikoWebUI/Shared/Constants.cs @@ -0,0 +1,12 @@ +namespace TaikoWebUI.Shared; + +public static class Constants +{ + public const int COSTUME_HEAD_MAX = 140; + public const int COSTUME_FACE_MAX = 58; + public const int COSTUME_BODY_MAX = 156; + public const int COSTUME_KIGURUMI_MAX = 154; + public const int COSTUME_PUCHI_MAX = 129; + public const int COSTUME_COLOR_MAX = 63; + public const int PLAYER_TITLE_MAX = 750; +} \ No newline at end of file