From 8b56689822badda2babd6920bc7de4676bf583d7 Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Sat, 9 Sep 2023 21:58:20 +0900 Subject: [PATCH 01/49] initial commit --- .gitignore | 399 ++ GameDatabase/Context/TaikoDbContext.cs | 121 + GameDatabase/Context/TaikoDbContextPartial.cs | 63 + GameDatabase/Entities/AiScoreDatum.cs | 18 + GameDatabase/Entities/AiSectionScoreDatum.cs | 30 + GameDatabase/Entities/Card.cs | 8 + GameDatabase/Entities/DanScoreDatum.cs | 16 + GameDatabase/Entities/DanStageScoreDatum.cs | 28 + GameDatabase/Entities/SongBestDatum.cs | 17 + GameDatabase/Entities/SongBestDatumMethods.cs | 29 + GameDatabase/Entities/SongPlayDatum.cs | 29 + GameDatabase/Entities/UserDatum.cs | 34 + GameDatabase/GameDatabase.csproj | 22 + .../20220825070549_Initial.Designer.cs | 222 ++ .../Migrations/20220825070549_Initial.cs | 143 + .../20220827163841_FirstMigration.Designer.cs | 225 ++ .../20220827163841_FirstMigration.cs | 29 + .../20220828101620_AddDanDbTest.Designer.cs | 322 ++ .../Migrations/20220828101620_AddDanDbTest.cs | 79 + .../20220828171353_AddClearState.Designer.cs | 327 ++ .../20220828171353_AddClearState.cs | 29 + .../20220829101052_AdjustDanDb.Designer.cs | 332 ++ .../Migrations/20220829101052_AdjustDanDb.cs | 79 + .../20220829124927_FixNavigation.Designer.cs | 320 ++ .../20220829124927_FixNavigation.cs | 58 + .../20220905132703_AddMoreOptions.Designer.cs | 326 ++ .../20220905132703_AddMoreOptions.cs | 40 + ...0220910055624_AddDrumrollCount.Designer.cs | 329 ++ .../20220910055624_AddDrumrollCount.cs | 29 + .../20220914054039_AddRewardFlgs.Designer.cs | 341 ++ .../20220914054039_AddRewardFlgs.cs | 51 + ...220916121143_AddGenericInfoFlg.Designer.cs | 345 ++ .../20220916121143_AddGenericInfoFlg.cs | 29 + .../20220917180457_AddAiBattle.Designer.cs | 432 +++ .../Migrations/20220917180457_AddAiBattle.cs | 71 + ...19022643_AddWinCountToUserdata.Designer.cs | 435 +++ .../20220919022643_AddWinCountToUserdata.cs | 29 + .../Migrations/TaikoDbContextModelSnapshot.cs | 432 +++ .../DateTimeConverter.cs | 22 + .../LocalSaveModScoreMigrator.csproj | 27 + LocalSaveModScoreMigrator/MusicInfo.cs | 8 + LocalSaveModScoreMigrator/MusicInfoEntry.cs | 10 + LocalSaveModScoreMigrator/PlayRecordJson.cs | 21 + LocalSaveModScoreMigrator/Program.cs | 196 + .../ScoreRankConverter.cs | 22 + OldSetup.md | 95 + README.md | 46 + SharedProject/Enums/CrownType.cs | 9 + SharedProject/Enums/DanBorderType.cs | 7 + SharedProject/Enums/DanClearState.cs | 12 + SharedProject/Enums/DanConditionType.cs | 13 + SharedProject/Enums/Difficulty.cs | 12 + SharedProject/Enums/PlayMode.cs | 9 + SharedProject/Enums/RandomType.cs | 9 + SharedProject/Enums/ScoreRank.cs | 13 + SharedProject/Enums/SongGenre.cs | 13 + SharedProject/Models/AiSectionBestData.cs | 22 + SharedProject/Models/DanBestData.cs | 16 + SharedProject/Models/DanBestStageData.cs | 22 + SharedProject/Models/DanData.cs | 66 + SharedProject/Models/EventFolderData.cs | 18 + SharedProject/Models/PlaySetting.cs | 14 + .../Models/Requests/SetFavoriteRequest.cs | 8 + .../Models/Responses/DanBestDataResponse.cs | 6 + .../Models/Responses/DashboardResponse.cs | 6 + .../Models/Responses/SongBestResponse.cs | 6 + SharedProject/Models/SongBestData.cs | 49 + SharedProject/Models/SongIntroductionData.cs | 18 + SharedProject/Models/User.cs | 8 + SharedProject/Models/UserSetting.cs | 55 + SharedProject/README.md | 3 + SharedProject/SharedProject.csproj | 13 + SharedProject/Utils/PathHelper.cs | 24 + SharedProject/Utils/PlaySettingConverter.cs | 48 + SharedProject/Utils/ValueHelpers.cs | 14 + TaikoLocalServer.sln | 49 + TaikoLocalServer.sln.DotSettings | 6 + TaikoLocalServer/.config/dotnet-tools.json | 12 + TaikoLocalServer/.gitignore | 1 + TaikoLocalServer/Certificates/cert.pfx | Bin 0 -> 2781 bytes TaikoLocalServer/Certificates/root.pfx | Bin 0 -> 2653 bytes TaikoLocalServer/Common/Constants.cs | 48 + TaikoLocalServer/Common/OrderedSet.cs | 73 + TaikoLocalServer/Common/Utils/Extensions.cs | 24 + .../Common/Utils/FlagCalculator.cs | 129 + .../Common/Utils/FormOutputUtil.cs | 20 + .../Common/Utils/GZipBytesUtil.cs | 61 + TaikoLocalServer/Common/Utils/JsonHelper.cs | 53 + .../Common/Utils/ObjectMappers.cs | 26 + .../Configurations/DataSettings.json | 7 + TaikoLocalServer/Configurations/Database.json | 3 + TaikoLocalServer/Configurations/Kestrel.json | 28 + TaikoLocalServer/Configurations/Logging.json | 27 + .../Configurations/ServerSettings.json | 7 + .../Controllers/AmAuth/PowerOnController.cs | 50 + .../Controllers/AmUpdater/MuchaController.cs | 87 + .../Controllers/Api/CardsController.cs | 22 + .../Controllers/Api/DanBestDataController.cs | 35 + .../Controllers/Api/DashboardController.cs | 26 + .../Api/FavoriteSongsController.cs | 29 + .../Controllers/Api/PlayDataController.cs | 55 + .../Controllers/Api/UserSettingsController.cs | 103 + .../Controllers/BaseController.cs | 8 + .../Game/AddTokenCountController.cs | 20 + .../Controllers/Game/BaidController.cs | 186 + .../Controllers/Game/BookkeepingController.cs | 21 + .../Game/ChallengeCompetitionController.cs | 21 + .../Controllers/Game/CrownsDataController.cs | 59 + .../Game/ExecuteQrCodeController.cs | 21 + .../Controllers/Game/GetAiDataController.cs | 34 + .../Controllers/Game/GetAiScoreController.cs | 106 + .../Game/GetApplicationUrlController.cs | 23 + .../Controllers/Game/GetDanOdaiController.cs | 44 + .../Controllers/Game/GetDanScoreController.cs | 50 + .../Controllers/Game/GetFolderController.cs | 38 + .../Game/GetScoreRankController.cs | 59 + .../Game/GetShopFolderController.cs | 28 + .../Game/GetSongIntroductionController.cs | 39 + .../Controllers/Game/GetTelopController.cs | 27 + .../Game/GetTokenCountController.cs | 26 + .../Controllers/Game/Headclerk2Controller.cs | 19 + .../Controllers/Game/HeartbeatController.cs | 20 + .../Game/InitialDataCheckController.cs | 46 + .../Controllers/Game/MyDonEntryController.cs | 60 + .../Controllers/Game/PlayResultController.cs | 387 ++ .../Controllers/Game/RewardItemController.cs | 20 + .../Controllers/Game/SelfBestController.cs | 81 + .../Game/SongPurchaseController.cs | 21 + .../Controllers/Game/StartupAuthController.cs | 28 + .../Game/TournamentCheckController.cs | 20 + .../Controllers/Game/UserDataController.cs | 133 + .../Game/VerifyQrCodeController.cs | 21 + TaikoLocalServer/GlobalUsings.cs | 12 + .../Middlewares/AllNetRequestMiddleware.cs | 59 + TaikoLocalServer/Models/Game.cs | 3228 +++++++++++++++++ .../Models/MuchaBoardAuthRequest.cs | 38 + .../Models/MuchaUpdateCheckRequest.cs | 22 + .../Models/MusicAttributeEntry.cs | 12 + TaikoLocalServer/Models/MusicAttributes.cs | 9 + TaikoLocalServer/Models/MusicInfoEntry.cs | 12 + TaikoLocalServer/Models/MusicInfoes.cs | 9 + TaikoLocalServer/Models/PowerOnRequest.cs | 31 + TaikoLocalServer/Models/VsInterface.cs | 257 ++ TaikoLocalServer/Program.cs | 137 + .../Properties/launchSettings.json | 31 + TaikoLocalServer/README.md | 7 + TaikoLocalServer/Services/AiDatumService.cs | 51 + TaikoLocalServer/Services/CardService.cs | 52 + .../Services/DanScoreDatumService.cs | 42 + .../Services/Extentions/ServiceExtensions.cs | 16 + TaikoLocalServer/Services/GameDataService.cs | 226 ++ .../Services/Interfaces/IAiDatumService.cs | 14 + .../Services/Interfaces/ICardService.cs | 17 + .../Interfaces/IDanScoreDatumService.cs | 12 + .../Services/Interfaces/IGameDataService.cs | 23 + .../Interfaces/ISongBestDatumService.cs | 13 + .../Interfaces/ISongPlayDatumService.cs | 10 + .../Services/Interfaces/IUserDatumService.cs | 24 + .../Services/SongBestDatumService.cs | 87 + .../Services/SongPlayDatumService.cs | 25 + TaikoLocalServer/Services/UserDatumService.cs | 118 + TaikoLocalServer/Settings/DataSettings.cs | 10 + TaikoLocalServer/Settings/ServerSettings.cs | 10 + TaikoLocalServer/TaikoLocalServer.csproj | 87 + TaikoLocalServer/appsettings.json | 3 + TaikoLocalServer/wwwroot/data/dan_data.json | 938 +++++ .../wwwroot/data/event_folder_data.json | 84 + TaikoLocalServer/wwwroot/data/intro_data.json | 74 + TaikoWebUI/.gitignore | 1 + TaikoWebUI/App.razor | 11 + TaikoWebUI/GlobalUsings.cs | 14 + TaikoWebUI/Pages/Cards.razor | 88 + TaikoWebUI/Pages/Cards.razor.cs | 33 + TaikoWebUI/Pages/DaniDojo.razor | 472 +++ TaikoWebUI/Pages/DaniDojo.razor.cs | 229 ++ TaikoWebUI/Pages/Dashboard.razor | 7 + .../Dialogs/CardDeleteConfirmDialog.razor | 23 + .../Dialogs/CardDeleteConfirmDialog.razor.cs | 28 + .../Pages/Dialogs/ChooseTitleDialog.razor | 105 + TaikoWebUI/Pages/HighScores.razor | 173 + TaikoWebUI/Pages/HighScores.razor.cs | 154 + TaikoWebUI/Pages/Profile.razor | 214 ++ TaikoWebUI/Pages/Profile.razor.cs | 96 + TaikoWebUI/Program.cs | 20 + TaikoWebUI/Properties/launchSettings.json | 30 + TaikoWebUI/README.md | 5 + TaikoWebUI/Services/GameDataService.cs | 257 ++ TaikoWebUI/Services/IGameDataService.cs | 29 + TaikoWebUI/Shared/Constants.cs | 16 + TaikoWebUI/Shared/MainLayout.razor | 36 + TaikoWebUI/Shared/Models/MusicDetail.cs | 24 + TaikoWebUI/Shared/Models/MusicInfo.cs | 9 + TaikoWebUI/Shared/Models/MusicInfoEntry.cs | 30 + TaikoWebUI/Shared/Models/MusicOrder.cs | 9 + TaikoWebUI/Shared/Models/MusicOrderEntry.cs | 9 + TaikoWebUI/Shared/Models/Title.cs | 23 + TaikoWebUI/Shared/Models/WordList.cs | 9 + TaikoWebUI/Shared/Models/WordListEntry.cs | 21 + TaikoWebUI/Shared/NavMenu.razor | 4 + TaikoWebUI/TaikoWebUI.csproj | 51 + TaikoWebUI/TaikoWebUI.sln | 25 + TaikoWebUI/_Imports.razor | 17 + TaikoWebUI/wwwroot/favicon.ico | Bin 0 -> 15086 bytes TaikoWebUI/wwwroot/images/ai_Lose.png | Bin 0 -> 16298 bytes TaikoWebUI/wwwroot/images/ai_Win.png | Bin 0 -> 15885 bytes TaikoWebUI/wwwroot/images/ai_crown_Clear.png | Bin 0 -> 4582 bytes .../wwwroot/images/ai_crown_Dondaful.png | Bin 0 -> 4577 bytes TaikoWebUI/wwwroot/images/ai_crown_Gold.png | Bin 0 -> 4630 bytes TaikoWebUI/wwwroot/images/ai_crown_None.png | Bin 0 -> 3577 bytes TaikoWebUI/wwwroot/images/crown_Clear.png | Bin 0 -> 7739 bytes TaikoWebUI/wwwroot/images/crown_Dondaful.png | Bin 0 -> 9571 bytes TaikoWebUI/wwwroot/images/crown_Gold.png | Bin 0 -> 8994 bytes TaikoWebUI/wwwroot/images/crown_None.png | Bin 0 -> 6865 bytes .../images/dani_GoldFullComboClear.png | Bin 0 -> 64624 bytes .../wwwroot/images/dani_GoldNormalClear.png | Bin 0 -> 59821 bytes .../wwwroot/images/dani_GoldPerfectClear.png | Bin 0 -> 63372 bytes TaikoWebUI/wwwroot/images/dani_NotClear.png | Bin 0 -> 11505 bytes .../wwwroot/images/dani_RedFullComboClear.png | Bin 0 -> 66372 bytes .../wwwroot/images/dani_RedNormalClear.png | Bin 0 -> 61721 bytes .../wwwroot/images/dani_RedPerfectClear.png | Bin 0 -> 65404 bytes TaikoWebUI/wwwroot/images/difficulty_Easy.png | Bin 0 -> 7588 bytes TaikoWebUI/wwwroot/images/difficulty_Hard.png | Bin 0 -> 9091 bytes .../wwwroot/images/difficulty_Normal.png | Bin 0 -> 7722 bytes TaikoWebUI/wwwroot/images/difficulty_Oni.png | Bin 0 -> 9648 bytes .../wwwroot/images/difficulty_UraOni.png | Bin 0 -> 9564 bytes TaikoWebUI/wwwroot/images/rank_Bronze.png | Bin 0 -> 15663 bytes TaikoWebUI/wwwroot/images/rank_Dondaful.png | Bin 0 -> 17384 bytes TaikoWebUI/wwwroot/images/rank_Gold.png | Bin 0 -> 16726 bytes TaikoWebUI/wwwroot/images/rank_Purple.png | Bin 0 -> 20518 bytes TaikoWebUI/wwwroot/images/rank_Sakura.png | Bin 0 -> 18797 bytes TaikoWebUI/wwwroot/images/rank_Silver.png | Bin 0 -> 16477 bytes TaikoWebUI/wwwroot/images/rank_White.png | Bin 0 -> 11114 bytes TaikoWebUI/wwwroot/index.html | 26 + TaikoWebUI/wwwroot/style.overrides.css | 51 + 234 files changed, 17624 insertions(+) create mode 100644 .gitignore create mode 100644 GameDatabase/Context/TaikoDbContext.cs create mode 100644 GameDatabase/Context/TaikoDbContextPartial.cs create mode 100644 GameDatabase/Entities/AiScoreDatum.cs create mode 100644 GameDatabase/Entities/AiSectionScoreDatum.cs create mode 100644 GameDatabase/Entities/Card.cs create mode 100644 GameDatabase/Entities/DanScoreDatum.cs create mode 100644 GameDatabase/Entities/DanStageScoreDatum.cs create mode 100644 GameDatabase/Entities/SongBestDatum.cs create mode 100644 GameDatabase/Entities/SongBestDatumMethods.cs create mode 100644 GameDatabase/Entities/SongPlayDatum.cs create mode 100644 GameDatabase/Entities/UserDatum.cs create mode 100644 GameDatabase/GameDatabase.csproj create mode 100644 GameDatabase/Migrations/20220825070549_Initial.Designer.cs create mode 100644 GameDatabase/Migrations/20220825070549_Initial.cs create mode 100644 GameDatabase/Migrations/20220827163841_FirstMigration.Designer.cs create mode 100644 GameDatabase/Migrations/20220827163841_FirstMigration.cs create mode 100644 GameDatabase/Migrations/20220828101620_AddDanDbTest.Designer.cs create mode 100644 GameDatabase/Migrations/20220828101620_AddDanDbTest.cs create mode 100644 GameDatabase/Migrations/20220828171353_AddClearState.Designer.cs create mode 100644 GameDatabase/Migrations/20220828171353_AddClearState.cs create mode 100644 GameDatabase/Migrations/20220829101052_AdjustDanDb.Designer.cs create mode 100644 GameDatabase/Migrations/20220829101052_AdjustDanDb.cs create mode 100644 GameDatabase/Migrations/20220829124927_FixNavigation.Designer.cs create mode 100644 GameDatabase/Migrations/20220829124927_FixNavigation.cs create mode 100644 GameDatabase/Migrations/20220905132703_AddMoreOptions.Designer.cs create mode 100644 GameDatabase/Migrations/20220905132703_AddMoreOptions.cs create mode 100644 GameDatabase/Migrations/20220910055624_AddDrumrollCount.Designer.cs create mode 100644 GameDatabase/Migrations/20220910055624_AddDrumrollCount.cs create mode 100644 GameDatabase/Migrations/20220914054039_AddRewardFlgs.Designer.cs create mode 100644 GameDatabase/Migrations/20220914054039_AddRewardFlgs.cs create mode 100644 GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.Designer.cs create mode 100644 GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.cs create mode 100644 GameDatabase/Migrations/20220917180457_AddAiBattle.Designer.cs create mode 100644 GameDatabase/Migrations/20220917180457_AddAiBattle.cs create mode 100644 GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.Designer.cs create mode 100644 GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.cs create mode 100644 GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs create mode 100644 LocalSaveModScoreMigrator/DateTimeConverter.cs create mode 100644 LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj create mode 100644 LocalSaveModScoreMigrator/MusicInfo.cs create mode 100644 LocalSaveModScoreMigrator/MusicInfoEntry.cs create mode 100644 LocalSaveModScoreMigrator/PlayRecordJson.cs create mode 100644 LocalSaveModScoreMigrator/Program.cs create mode 100644 LocalSaveModScoreMigrator/ScoreRankConverter.cs create mode 100644 OldSetup.md create mode 100644 README.md create mode 100644 SharedProject/Enums/CrownType.cs create mode 100644 SharedProject/Enums/DanBorderType.cs create mode 100644 SharedProject/Enums/DanClearState.cs create mode 100644 SharedProject/Enums/DanConditionType.cs create mode 100644 SharedProject/Enums/Difficulty.cs create mode 100644 SharedProject/Enums/PlayMode.cs create mode 100644 SharedProject/Enums/RandomType.cs create mode 100644 SharedProject/Enums/ScoreRank.cs create mode 100644 SharedProject/Enums/SongGenre.cs create mode 100644 SharedProject/Models/AiSectionBestData.cs create mode 100644 SharedProject/Models/DanBestData.cs create mode 100644 SharedProject/Models/DanBestStageData.cs create mode 100644 SharedProject/Models/DanData.cs create mode 100644 SharedProject/Models/EventFolderData.cs create mode 100644 SharedProject/Models/PlaySetting.cs create mode 100644 SharedProject/Models/Requests/SetFavoriteRequest.cs create mode 100644 SharedProject/Models/Responses/DanBestDataResponse.cs create mode 100644 SharedProject/Models/Responses/DashboardResponse.cs create mode 100644 SharedProject/Models/Responses/SongBestResponse.cs create mode 100644 SharedProject/Models/SongBestData.cs create mode 100644 SharedProject/Models/SongIntroductionData.cs create mode 100644 SharedProject/Models/User.cs create mode 100644 SharedProject/Models/UserSetting.cs create mode 100644 SharedProject/README.md create mode 100644 SharedProject/SharedProject.csproj create mode 100644 SharedProject/Utils/PathHelper.cs create mode 100644 SharedProject/Utils/PlaySettingConverter.cs create mode 100644 SharedProject/Utils/ValueHelpers.cs create mode 100644 TaikoLocalServer.sln create mode 100644 TaikoLocalServer.sln.DotSettings create mode 100644 TaikoLocalServer/.config/dotnet-tools.json create mode 100644 TaikoLocalServer/.gitignore create mode 100644 TaikoLocalServer/Certificates/cert.pfx create mode 100644 TaikoLocalServer/Certificates/root.pfx create mode 100644 TaikoLocalServer/Common/Constants.cs create mode 100644 TaikoLocalServer/Common/OrderedSet.cs create mode 100644 TaikoLocalServer/Common/Utils/Extensions.cs create mode 100644 TaikoLocalServer/Common/Utils/FlagCalculator.cs create mode 100644 TaikoLocalServer/Common/Utils/FormOutputUtil.cs create mode 100644 TaikoLocalServer/Common/Utils/GZipBytesUtil.cs create mode 100644 TaikoLocalServer/Common/Utils/JsonHelper.cs create mode 100644 TaikoLocalServer/Common/Utils/ObjectMappers.cs create mode 100644 TaikoLocalServer/Configurations/DataSettings.json create mode 100644 TaikoLocalServer/Configurations/Database.json create mode 100644 TaikoLocalServer/Configurations/Kestrel.json create mode 100644 TaikoLocalServer/Configurations/Logging.json create mode 100644 TaikoLocalServer/Configurations/ServerSettings.json create mode 100644 TaikoLocalServer/Controllers/AmAuth/PowerOnController.cs create mode 100644 TaikoLocalServer/Controllers/AmUpdater/MuchaController.cs create mode 100644 TaikoLocalServer/Controllers/Api/CardsController.cs create mode 100644 TaikoLocalServer/Controllers/Api/DanBestDataController.cs create mode 100644 TaikoLocalServer/Controllers/Api/DashboardController.cs create mode 100644 TaikoLocalServer/Controllers/Api/FavoriteSongsController.cs create mode 100644 TaikoLocalServer/Controllers/Api/PlayDataController.cs create mode 100644 TaikoLocalServer/Controllers/Api/UserSettingsController.cs create mode 100644 TaikoLocalServer/Controllers/BaseController.cs create mode 100644 TaikoLocalServer/Controllers/Game/AddTokenCountController.cs create mode 100644 TaikoLocalServer/Controllers/Game/BaidController.cs create mode 100644 TaikoLocalServer/Controllers/Game/BookkeepingController.cs create mode 100644 TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs create mode 100644 TaikoLocalServer/Controllers/Game/CrownsDataController.cs create mode 100644 TaikoLocalServer/Controllers/Game/ExecuteQrCodeController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetAiDataController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetAiScoreController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetApplicationUrlController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetDanScoreController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetFolderController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetScoreRankController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetShopFolderController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetSongIntroductionController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetTelopController.cs create mode 100644 TaikoLocalServer/Controllers/Game/GetTokenCountController.cs create mode 100644 TaikoLocalServer/Controllers/Game/Headclerk2Controller.cs create mode 100644 TaikoLocalServer/Controllers/Game/HeartbeatController.cs create mode 100644 TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs create mode 100644 TaikoLocalServer/Controllers/Game/MyDonEntryController.cs create mode 100644 TaikoLocalServer/Controllers/Game/PlayResultController.cs create mode 100644 TaikoLocalServer/Controllers/Game/RewardItemController.cs create mode 100644 TaikoLocalServer/Controllers/Game/SelfBestController.cs create mode 100644 TaikoLocalServer/Controllers/Game/SongPurchaseController.cs create mode 100644 TaikoLocalServer/Controllers/Game/StartupAuthController.cs create mode 100644 TaikoLocalServer/Controllers/Game/TournamentCheckController.cs create mode 100644 TaikoLocalServer/Controllers/Game/UserDataController.cs create mode 100644 TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs create mode 100644 TaikoLocalServer/GlobalUsings.cs create mode 100644 TaikoLocalServer/Middlewares/AllNetRequestMiddleware.cs create mode 100644 TaikoLocalServer/Models/Game.cs create mode 100644 TaikoLocalServer/Models/MuchaBoardAuthRequest.cs create mode 100644 TaikoLocalServer/Models/MuchaUpdateCheckRequest.cs create mode 100644 TaikoLocalServer/Models/MusicAttributeEntry.cs create mode 100644 TaikoLocalServer/Models/MusicAttributes.cs create mode 100644 TaikoLocalServer/Models/MusicInfoEntry.cs create mode 100644 TaikoLocalServer/Models/MusicInfoes.cs create mode 100644 TaikoLocalServer/Models/PowerOnRequest.cs create mode 100644 TaikoLocalServer/Models/VsInterface.cs create mode 100644 TaikoLocalServer/Program.cs create mode 100644 TaikoLocalServer/Properties/launchSettings.json create mode 100644 TaikoLocalServer/README.md create mode 100644 TaikoLocalServer/Services/AiDatumService.cs create mode 100644 TaikoLocalServer/Services/CardService.cs create mode 100644 TaikoLocalServer/Services/DanScoreDatumService.cs create mode 100644 TaikoLocalServer/Services/Extentions/ServiceExtensions.cs create mode 100644 TaikoLocalServer/Services/GameDataService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/IAiDatumService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/ICardService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/IDanScoreDatumService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/IGameDataService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/ISongBestDatumService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/ISongPlayDatumService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/IUserDatumService.cs create mode 100644 TaikoLocalServer/Services/SongBestDatumService.cs create mode 100644 TaikoLocalServer/Services/SongPlayDatumService.cs create mode 100644 TaikoLocalServer/Services/UserDatumService.cs create mode 100644 TaikoLocalServer/Settings/DataSettings.cs create mode 100644 TaikoLocalServer/Settings/ServerSettings.cs create mode 100644 TaikoLocalServer/TaikoLocalServer.csproj create mode 100644 TaikoLocalServer/appsettings.json create mode 100644 TaikoLocalServer/wwwroot/data/dan_data.json create mode 100644 TaikoLocalServer/wwwroot/data/event_folder_data.json create mode 100644 TaikoLocalServer/wwwroot/data/intro_data.json create mode 100644 TaikoWebUI/.gitignore create mode 100644 TaikoWebUI/App.razor create mode 100644 TaikoWebUI/GlobalUsings.cs create mode 100644 TaikoWebUI/Pages/Cards.razor create mode 100644 TaikoWebUI/Pages/Cards.razor.cs create mode 100644 TaikoWebUI/Pages/DaniDojo.razor create mode 100644 TaikoWebUI/Pages/DaniDojo.razor.cs create mode 100644 TaikoWebUI/Pages/Dashboard.razor create mode 100644 TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor create mode 100644 TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor.cs create mode 100644 TaikoWebUI/Pages/Dialogs/ChooseTitleDialog.razor create mode 100644 TaikoWebUI/Pages/HighScores.razor create mode 100644 TaikoWebUI/Pages/HighScores.razor.cs create mode 100644 TaikoWebUI/Pages/Profile.razor create mode 100644 TaikoWebUI/Pages/Profile.razor.cs create mode 100644 TaikoWebUI/Program.cs create mode 100644 TaikoWebUI/Properties/launchSettings.json create mode 100644 TaikoWebUI/README.md create mode 100644 TaikoWebUI/Services/GameDataService.cs create mode 100644 TaikoWebUI/Services/IGameDataService.cs create mode 100644 TaikoWebUI/Shared/Constants.cs create mode 100644 TaikoWebUI/Shared/MainLayout.razor create mode 100644 TaikoWebUI/Shared/Models/MusicDetail.cs create mode 100644 TaikoWebUI/Shared/Models/MusicInfo.cs create mode 100644 TaikoWebUI/Shared/Models/MusicInfoEntry.cs create mode 100644 TaikoWebUI/Shared/Models/MusicOrder.cs create mode 100644 TaikoWebUI/Shared/Models/MusicOrderEntry.cs create mode 100644 TaikoWebUI/Shared/Models/Title.cs create mode 100644 TaikoWebUI/Shared/Models/WordList.cs create mode 100644 TaikoWebUI/Shared/Models/WordListEntry.cs create mode 100644 TaikoWebUI/Shared/NavMenu.razor create mode 100644 TaikoWebUI/TaikoWebUI.csproj create mode 100644 TaikoWebUI/TaikoWebUI.sln create mode 100644 TaikoWebUI/_Imports.razor create mode 100644 TaikoWebUI/wwwroot/favicon.ico create mode 100644 TaikoWebUI/wwwroot/images/ai_Lose.png create mode 100644 TaikoWebUI/wwwroot/images/ai_Win.png create mode 100644 TaikoWebUI/wwwroot/images/ai_crown_Clear.png create mode 100644 TaikoWebUI/wwwroot/images/ai_crown_Dondaful.png create mode 100644 TaikoWebUI/wwwroot/images/ai_crown_Gold.png create mode 100644 TaikoWebUI/wwwroot/images/ai_crown_None.png create mode 100644 TaikoWebUI/wwwroot/images/crown_Clear.png create mode 100644 TaikoWebUI/wwwroot/images/crown_Dondaful.png create mode 100644 TaikoWebUI/wwwroot/images/crown_Gold.png create mode 100644 TaikoWebUI/wwwroot/images/crown_None.png create mode 100644 TaikoWebUI/wwwroot/images/dani_GoldFullComboClear.png create mode 100644 TaikoWebUI/wwwroot/images/dani_GoldNormalClear.png create mode 100644 TaikoWebUI/wwwroot/images/dani_GoldPerfectClear.png create mode 100644 TaikoWebUI/wwwroot/images/dani_NotClear.png create mode 100644 TaikoWebUI/wwwroot/images/dani_RedFullComboClear.png create mode 100644 TaikoWebUI/wwwroot/images/dani_RedNormalClear.png create mode 100644 TaikoWebUI/wwwroot/images/dani_RedPerfectClear.png create mode 100644 TaikoWebUI/wwwroot/images/difficulty_Easy.png create mode 100644 TaikoWebUI/wwwroot/images/difficulty_Hard.png create mode 100644 TaikoWebUI/wwwroot/images/difficulty_Normal.png create mode 100644 TaikoWebUI/wwwroot/images/difficulty_Oni.png create mode 100644 TaikoWebUI/wwwroot/images/difficulty_UraOni.png create mode 100644 TaikoWebUI/wwwroot/images/rank_Bronze.png create mode 100644 TaikoWebUI/wwwroot/images/rank_Dondaful.png create mode 100644 TaikoWebUI/wwwroot/images/rank_Gold.png create mode 100644 TaikoWebUI/wwwroot/images/rank_Purple.png create mode 100644 TaikoWebUI/wwwroot/images/rank_Sakura.png create mode 100644 TaikoWebUI/wwwroot/images/rank_Silver.png create mode 100644 TaikoWebUI/wwwroot/images/rank_White.png create mode 100644 TaikoWebUI/wwwroot/index.html create mode 100644 TaikoWebUI/wwwroot/style.overrides.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5332ee0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,399 @@ +/.idea/ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +TaikoLocalServer/wwwroot/data/music_attribute.bin diff --git a/GameDatabase/Context/TaikoDbContext.cs b/GameDatabase/Context/TaikoDbContext.cs new file mode 100644 index 0000000..41badab --- /dev/null +++ b/GameDatabase/Context/TaikoDbContext.cs @@ -0,0 +1,121 @@ +using GameDatabase.Entities; +using Microsoft.EntityFrameworkCore; +using SharedProject.Utils; + +namespace GameDatabase.Context +{ + public partial class TaikoDbContext : DbContext + { + private string? dbFilePath; + public TaikoDbContext() + { + } + + public TaikoDbContext(DbContextOptions options) + : base(options) + { + } + + public TaikoDbContext(string dbFilePath) + { + this.dbFilePath = dbFilePath; + } + + public virtual DbSet Cards { get; set; } = null!; + public virtual DbSet SongBestData { get; set; } = null!; + public virtual DbSet SongPlayData { get; set; } = null!; + public virtual DbSet UserData { get; set; } = null!; + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (optionsBuilder.IsConfigured) + { + return; + } + + var path = Path.Combine(PathHelper.GetRootPath(), "taiko.db3"); + if (dbFilePath is not null) + { + path = dbFilePath; + } + optionsBuilder.UseSqlite($"Data Source={path}"); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.AccessCode); + + entity.ToTable("Card"); + + entity.HasIndex(e => e.Baid, "IX_Card_Baid") + .IsUnique(); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Baid, e.SongId, e.Difficulty }); + + entity.HasOne(d => d.Ba) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + + entity.Property(e => e.Difficulty) + .HasConversion(); + + entity.Property(e => e.BestCrown) + .HasConversion(); + + entity.Property(e => e.BestScoreRank) + .HasConversion(); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + + entity.Property(e => e.Id).ValueGeneratedOnAdd(); + + entity.Property(e => e.PlayTime).HasColumnType("datetime"); + + entity.HasOne(d => d.Ba) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + + entity.Property(e => e.Difficulty) + .HasConversion(); + + entity.Property(e => e.ScoreRank) + .HasConversion(); + + entity.Property(e => e.Crown) + .HasConversion(); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Baid); + + entity.Property(e => e.LastPlayDatetime).HasColumnType("datetime"); + + entity.HasOne(d => d.Ba) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + + entity.Property(e => e.AchievementDisplayDifficulty) + .HasConversion(); + }); + + OnModelCreatingPartial(modelBuilder); + } + + partial void OnModelCreatingPartial(ModelBuilder modelBuilder); + } +} \ No newline at end of file diff --git a/GameDatabase/Context/TaikoDbContextPartial.cs b/GameDatabase/Context/TaikoDbContextPartial.cs new file mode 100644 index 0000000..e8e1620 --- /dev/null +++ b/GameDatabase/Context/TaikoDbContextPartial.cs @@ -0,0 +1,63 @@ +using GameDatabase.Entities; +using Microsoft.EntityFrameworkCore; +using SharedProject.Enums; + +namespace GameDatabase.Context; + +public partial class TaikoDbContext +{ + public virtual DbSet DanScoreData { get; set; } = null!; + public virtual DbSet DanStageScoreData { get; set; } = null!; + public virtual DbSet AiScoreData { get; set; } = null!; + public virtual DbSet AiSectionScoreData { get; set; } = null!; + + partial void OnModelCreatingPartial(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Baid, e.DanId }); + + entity.HasOne(d => d.Ba) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + + entity.Property(e => e.ClearState).HasConversion().HasDefaultValue(DanClearState.NotClear); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Baid, e.DanId, e.SongNumber }); + + entity.HasOne(d => d.Parent) + .WithMany(p => p.DanStageScoreData) + .HasPrincipalKey(p => new { p.Baid, p.DanId }) + .HasForeignKey(d => new { d.Baid, d.DanId }) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Baid, e.SongId, e.Difficulty }); + + entity.HasOne(d => d.Ba) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + }); + + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Baid, e.SongId, e.Difficulty, e.SectionIndex }); + + entity.HasOne(d => d.Parent) + .WithMany(p => p.AiSectionScoreData) + .HasPrincipalKey(p => new { p.Baid, p.SongId, p.Difficulty }) + .HasForeignKey(d => new { d.Baid, d.SongId, d.Difficulty }) + .OnDelete(DeleteBehavior.Cascade); + }); + } +} \ No newline at end of file diff --git a/GameDatabase/Entities/AiScoreDatum.cs b/GameDatabase/Entities/AiScoreDatum.cs new file mode 100644 index 0000000..fda3a58 --- /dev/null +++ b/GameDatabase/Entities/AiScoreDatum.cs @@ -0,0 +1,18 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities; + +public class AiScoreDatum +{ + public ulong Baid { get; set; } + + public uint SongId { get; set; } + + public Difficulty Difficulty { get; set; } + + public bool IsWin { get; set; } + + public List AiSectionScoreData { get; set; } = new(); + + public virtual Card? Ba { get; set; } +} \ No newline at end of file diff --git a/GameDatabase/Entities/AiSectionScoreDatum.cs b/GameDatabase/Entities/AiSectionScoreDatum.cs new file mode 100644 index 0000000..e27eb3e --- /dev/null +++ b/GameDatabase/Entities/AiSectionScoreDatum.cs @@ -0,0 +1,30 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities; + +public class AiSectionScoreDatum +{ + public ulong Baid { get; set; } + + public uint SongId { get; set; } + + public Difficulty Difficulty { get; set; } + + public int SectionIndex { get; set; } + + public CrownType Crown { get; set; } + + public bool IsWin { get; set; } + + public uint Score { get; set; } + + public uint GoodCount { get; set; } + + public uint OkCount { get; set; } + + public uint MissCount { get; set; } + + public uint DrumrollCount { get; set; } + + public AiScoreDatum Parent { get; set; } = null!; +} \ No newline at end of file diff --git a/GameDatabase/Entities/Card.cs b/GameDatabase/Entities/Card.cs new file mode 100644 index 0000000..a403fae --- /dev/null +++ b/GameDatabase/Entities/Card.cs @@ -0,0 +1,8 @@ +namespace GameDatabase.Entities +{ + public partial class Card + { + public string AccessCode { get; set; } = null!; + public ulong Baid { get; set; } + } +} \ No newline at end of file diff --git a/GameDatabase/Entities/DanScoreDatum.cs b/GameDatabase/Entities/DanScoreDatum.cs new file mode 100644 index 0000000..430d0c2 --- /dev/null +++ b/GameDatabase/Entities/DanScoreDatum.cs @@ -0,0 +1,16 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities; + +public class DanScoreDatum +{ + public ulong Baid { get; set; } + public uint DanId { get; set; } + public uint ArrivalSongCount { get; set; } + public uint SoulGaugeTotal { get; set; } + public uint ComboCountTotal { get; set; } + public DanClearState ClearState { get; set; } + public List DanStageScoreData { get; set; } = new(); + + public virtual Card? Ba { get; set; } +} \ No newline at end of file diff --git a/GameDatabase/Entities/DanStageScoreDatum.cs b/GameDatabase/Entities/DanStageScoreDatum.cs new file mode 100644 index 0000000..a4ade62 --- /dev/null +++ b/GameDatabase/Entities/DanStageScoreDatum.cs @@ -0,0 +1,28 @@ +namespace GameDatabase.Entities; + +public class DanStageScoreDatum +{ + public ulong Baid { get; set; } + + public uint DanId { get; set; } + + public uint SongNumber { get; set; } + + public uint PlayScore { get; set; } + + public uint GoodCount { get; set; } + + public uint OkCount { get; set; } + + public uint BadCount { get; set; } + + public uint DrumrollCount { get; set; } + + public uint TotalHitCount { get; set; } + + public uint ComboCount { get; set; } + + public uint HighScore { get; set; } + + public DanScoreDatum Parent { get; set; } = null!; +} \ No newline at end of file diff --git a/GameDatabase/Entities/SongBestDatum.cs b/GameDatabase/Entities/SongBestDatum.cs new file mode 100644 index 0000000..8d26e9a --- /dev/null +++ b/GameDatabase/Entities/SongBestDatum.cs @@ -0,0 +1,17 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities +{ + public partial class SongBestDatum + { + public ulong Baid { get; set; } + public uint SongId { get; set; } + public Difficulty Difficulty { get; set; } + public uint BestScore { get; set; } + public uint BestRate { get; set; } + public CrownType BestCrown { get; set; } + public ScoreRank BestScoreRank { get; set; } + + public virtual Card? Ba { get; set; } + } +} \ No newline at end of file diff --git a/GameDatabase/Entities/SongBestDatumMethods.cs b/GameDatabase/Entities/SongBestDatumMethods.cs new file mode 100644 index 0000000..1b4c8f1 --- /dev/null +++ b/GameDatabase/Entities/SongBestDatumMethods.cs @@ -0,0 +1,29 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities; + +public partial class SongBestDatum +{ + public void UpdateBestData(CrownType crown, uint scoreRank, uint playScore, uint scoreRate) + { + if (BestCrown < crown) + { + BestCrown = crown; + } + + if ((uint)BestScoreRank < scoreRank) + { + BestScoreRank = (ScoreRank)scoreRank; + } + + if (BestScore < playScore) + { + BestScore = playScore; + } + + if (BestRate < scoreRate) + { + BestRate = scoreRate; + } + } +} \ No newline at end of file diff --git a/GameDatabase/Entities/SongPlayDatum.cs b/GameDatabase/Entities/SongPlayDatum.cs new file mode 100644 index 0000000..a6e85a6 --- /dev/null +++ b/GameDatabase/Entities/SongPlayDatum.cs @@ -0,0 +1,29 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities +{ + public partial class SongPlayDatum + { + public long Id { get; set; } + public ulong Baid { get; set; } + + public uint SongNumber { get; set; } + + public uint SongId { get; set; } + public Difficulty Difficulty { get; set; } + public CrownType Crown { get; set; } + public uint Score { get; set; } + public uint ScoreRate { get; set; } + public ScoreRank ScoreRank { get; set; } + public uint GoodCount { get; set; } + public uint OkCount { get; set; } + public uint MissCount { get; set; } + public uint ComboCount { get; set; } + public uint HitCount { get; set; } + public uint DrumrollCount { get; set; } + public bool Skipped { get; set; } + public DateTime PlayTime { get; set; } + + public virtual Card? Ba { get; set; } + } +} \ No newline at end of file diff --git a/GameDatabase/Entities/UserDatum.cs b/GameDatabase/Entities/UserDatum.cs new file mode 100644 index 0000000..3609272 --- /dev/null +++ b/GameDatabase/Entities/UserDatum.cs @@ -0,0 +1,34 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities +{ + public partial class UserDatum + { + public ulong Baid { get; set; } + public string MyDonName { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public uint TitlePlateId { get; set; } + public string FavoriteSongsArray { get; set; } = "[]"; + public string ToneFlgArray { get; set; } = "[]"; + public string TitleFlgArray { get; set; } = "[]"; + public string CostumeFlgArray { get; set; } = "[[],[],[],[],[]]"; + public string GenericInfoFlgArray { get; set; } = "[]"; + public short OptionSetting { get; set; } + public int NotesPosition { get; set; } + public bool IsVoiceOn { get; set; } + public bool IsSkipOn { get; set; } + public uint SelectedToneId { get; set; } + public DateTime LastPlayDatetime { get; set; } + public uint LastPlayMode { get; set; } + public uint ColorBody { get; set; } + public uint ColorFace { get; set; } + public uint ColorLimb { get; set; } + public string CostumeData { get; set; } = "[[],[],[],[],[]]"; + public bool DisplayDan { get; set; } + public bool DisplayAchievement { get; set; } + public Difficulty AchievementDisplayDifficulty { get; set; } + + public int AiWinCount { get; set; } + public virtual Card? Ba { get; set; } + } +} \ No newline at end of file diff --git a/GameDatabase/GameDatabase.csproj b/GameDatabase/GameDatabase.csproj new file mode 100644 index 0000000..79420dd --- /dev/null +++ b/GameDatabase/GameDatabase.csproj @@ -0,0 +1,22 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/GameDatabase/Migrations/20220825070549_Initial.Designer.cs b/GameDatabase/Migrations/20220825070549_Initial.Designer.cs new file mode 100644 index 0000000..f1dc311 --- /dev/null +++ b/GameDatabase/Migrations/20220825070549_Initial.Designer.cs @@ -0,0 +1,222 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220825070549_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220825070549_Initial.cs b/GameDatabase/Migrations/20220825070549_Initial.cs new file mode 100644 index 0000000..f9f5701 --- /dev/null +++ b/GameDatabase/Migrations/20220825070549_Initial.cs @@ -0,0 +1,143 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Card", + columns: table => new + { + AccessCode = table.Column(type: "TEXT", nullable: false), + Baid = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Card", x => x.AccessCode); + table.UniqueConstraint("AK_Card_Baid", x => x.Baid); + }); + + migrationBuilder.CreateTable( + name: "SongBestData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + BestScore = table.Column(type: "INTEGER", nullable: false), + BestRate = table.Column(type: "INTEGER", nullable: false), + BestCrown = table.Column(type: "INTEGER", nullable: false), + BestScoreRank = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SongBestData", x => new { x.Baid, x.SongId, x.Difficulty }); + table.ForeignKey( + name: "FK_SongBestData_Card_Baid", + column: x => x.Baid, + principalTable: "Card", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SongPlayData", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Baid = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + Crown = table.Column(type: "INTEGER", nullable: false), + Score = table.Column(type: "INTEGER", nullable: false), + ScoreRate = table.Column(type: "INTEGER", nullable: false), + ScoreRank = table.Column(type: "INTEGER", nullable: false), + GoodCount = table.Column(type: "INTEGER", nullable: false), + OkCount = table.Column(type: "INTEGER", nullable: false), + MissCount = table.Column(type: "INTEGER", nullable: false), + ComboCount = table.Column(type: "INTEGER", nullable: false), + HitCount = table.Column(type: "INTEGER", nullable: false), + Skipped = table.Column(type: "INTEGER", nullable: false), + PlayTime = table.Column(type: "datetime", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SongPlayData", x => x.Id); + table.ForeignKey( + name: "FK_SongPlayData_Card_Baid", + column: x => x.Baid, + principalTable: "Card", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "UserData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + MyDonName = table.Column(type: "TEXT", nullable: false), + Title = table.Column(type: "TEXT", nullable: false), + TitlePlateId = table.Column(type: "INTEGER", nullable: false), + FavoriteSongsArray = table.Column(type: "TEXT", nullable: false), + OptionSetting = table.Column(type: "INTEGER", nullable: false), + IsVoiceOn = table.Column(type: "INTEGER", nullable: false), + IsSkipOn = table.Column(type: "INTEGER", nullable: false), + LastPlayDatetime = table.Column(type: "datetime", nullable: false), + LastPlayMode = table.Column(type: "INTEGER", nullable: false), + ColorBody = table.Column(type: "INTEGER", nullable: false), + ColorFace = table.Column(type: "INTEGER", nullable: false), + ColorLimb = table.Column(type: "INTEGER", nullable: false), + CostumeData = table.Column(type: "TEXT", nullable: false), + DisplayDan = table.Column(type: "INTEGER", nullable: false), + DisplayAchievement = table.Column(type: "INTEGER", nullable: false), + AchievementDisplayDifficulty = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserData", x => x.Baid); + table.ForeignKey( + name: "FK_UserData_Card_Baid", + column: x => x.Baid, + principalTable: "Card", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Card_Baid", + table: "Card", + column: "Baid", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_SongPlayData_Baid", + table: "SongPlayData", + column: "Baid"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "SongBestData"); + + migrationBuilder.DropTable( + name: "SongPlayData"); + + migrationBuilder.DropTable( + name: "UserData"); + + migrationBuilder.DropTable( + name: "Card"); + } + } +} diff --git a/GameDatabase/Migrations/20220827163841_FirstMigration.Designer.cs b/GameDatabase/Migrations/20220827163841_FirstMigration.Designer.cs new file mode 100644 index 0000000..7167f23 --- /dev/null +++ b/GameDatabase/Migrations/20220827163841_FirstMigration.Designer.cs @@ -0,0 +1,225 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220827163841_FirstMigration")] + partial class FirstMigration + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220827163841_FirstMigration.cs b/GameDatabase/Migrations/20220827163841_FirstMigration.cs new file mode 100644 index 0000000..43b4874 --- /dev/null +++ b/GameDatabase/Migrations/20220827163841_FirstMigration.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class FirstMigration : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "SongNumber", + table: "SongPlayData", + type: "INTEGER", + nullable: false, + defaultValue: 0u); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "SongNumber", + table: "SongPlayData"); + } + } +} diff --git a/GameDatabase/Migrations/20220828101620_AddDanDbTest.Designer.cs b/GameDatabase/Migrations/20220828101620_AddDanDbTest.Designer.cs new file mode 100644 index 0000000..417f1cd --- /dev/null +++ b/GameDatabase/Migrations/20220828101620_AddDanDbTest.Designer.cs @@ -0,0 +1,322 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220828101620_AddDanDbTest")] + partial class AddDanDbTest + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", null) + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220828101620_AddDanDbTest.cs b/GameDatabase/Migrations/20220828101620_AddDanDbTest.cs new file mode 100644 index 0000000..82efbd7 --- /dev/null +++ b/GameDatabase/Migrations/20220828101620_AddDanDbTest.cs @@ -0,0 +1,79 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddDanDbTest : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "DanScoreData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + DanId = table.Column(type: "INTEGER", nullable: false), + ArrivalSongCount = table.Column(type: "INTEGER", nullable: false), + SoulGaugeTotal = table.Column(type: "INTEGER", nullable: false), + ComboCountTotal = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_DanScoreData", x => new { x.Baid, x.DanId }); + table.UniqueConstraint("AK_DanScoreData_Baid", x => x.Baid); + table.ForeignKey( + name: "FK_DanScoreData_Card_Baid", + column: x => x.Baid, + principalTable: "Card", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "DanStageScoreData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + DanId = table.Column(type: "INTEGER", nullable: false), + SongNumber = table.Column(type: "INTEGER", nullable: false), + PlayScore = table.Column(type: "INTEGER", nullable: false), + GoodCount = table.Column(type: "INTEGER", nullable: false), + OkCount = table.Column(type: "INTEGER", nullable: false), + BadCount = table.Column(type: "INTEGER", nullable: false), + DrumrollCount = table.Column(type: "INTEGER", nullable: false), + TotalHitCount = table.Column(type: "INTEGER", nullable: false), + ComboCount = table.Column(type: "INTEGER", nullable: false), + HighScore = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_DanStageScoreData", x => new { x.Baid, x.DanId, x.SongNumber }); + table.ForeignKey( + name: "FK_DanStageScoreData_DanScoreData_Baid", + column: x => x.Baid, + principalTable: "DanScoreData", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DanStageScoreData_DanScoreData_Baid_DanId", + columns: x => new { x.Baid, x.DanId }, + principalTable: "DanScoreData", + principalColumns: new[] { "Baid", "DanId" }, + onDelete: ReferentialAction.Cascade); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "DanStageScoreData"); + + migrationBuilder.DropTable( + name: "DanScoreData"); + } + } +} diff --git a/GameDatabase/Migrations/20220828171353_AddClearState.Designer.cs b/GameDatabase/Migrations/20220828171353_AddClearState.Designer.cs new file mode 100644 index 0000000..ee53f52 --- /dev/null +++ b/GameDatabase/Migrations/20220828171353_AddClearState.Designer.cs @@ -0,0 +1,327 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220828171353_AddClearState")] + partial class AddClearState + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", null) + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220828171353_AddClearState.cs b/GameDatabase/Migrations/20220828171353_AddClearState.cs new file mode 100644 index 0000000..c747228 --- /dev/null +++ b/GameDatabase/Migrations/20220828171353_AddClearState.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddClearState : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ClearState", + table: "DanScoreData", + type: "INTEGER", + nullable: false, + defaultValue: 0u); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ClearState", + table: "DanScoreData"); + } + } +} diff --git a/GameDatabase/Migrations/20220829101052_AdjustDanDb.Designer.cs b/GameDatabase/Migrations/20220829101052_AdjustDanDb.Designer.cs new file mode 100644 index 0000000..34d8079 --- /dev/null +++ b/GameDatabase/Migrations/20220829101052_AdjustDanDb.Designer.cs @@ -0,0 +1,332 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220829101052_AdjustDanDb")] + partial class AdjustDanDb + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DanScoreDatumBaid") + .HasColumnType("INTEGER"); + + b.Property("DanScoreDatumDanId") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.HasIndex("DanScoreDatumBaid", "DanScoreDatumDanId"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany() + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", null) + .WithMany("DanStageScoreData") + .HasForeignKey("DanScoreDatumBaid", "DanScoreDatumDanId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220829101052_AdjustDanDb.cs b/GameDatabase/Migrations/20220829101052_AdjustDanDb.cs new file mode 100644 index 0000000..9c242e5 --- /dev/null +++ b/GameDatabase/Migrations/20220829101052_AdjustDanDb.cs @@ -0,0 +1,79 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AdjustDanDb : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_DanStageScoreData_DanScoreData_Baid", + table: "DanStageScoreData"); + + migrationBuilder.DropUniqueConstraint( + name: "AK_DanScoreData_Baid", + table: "DanScoreData"); + + migrationBuilder.AddColumn( + name: "DanScoreDatumBaid", + table: "DanStageScoreData", + type: "INTEGER", + nullable: true); + + migrationBuilder.AddColumn( + name: "DanScoreDatumDanId", + table: "DanStageScoreData", + type: "INTEGER", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_DanStageScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData", + columns: new[] { "DanScoreDatumBaid", "DanScoreDatumDanId" }); + + migrationBuilder.AddForeignKey( + name: "FK_DanStageScoreData_DanScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData", + columns: new[] { "DanScoreDatumBaid", "DanScoreDatumDanId" }, + principalTable: "DanScoreData", + principalColumns: new[] { "Baid", "DanId" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_DanStageScoreData_DanScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData"); + + migrationBuilder.DropIndex( + name: "IX_DanStageScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData"); + + migrationBuilder.DropColumn( + name: "DanScoreDatumBaid", + table: "DanStageScoreData"); + + migrationBuilder.DropColumn( + name: "DanScoreDatumDanId", + table: "DanStageScoreData"); + + migrationBuilder.AddUniqueConstraint( + name: "AK_DanScoreData_Baid", + table: "DanScoreData", + column: "Baid"); + + migrationBuilder.AddForeignKey( + name: "FK_DanStageScoreData_DanScoreData_Baid", + table: "DanStageScoreData", + column: "Baid", + principalTable: "DanScoreData", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/GameDatabase/Migrations/20220829124927_FixNavigation.Designer.cs b/GameDatabase/Migrations/20220829124927_FixNavigation.Designer.cs new file mode 100644 index 0000000..fe245d3 --- /dev/null +++ b/GameDatabase/Migrations/20220829124927_FixNavigation.Designer.cs @@ -0,0 +1,320 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220829124927_FixNavigation")] + partial class FixNavigation + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220829124927_FixNavigation.cs b/GameDatabase/Migrations/20220829124927_FixNavigation.cs new file mode 100644 index 0000000..1e41776 --- /dev/null +++ b/GameDatabase/Migrations/20220829124927_FixNavigation.cs @@ -0,0 +1,58 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class FixNavigation : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_DanStageScoreData_DanScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData"); + + migrationBuilder.DropIndex( + name: "IX_DanStageScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData"); + + migrationBuilder.DropColumn( + name: "DanScoreDatumBaid", + table: "DanStageScoreData"); + + migrationBuilder.DropColumn( + name: "DanScoreDatumDanId", + table: "DanStageScoreData"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "DanScoreDatumBaid", + table: "DanStageScoreData", + type: "INTEGER", + nullable: true); + + migrationBuilder.AddColumn( + name: "DanScoreDatumDanId", + table: "DanStageScoreData", + type: "INTEGER", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_DanStageScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData", + columns: new[] { "DanScoreDatumBaid", "DanScoreDatumDanId" }); + + migrationBuilder.AddForeignKey( + name: "FK_DanStageScoreData_DanScoreData_DanScoreDatumBaid_DanScoreDatumDanId", + table: "DanStageScoreData", + columns: new[] { "DanScoreDatumBaid", "DanScoreDatumDanId" }, + principalTable: "DanScoreData", + principalColumns: new[] { "Baid", "DanId" }); + } + } +} diff --git a/GameDatabase/Migrations/20220905132703_AddMoreOptions.Designer.cs b/GameDatabase/Migrations/20220905132703_AddMoreOptions.Designer.cs new file mode 100644 index 0000000..f7935c2 --- /dev/null +++ b/GameDatabase/Migrations/20220905132703_AddMoreOptions.Designer.cs @@ -0,0 +1,326 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220905132703_AddMoreOptions")] + partial class AddMoreOptions + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220905132703_AddMoreOptions.cs b/GameDatabase/Migrations/20220905132703_AddMoreOptions.cs new file mode 100644 index 0000000..1ebcadc --- /dev/null +++ b/GameDatabase/Migrations/20220905132703_AddMoreOptions.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddMoreOptions : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "NotesPosition", + table: "UserData", + type: "INTEGER", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "SelectedToneId", + table: "UserData", + type: "INTEGER", + nullable: false, + defaultValue: 0u); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "NotesPosition", + table: "UserData"); + + migrationBuilder.DropColumn( + name: "SelectedToneId", + table: "UserData"); + } + } +} diff --git a/GameDatabase/Migrations/20220910055624_AddDrumrollCount.Designer.cs b/GameDatabase/Migrations/20220910055624_AddDrumrollCount.Designer.cs new file mode 100644 index 0000000..173872c --- /dev/null +++ b/GameDatabase/Migrations/20220910055624_AddDrumrollCount.Designer.cs @@ -0,0 +1,329 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220910055624_AddDrumrollCount")] + partial class AddDrumrollCount + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220910055624_AddDrumrollCount.cs b/GameDatabase/Migrations/20220910055624_AddDrumrollCount.cs new file mode 100644 index 0000000..3805ed4 --- /dev/null +++ b/GameDatabase/Migrations/20220910055624_AddDrumrollCount.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddDrumrollCount : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "DrumrollCount", + table: "SongPlayData", + type: "INTEGER", + nullable: false, + defaultValue: 0u); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "DrumrollCount", + table: "SongPlayData"); + } + } +} diff --git a/GameDatabase/Migrations/20220914054039_AddRewardFlgs.Designer.cs b/GameDatabase/Migrations/20220914054039_AddRewardFlgs.Designer.cs new file mode 100644 index 0000000..e9263f9 --- /dev/null +++ b/GameDatabase/Migrations/20220914054039_AddRewardFlgs.Designer.cs @@ -0,0 +1,341 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220914054039_AddRewardFlgs")] + partial class AddRewardFlgs + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220914054039_AddRewardFlgs.cs b/GameDatabase/Migrations/20220914054039_AddRewardFlgs.cs new file mode 100644 index 0000000..455a432 --- /dev/null +++ b/GameDatabase/Migrations/20220914054039_AddRewardFlgs.cs @@ -0,0 +1,51 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddRewardFlgs : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CostumeFlgArray", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: "[[],[],[],[],[]]"); + + migrationBuilder.AddColumn( + name: "TitleFlgArray", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: "[]"); + + migrationBuilder.AddColumn( + name: "ToneFlgArray", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: "[]"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CostumeFlgArray", + table: "UserData"); + + migrationBuilder.DropColumn( + name: "TitleFlgArray", + table: "UserData"); + + migrationBuilder.DropColumn( + name: "ToneFlgArray", + table: "UserData"); + } + } +} diff --git a/GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.Designer.cs b/GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.Designer.cs new file mode 100644 index 0000000..31806c8 --- /dev/null +++ b/GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.Designer.cs @@ -0,0 +1,345 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220916121143_AddGenericInfoFlg")] + partial class AddGenericInfoFlg + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.cs b/GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.cs new file mode 100644 index 0000000..638183a --- /dev/null +++ b/GameDatabase/Migrations/20220916121143_AddGenericInfoFlg.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddGenericInfoFlg : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "GenericInfoFlgArray", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: "[]"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "GenericInfoFlgArray", + table: "UserData"); + } + } +} diff --git a/GameDatabase/Migrations/20220917180457_AddAiBattle.Designer.cs b/GameDatabase/Migrations/20220917180457_AddAiBattle.Designer.cs new file mode 100644 index 0000000..70378f0 --- /dev/null +++ b/GameDatabase/Migrations/20220917180457_AddAiBattle.Designer.cs @@ -0,0 +1,432 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220917180457_AddAiBattle")] + partial class AddAiBattle + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220917180457_AddAiBattle.cs b/GameDatabase/Migrations/20220917180457_AddAiBattle.cs new file mode 100644 index 0000000..f3694b9 --- /dev/null +++ b/GameDatabase/Migrations/20220917180457_AddAiBattle.cs @@ -0,0 +1,71 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddAiBattle : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AiScoreData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + IsWin = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AiScoreData", x => new { x.Baid, x.SongId, x.Difficulty }); + table.ForeignKey( + name: "FK_AiScoreData_Card_Baid", + column: x => x.Baid, + principalTable: "Card", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AiSectionScoreData", + columns: table => new + { + Baid = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + SectionIndex = table.Column(type: "INTEGER", nullable: false), + Crown = table.Column(type: "INTEGER", nullable: false), + IsWin = table.Column(type: "INTEGER", nullable: false), + Score = table.Column(type: "INTEGER", nullable: false), + GoodCount = table.Column(type: "INTEGER", nullable: false), + OkCount = table.Column(type: "INTEGER", nullable: false), + MissCount = table.Column(type: "INTEGER", nullable: false), + DrumrollCount = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AiSectionScoreData", x => new { x.Baid, x.SongId, x.Difficulty, x.SectionIndex }); + table.ForeignKey( + name: "FK_AiSectionScoreData_AiScoreData_Baid_SongId_Difficulty", + columns: x => new { x.Baid, x.SongId, x.Difficulty }, + principalTable: "AiScoreData", + principalColumns: new[] { "Baid", "SongId", "Difficulty" }, + onDelete: ReferentialAction.Cascade); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AiSectionScoreData"); + + migrationBuilder.DropTable( + name: "AiScoreData"); + } + } +} diff --git a/GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.Designer.cs b/GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.Designer.cs new file mode 100644 index 0000000..bfac5de --- /dev/null +++ b/GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.Designer.cs @@ -0,0 +1,435 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20220919022643_AddWinCountToUserdata")] + partial class AddWinCountToUserdata + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("AiWinCount") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.cs b/GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.cs new file mode 100644 index 0000000..ef9dce1 --- /dev/null +++ b/GameDatabase/Migrations/20220919022643_AddWinCountToUserdata.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddWinCountToUserdata : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AiWinCount", + table: "UserData", + type: "INTEGER", + nullable: false, + defaultValue: 0); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AiWinCount", + table: "UserData"); + } + } +} diff --git a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs new file mode 100644 index 0000000..d3fa35d --- /dev/null +++ b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs @@ -0,0 +1,432 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + partial class TaikoDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("AiWinCount") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + { + b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/LocalSaveModScoreMigrator/DateTimeConverter.cs b/LocalSaveModScoreMigrator/DateTimeConverter.cs new file mode 100644 index 0000000..6cf4cf5 --- /dev/null +++ b/LocalSaveModScoreMigrator/DateTimeConverter.cs @@ -0,0 +1,22 @@ +using System.Diagnostics; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace LocalSaveModScoreMigrator; + +public class DateTimeConverter : JsonConverter +{ + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + Debug.Assert(typeToConvert == typeof(DateTime)); + var dateTime = DateTime.ParseExact(reader.GetString() ?? string.Empty, "dd_MM_yy-HH_mm_ss", + CultureInfo.InvariantCulture); + return dateTime; + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString(CultureInfo.InvariantCulture)); + } +} \ No newline at end of file diff --git a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj new file mode 100644 index 0000000..ce03ddd --- /dev/null +++ b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj @@ -0,0 +1,27 @@ + + + + Exe + net6.0 + enable + enable + 1.0.0-beta1 + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + diff --git a/LocalSaveModScoreMigrator/MusicInfo.cs b/LocalSaveModScoreMigrator/MusicInfo.cs new file mode 100644 index 0000000..2230f85 --- /dev/null +++ b/LocalSaveModScoreMigrator/MusicInfo.cs @@ -0,0 +1,8 @@ +using System.Text.Json.Serialization; + +namespace LocalSaveModScoreMigrator; + +public class MusicInfo +{ + [JsonPropertyName("items")] public List Items { get; set; } = new(); +} \ No newline at end of file diff --git a/LocalSaveModScoreMigrator/MusicInfoEntry.cs b/LocalSaveModScoreMigrator/MusicInfoEntry.cs new file mode 100644 index 0000000..23f98fb --- /dev/null +++ b/LocalSaveModScoreMigrator/MusicInfoEntry.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Serialization; + +namespace LocalSaveModScoreMigrator; + +public class MusicInfoEntry +{ + [JsonPropertyName("id")] public string Id { get; set; } = string.Empty; + + [JsonPropertyName("uniqueId")] public uint SongId { get; set; } +} \ No newline at end of file diff --git a/LocalSaveModScoreMigrator/PlayRecordJson.cs b/LocalSaveModScoreMigrator/PlayRecordJson.cs new file mode 100644 index 0000000..a788ba4 --- /dev/null +++ b/LocalSaveModScoreMigrator/PlayRecordJson.cs @@ -0,0 +1,21 @@ +using System.Text.Json.Serialization; +using SharedProject.Enums; + +namespace LocalSaveModScoreMigrator; + +public class PlayRecordJson +{ + public string SongId { get; set; } = "tmap4"; + public Difficulty Difficulty { get; set; } + + [JsonPropertyName("dateTime")] public DateTime DateTime { get; set; } + public uint Score { set; get; } + public CrownType Crown { get; set; } + + [JsonPropertyName("scorerank")] public ScoreRank Scorerank { get; set; } + public uint Good { get; set; } + public uint Ok { get; set; } + public uint Bad { get; set; } + public uint Combo { get; set; } + public uint Drumroll { get; set; } +} \ No newline at end of file diff --git a/LocalSaveModScoreMigrator/Program.cs b/LocalSaveModScoreMigrator/Program.cs new file mode 100644 index 0000000..343fd7a --- /dev/null +++ b/LocalSaveModScoreMigrator/Program.cs @@ -0,0 +1,196 @@ +using GameDatabase.Context; +using GameDatabase.Entities; +using ICSharpCode.SharpZipLib.GZip; +using JorgeSerrano.Json; +using LocalSaveModScoreMigrator; +using SharedProject.Enums; +using System.CommandLine; +using System.CommandLine.Parsing; +using System.Text; +using System.Text.Json; + +var rootCommand = new RootCommand("Command-line tool to migrate saves from local save mod to local server database."); + +FileInfo? Parse(SymbolResult result, string defaultFileName) +{ + if (result.Tokens.Count == 0) + { + return new FileInfo(defaultFileName); + } + + var filePath = result.Tokens.Single().Value; + if (File.Exists(filePath)) + { + return new FileInfo(filePath); + } + + result.ErrorMessage = $"File {filePath} does not exist"; + return null; +} + +var saveFileArgument = new Option( + name: "--save-file-path", + description: "Path to the save file from local save mod", + isDefault: true, + parseArgument: result => Parse(result, "record_enso_p1.json") +); +saveFileArgument.AddAlias("-s"); + +var dbFileArgument = new Option( + name: "--db-file-path", + description: "Path to the database file for local server", + isDefault: true, + parseArgument: result => Parse(result, "wwwroot/taiko.db3") +); +dbFileArgument.AddAlias("-db"); + +var musicInfoArgument = new Option( + name: "--musicinfo-file-path", + description: "Path to the music info json/bin file", + isDefault: true, + parseArgument: result => Parse(result, "wwwroot/data/musicinfo.json") +); +musicInfoArgument.AddAlias("-m"); + +var baidArgument = new Option( + name: "--baid", + description: "Target card's baid, data will be imported to that card", + getDefaultValue: () => 1 +); +baidArgument.AddAlias("-b"); + +rootCommand.Add(saveFileArgument); +rootCommand.Add(dbFileArgument); +rootCommand.Add(musicInfoArgument); +rootCommand.Add(baidArgument); + +rootCommand.SetHandler((saveFile, dbFile, musicInfoFile, baid) => Run(saveFile!, dbFile!, musicInfoFile!, baid), + saveFileArgument, dbFileArgument, musicInfoArgument, baidArgument); + +await rootCommand.InvokeAsync(args); + +void Run(FileSystemInfo saveFile, FileSystemInfo dbFile, FileSystemInfo musicInfoFile, ulong baid) +{ + using var db = new TaikoDbContext(dbFile.FullName); + var card = db.Cards.FirstOrDefault(card1 => card1.Baid == baid); + if (card is null) + { + Console.ResetColor(); + Console.ForegroundColor = ConsoleColor.Red; + Console.Error.WriteLine($"Card with baid {baid} does not exist!"); + Console.ResetColor(); + return; + } + + Console.ResetColor(); + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine($"Baid: {card.Baid}"); + Console.WriteLine($"Access code: {card.AccessCode}"); + Console.ResetColor(); + + var localSaveJson = File.ReadAllText(saveFile.FullName); + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = new JsonSnakeCaseNamingPolicy() + }; + options.Converters.Add(new DateTimeConverter()); + options.Converters.Add(new ScoreRankConverter()); + var playRecordJson = JsonSerializer.Deserialize>(localSaveJson, options); + if (playRecordJson is null) + { + throw new ApplicationException("Play record json is null"); + } + + Console.WriteLine(playRecordJson.First().SongId); + + var musicInfoJson = File.ReadAllText(musicInfoFile.FullName); + if (musicInfoFile.FullName.EndsWith(".bin")) + { + var compressed = File.OpenRead(musicInfoFile.FullName); + using var gZipInputStream = new GZipInputStream(compressed); + using var decompressed = new MemoryStream(); + + // Decompress + gZipInputStream.CopyTo(decompressed); + + // Reset stream for reading + decompressed.Position = 0; + musicInfoJson = Encoding.UTF8.GetString(decompressed.ToArray()); + } + var musicInfo = JsonSerializer.Deserialize(musicInfoJson); + + if (musicInfo is null) + { + throw new ApplicationException("Music info is null"); + } + + var user = db.UserData.First(); + var musicInfoMap = musicInfo.Items.DistinctBy(entry => entry.Id) + .ToDictionary(entry => entry.Id, entry => entry.SongId); + foreach (var playRecord in playRecordJson) + { + var key = playRecord.SongId.Split("_")[1]; + if (!musicInfoMap.ContainsKey(key)) + { + Console.ResetColor(); + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine($"Key {key} does not exist!!!"); + Console.ResetColor(); + continue; + } + var songId = musicInfoMap[key]; + Console.ResetColor(); + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine($"Importing song with id: {songId}"); + Console.WriteLine($"Song play time: {playRecord.DateTime}"); + Console.ResetColor(); + var playLog = new SongPlayDatum + { + Baid = user.Baid, + Difficulty = playRecord.Difficulty, + Crown = playRecord.Crown, + Score = playRecord.Score, + ScoreRank = playRecord.Scorerank, + ComboCount = playRecord.Combo, + DrumrollCount = playRecord.Drumroll, + PlayTime = playRecord.DateTime, + GoodCount = playRecord.Good, + MissCount = playRecord.Bad, + OkCount = playRecord.Ok, + Skipped = false, + SongNumber = 0, + SongId = songId + }; + db.SongPlayData.Add(playLog); + + + var best = new SongBestDatum + { + Baid = user.Baid, + Difficulty = playRecord.Difficulty, + BestCrown = playRecord.Crown, + BestScore = playRecord.Score, + BestScoreRank = playRecord.Scorerank, + SongId = songId + }; + + var existing = db.SongBestData.FirstOrDefault(datum => datum.Baid == user.Baid && + datum.Difficulty == playLog.Difficulty && + datum.SongId == songId); + + + if (existing is null) + { + db.SongBestData.Add(best); + } + else + { + existing.BestCrown = (CrownType)Math.Max((int)existing.BestCrown, (int)playRecord.Crown); + existing.BestScoreRank = (ScoreRank)Math.Max((int)existing.BestScoreRank, (int)playRecord.Scorerank); + existing.BestScore = Math.Max(existing.BestScore, playRecord.Score); + db.SongBestData.Update(existing); + } + } + + db.SaveChanges(); +} \ No newline at end of file diff --git a/LocalSaveModScoreMigrator/ScoreRankConverter.cs b/LocalSaveModScoreMigrator/ScoreRankConverter.cs new file mode 100644 index 0000000..2c40f07 --- /dev/null +++ b/LocalSaveModScoreMigrator/ScoreRankConverter.cs @@ -0,0 +1,22 @@ +using System.Diagnostics; +using System.Text.Json; +using System.Text.Json.Serialization; +using SharedProject.Enums; + +namespace LocalSaveModScoreMigrator; + +public class ScoreRankConverter : JsonConverter +{ + public override ScoreRank Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + Debug.Assert(typeToConvert == typeof(ScoreRank)); + var scoreRankInt = reader.GetInt32() + 1; + return (ScoreRank)scoreRankInt; + } + + public override void Write(Utf8JsonWriter writer, ScoreRank value, JsonSerializerOptions options) + { + var scoreRank = (int)value - 1; + writer.WriteStringValue(scoreRank.ToString()); + } +} \ No newline at end of file diff --git a/OldSetup.md b/OldSetup.md new file mode 100644 index 0000000..3b36ba0 --- /dev/null +++ b/OldSetup.md @@ -0,0 +1,95 @@ +# Old setup + +1. Download the latest release of [TaikoArcadeLoader](https://github.com/BroGamer4256/TaikoArcadeLoader) and install it. Make sure to setup TAL using the config.toml and set the `server` parameter to your local IP address. +2. Download the latest release of [TaikoReverseProxy](https://github.com/shiibe/TaikoReverseProxy). +3. In the `Data\x64\datatable` folder of the game, find the following files: + + ``` + music_attribute.bin + musicinfo.bin + music_order.bin + wordlist.bin + ``` + + Extract them (you can use [7zip](https://www.7-zip.org)) and rename the extracted file like so: + + ``` + music_attribute -> music_attribute.json + musicinfo -> musicinfo.json + music_order -> music_order.json + wordlist -> wordlist.json + ``` + + Then put these in TaikoLocalServer's `wwwroot/data` folder. + +4. Modify hosts, add the following entries (this step can be done automatically with TaikoReverseProxy, check the config for it): + + ``` + server.ip tenporouter.loc + server.ip naominet.jp + server.ip v402-front.mucha-prd.nbgi-amnet.jp + server.ip vsapi.taiko-p.jp + ``` + + where `server.ip` is your computer's ip (or the server's ip) + +5. Open command prompt as admin, navigate to game root folder (where init.ps1 is). Run `regsvr32 .\AMCUS\iauthdll.dll`. It should prompt about success + +6. Run TaikoReverseProxy and TaikoLocalServer, then run the game. You can access the WebUI by going to `https://naominet.jp:10122/` in your browser. + + +### Server setup (for TAL<2.00 or other loaders) + +1. Download the server from release page, extract anywhere + +2. From game's `Data\x64\datatable` folder, find `music_attribute.bin`, `musicinfo.bin`, `music_order.bin` and `wordlist.bin`, decompress them, add `.json` prefix to them. + The result is `music_attribute.json`, `musicinfo.json`, `music_order.json` and `wordlist.json`. Put the json files under` wwwroot/data` folder in server. + +3. Modify hosts, add the following entries: + + ``` + server.ip tenporouter.loc + server.ip naominet.jp + server.ip v402-front.mucha-prd.nbgi-amnet.jp + server.ip vsapi.taiko-p.jp + ``` + + where `server.ip` is your computers ip (or the server's ip) + +4. Setup [TaikoReverseProxy](https://github.com/shiibe/TaikoReverseProxy) or [Apache](#apache-setup-optional) as reverse proxy. + +5. Now run the server, if everything is setup correctly, visit http://localhost:5000, you should be able to see the web ui up and running without errors. (If you encounter errors in web ui for the first time, try visit https://naominet.jp:10122/) + +6. Go to game folder, copy the config files (AMConfig.ini and WritableConfig.ini) in the AMCUS folder from server release to AMCUS folder and replace the original ones. + +7. Open command prompt as admin, navigate to game root folder (where init.ps1 is). Run `regsvr32 .\AMCUS\iauthdll.dll`. It should prompt about success. + +8. Run AMCUS/AMAuthd.exe, then run AMCUS/AMUpdater.exe. If the updater run and exits without issue, you are ready to run the game and connect to server. + +9. Run the game, it should now connect to the server. + +### Run the server on another computer + +If you want to run the server on another computer, the procedure is almost identical. + +Before you open browser, in `wwwroot/appsettings.json`, change `BaseUrl` to `https://naominet.jp:10122` then instead of visit localhost, visit the server using domain name to test. + +Also note that now the cetificate also need to be imported on client computer, or web ui may not work. If you don't need https, change `BaseUrl` to `http://server.ip:80`, and visit on client. The game does not care about certificate. + +### Apache Setup (Optional) +Notice the following assumes a windows install, the server also works on Linux, but the guide only covers windows. + +1. Download [Apache](https://www.apachelounge.com/download/), extract anywhere + +2. Copy the content in release rar's Apache folder to installed Apache root folder (and replace, which includes httpd.conf and httpd-vhosts.conf, if no prompt to replace files, you are extracting to wrong folder) + +3. Open `conf/httpd.conf` (under installed Apache folder), find this line (line 37 by default), modify it to your Apache install (extracted) full path + +```htaccess +# For example, if your Apache is extracted to C:\users\username\Apache24, then this should be "c:/users/username/Apache24" +Define SRVROOT "d:/Projects/Apache24" +``` + +4. Open the certs folder Apache root folder, then click on the localhost.crt file and import it to trusted root store. + +If everything is correct, run bin/httpd.exe, a command prompt will open (and stay open, if it shut down, probably something is not setup correctly) diff --git a/README.md b/README.md new file mode 100644 index 0000000..e7f0330 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# Taiko Local Server + +This is a server for Taiko no Tatsujin Nijiiro ver 08.18 + +## Setup + +### Prerequisite + +- A working game, with dongle and card reader emulation. You can use [TaikoArcadeLoader](https://github.com/BroGamer4256/TaikoArcadeLoader) for these if you haven't. + +### Quick Setup + +With the newest release (from [this](https://github.com/BroGamer4256/TaikoArcadeLoader/tree/95d633850d89cb7099e98ffe74cd23632fe26e56) commit) of TaikoArcadeLoader, you no longer need to run AMAuthd, AMUpdater or reverse proxy. + +1. Extract the server release anywhere + +2. From the game files, copy `music_attribute.bin`, `music_order.bin`, `musicinfo.bin` and `wordlist.bin` to `wwwroot/data` folder. + +3. (Optional) Instead of direct copy, extract the specified game files (using 7zip), rename them by adding the file extension `.json` and copy the jsons over. + +4. (Optional) In `Certificates` folder, import `root.pfx` to trusted root store, `cert.pfx` to personal store. All the other import options can be kept default. + +5. Visit http://localhost:5000 and (Optional, only if you have done step 4) https://localhost:10122, if the web ui starts without errors, the config is fine. + +6. Modify comfig.toml from TAL, edit the following line: + + ```toml + server = "https://divamodarchive.com" # Change https://divamodarchive.com to your/server's ip, like 192.168.1.100 + ``` +7. Open command prompt as admin, navigate to game root folder (where `init.ps1` is). Run `regsvr32 .\AMCUS\iauthdll.dll`. It should prompt about success (This only need to be done once) + +8. Now the game should be able to connect. + +### About certificates + +If you want to change the certificate used by server, just replace `cert.pfx` in `Certificates` folder. The bundled certificate includes the following DNS names: + +``` +DNS Name=nbgi-amnet.jp +DNS Name=v402-front.mucha-prd.nbgi-amnet.jp +DNS Name=*.mucha-prd.nbgi-amnet.jp +DNS Name=localhost +DNS Name=vsapi.taiko-p.jp +``` + +You will need to modify hosts file to use them. diff --git a/SharedProject/Enums/CrownType.cs b/SharedProject/Enums/CrownType.cs new file mode 100644 index 0000000..531579e --- /dev/null +++ b/SharedProject/Enums/CrownType.cs @@ -0,0 +1,9 @@ +namespace SharedProject.Enums; + +public enum CrownType +{ + None = 0, + Clear = 1, + Gold = 2, + Dondaful = 3 +} \ No newline at end of file diff --git a/SharedProject/Enums/DanBorderType.cs b/SharedProject/Enums/DanBorderType.cs new file mode 100644 index 0000000..29f339c --- /dev/null +++ b/SharedProject/Enums/DanBorderType.cs @@ -0,0 +1,7 @@ +namespace SharedProject.Enums; + +public enum DanBorderType +{ + All = 1, + PerSong = 2 +} \ No newline at end of file diff --git a/SharedProject/Enums/DanClearState.cs b/SharedProject/Enums/DanClearState.cs new file mode 100644 index 0000000..e91dc43 --- /dev/null +++ b/SharedProject/Enums/DanClearState.cs @@ -0,0 +1,12 @@ +namespace SharedProject.Enums; + +public enum DanClearState +{ + NotClear = 0, + RedNormalClear, + RedFullComboClear, + RedPerfectClear, + GoldNormalClear, + GoldFullComboClear, + GoldPerfectClear, +} \ No newline at end of file diff --git a/SharedProject/Enums/DanConditionType.cs b/SharedProject/Enums/DanConditionType.cs new file mode 100644 index 0000000..14cf8a6 --- /dev/null +++ b/SharedProject/Enums/DanConditionType.cs @@ -0,0 +1,13 @@ +namespace SharedProject.Enums; + +public enum DanConditionType +{ + SoulGauge = 1, + GoodCount = 2, + OkCount = 3, + BadCount = 4, + ComboCount = 5, + DrumrollCount = 6, + Score = 7, + TotalHitCount = 8 +} \ No newline at end of file diff --git a/SharedProject/Enums/Difficulty.cs b/SharedProject/Enums/Difficulty.cs new file mode 100644 index 0000000..8f8fd58 --- /dev/null +++ b/SharedProject/Enums/Difficulty.cs @@ -0,0 +1,12 @@ +namespace SharedProject.Enums; + +public enum Difficulty : uint +{ + None = 0, + Easy = 1, + Normal = 2, + Hard = 3, + Oni = 4, + UraOni = 5 +} + diff --git a/SharedProject/Enums/PlayMode.cs b/SharedProject/Enums/PlayMode.cs new file mode 100644 index 0000000..958a0f6 --- /dev/null +++ b/SharedProject/Enums/PlayMode.cs @@ -0,0 +1,9 @@ +namespace SharedProject.Enums; + +public enum PlayMode +{ + Normal = 0, + DanMode = 1, + // Not sure about this + AiBattle = 6 +} \ No newline at end of file diff --git a/SharedProject/Enums/RandomType.cs b/SharedProject/Enums/RandomType.cs new file mode 100644 index 0000000..0fd6705 --- /dev/null +++ b/SharedProject/Enums/RandomType.cs @@ -0,0 +1,9 @@ +// ReSharper disable UnusedMember.Global +namespace SharedProject.Enums; + +public enum RandomType +{ + None = 0, + Whimsical = 1, + Messy = 2 +} \ No newline at end of file diff --git a/SharedProject/Enums/ScoreRank.cs b/SharedProject/Enums/ScoreRank.cs new file mode 100644 index 0000000..a2b2042 --- /dev/null +++ b/SharedProject/Enums/ScoreRank.cs @@ -0,0 +1,13 @@ +namespace SharedProject.Enums; + +public enum ScoreRank +{ + None = 1, + White, + Bronze, + Silver, + Gold, + Sakura, + Purple, + Dondaful +} \ No newline at end of file diff --git a/SharedProject/Enums/SongGenre.cs b/SharedProject/Enums/SongGenre.cs new file mode 100644 index 0000000..2b0400f --- /dev/null +++ b/SharedProject/Enums/SongGenre.cs @@ -0,0 +1,13 @@ +namespace SharedProject.Enums; + +public enum SongGenre +{ + Pop = 0, + Anime = 1, + Kids = 2, + Vocaloid = 3, + GameMusic = 4, + NamcoOriginal = 5, + Variety = 7, + Classical = 8 +} \ No newline at end of file diff --git a/SharedProject/Models/AiSectionBestData.cs b/SharedProject/Models/AiSectionBestData.cs new file mode 100644 index 0000000..89a8a57 --- /dev/null +++ b/SharedProject/Models/AiSectionBestData.cs @@ -0,0 +1,22 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class AiSectionBestData +{ + public int SectionIndex { get; set; } + + public CrownType Crown { get; set; } + + public bool IsWin { get; set; } + + public uint Score { get; set; } + + public uint GoodCount { get; set; } + + public uint OkCount { get; set; } + + public uint MissCount { get; set; } + + public uint DrumrollCount { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/DanBestData.cs b/SharedProject/Models/DanBestData.cs new file mode 100644 index 0000000..3b0b321 --- /dev/null +++ b/SharedProject/Models/DanBestData.cs @@ -0,0 +1,16 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class DanBestData +{ + public uint DanId { get; set; } + + public DanClearState ClearState { get; set; } + + public uint SoulGaugeTotal { get; set; } + + public uint ComboCountTotal { get; set; } + + public List DanBestStageDataList { get; set; } = new(); +} \ No newline at end of file diff --git a/SharedProject/Models/DanBestStageData.cs b/SharedProject/Models/DanBestStageData.cs new file mode 100644 index 0000000..c4255e9 --- /dev/null +++ b/SharedProject/Models/DanBestStageData.cs @@ -0,0 +1,22 @@ +namespace SharedProject.Models; + +public class DanBestStageData +{ + public uint SongNumber { get; set; } + + public uint PlayScore { get; set; } + + public uint GoodCount { get; set; } + + public uint OkCount { get; set; } + + public uint BadCount { get; set; } + + public uint DrumrollCount { get; set; } + + public uint TotalHitCount { get; set; } + + public uint ComboCount { get; set; } + + public uint HighScore { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/DanData.cs b/SharedProject/Models/DanData.cs new file mode 100644 index 0000000..583e8bf --- /dev/null +++ b/SharedProject/Models/DanData.cs @@ -0,0 +1,66 @@ +using System.Text.Json.Serialization; + +namespace SharedProject.Models; + +public class DanData +{ + [JsonPropertyName("danId")] + public uint DanId { get; set; } + + [JsonPropertyName("title")] + public string Title { get; set; } = string.Empty; + + [JsonPropertyName("verupNo")] + public uint VerupNo { get; set; } + + [JsonPropertyName("aryOdaiSong")] + public List OdaiSongList { get; set; } = new(); + + [JsonPropertyName("aryOdaiBorder")] + public List OdaiBorderList { get; set; } = new(); + + public class OdaiSong + { + [JsonPropertyName("songNo")] + public uint SongNo { get; set; } + + [JsonPropertyName("level")] + public uint Level { get; set; } + + [JsonPropertyName("isHiddenSongName")] + public bool IsHiddenSongName { get; set; } + } + + public class OdaiBorder + { + [JsonPropertyName("odaiType")] + public uint OdaiType { get; set; } + + [JsonPropertyName("borderType")] + public uint BorderType { get; set; } + + [JsonPropertyName("redBorderTotal")] + public uint RedBorderTotal { get; set; } + + [JsonPropertyName("goldBorderTotal")] + public uint GoldBorderTotal { get; set; } + + [JsonPropertyName("redBorder_1")] + public uint RedBorder1 { get; set; } + + [JsonPropertyName("redBorder_2")] + public uint RedBorder2 { get; set; } + + [JsonPropertyName("redBorder_3")] + public uint RedBorder3 { get; set; } + + [JsonPropertyName("goldBorder_1")] + public uint GoldBorder1 { get; set; } + + [JsonPropertyName("goldBorder_2")] + public uint GoldBorder2 { get; set; } + + [JsonPropertyName("goldBorder_3")] + public uint GoldBorder3 { get; set; } + } +} \ No newline at end of file diff --git a/SharedProject/Models/EventFolderData.cs b/SharedProject/Models/EventFolderData.cs new file mode 100644 index 0000000..61e7a93 --- /dev/null +++ b/SharedProject/Models/EventFolderData.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Serialization; + +namespace SharedProject.Models; + +public class EventFolderData +{ + [JsonPropertyName("folderId")] + public uint FolderId { get; set; } + + [JsonPropertyName("verupNo")] + public uint VerupNo { get; set; } + + [JsonPropertyName("priority")] + public uint Priority { get; set; } + + [JsonPropertyName("songNo")] + public uint[]? SongNo { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/PlaySetting.cs b/SharedProject/Models/PlaySetting.cs new file mode 100644 index 0000000..c554bf4 --- /dev/null +++ b/SharedProject/Models/PlaySetting.cs @@ -0,0 +1,14 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class PlaySetting +{ + public uint Speed { get; set; } + + public bool IsVanishOn { get; set; } + + public bool IsInverseOn { get; set; } + + public RandomType RandomType { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/Requests/SetFavoriteRequest.cs b/SharedProject/Models/Requests/SetFavoriteRequest.cs new file mode 100644 index 0000000..a532e99 --- /dev/null +++ b/SharedProject/Models/Requests/SetFavoriteRequest.cs @@ -0,0 +1,8 @@ +namespace SharedProject.Models.Requests; + +public class SetFavoriteRequest +{ + public ulong Baid { get; set; } + public uint SongId { get; set; } + public bool IsFavorite { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/Responses/DanBestDataResponse.cs b/SharedProject/Models/Responses/DanBestDataResponse.cs new file mode 100644 index 0000000..933a9d4 --- /dev/null +++ b/SharedProject/Models/Responses/DanBestDataResponse.cs @@ -0,0 +1,6 @@ +namespace SharedProject.Models.Responses; + +public class DanBestDataResponse +{ + public List DanBestDataList { get; set; } = new(); +} \ No newline at end of file diff --git a/SharedProject/Models/Responses/DashboardResponse.cs b/SharedProject/Models/Responses/DashboardResponse.cs new file mode 100644 index 0000000..4cd1df3 --- /dev/null +++ b/SharedProject/Models/Responses/DashboardResponse.cs @@ -0,0 +1,6 @@ +namespace SharedProject.Models.Responses; + +public class DashboardResponse +{ + public List Users { get; set; } = new(); +} \ No newline at end of file diff --git a/SharedProject/Models/Responses/SongBestResponse.cs b/SharedProject/Models/Responses/SongBestResponse.cs new file mode 100644 index 0000000..ec23280 --- /dev/null +++ b/SharedProject/Models/Responses/SongBestResponse.cs @@ -0,0 +1,6 @@ +namespace SharedProject.Models.Responses; + +public class SongBestResponse +{ + public List SongBestData { get; set; } = new(); +} \ No newline at end of file diff --git a/SharedProject/Models/SongBestData.cs b/SharedProject/Models/SongBestData.cs new file mode 100644 index 0000000..fed0613 --- /dev/null +++ b/SharedProject/Models/SongBestData.cs @@ -0,0 +1,49 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class SongBestData +{ + public uint SongId { get; set; } + + public SongGenre Genre { get; set; } + + public string MusicName { get; set; } = string.Empty; + + public string MusicArtist { get; set; } = string.Empty; + + public Difficulty Difficulty { get; set; } + + public int PlayCount { get; set; } + public int ClearCount { get; set; } + public int FullComboCount { get; set; } + public int PerfectCount { get; set; } + + public uint BestScore { get; set; } + + public uint BestRate { get; set; } + + public CrownType BestCrown { get; set; } + + public ScoreRank BestScoreRank { get; set; } + + public DateTime LastPlayTime { get; set; } + + public bool IsFavorite { get; set; } + + public uint GoodCount { get; set; } + + public uint OkCount { get; set; } + + public uint MissCount { get; set; } + + public uint ComboCount { get; set; } + + public uint HitCount { get; set; } + + public uint DrumrollCount { get; set; } + + public List AiSectionBestData { get; set; } = new(); + + public bool ShowAiData { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/SongIntroductionData.cs b/SharedProject/Models/SongIntroductionData.cs new file mode 100644 index 0000000..fe6f82a --- /dev/null +++ b/SharedProject/Models/SongIntroductionData.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Serialization; + +namespace SharedProject.Models; + +public class SongIntroductionData +{ + [JsonPropertyName("setId")] + public uint SetId { get; set; } + + [JsonPropertyName("verupNo")] + public uint VerupNo { get; set; } + + [JsonPropertyName("mainSongNo")] + public uint MainSongNo { get; set; } + + [JsonPropertyName("subSongNo")] + public uint[]? SubSongNo { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/User.cs b/SharedProject/Models/User.cs new file mode 100644 index 0000000..7f61dad --- /dev/null +++ b/SharedProject/Models/User.cs @@ -0,0 +1,8 @@ +namespace SharedProject.Models; + +public class User +{ + public string AccessCode { get; set; } = string.Empty; + + public ulong Baid { get; set; } +} \ No newline at end of file diff --git a/SharedProject/Models/UserSetting.cs b/SharedProject/Models/UserSetting.cs new file mode 100644 index 0000000..50808a4 --- /dev/null +++ b/SharedProject/Models/UserSetting.cs @@ -0,0 +1,55 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class UserSetting +{ + public uint ToneId { get; set; } + + public bool IsDisplayAchievement { get; set; } + + public bool IsDisplayDanOnNamePlate { get; set; } + + public bool IsVoiceOn { get; set; } + + public bool IsSkipOn { get; set; } + + public Difficulty AchievementDisplayDifficulty { get; set; } + + public PlaySetting PlaySetting { get; set; } = new(); + + public int NotesPosition { get; set; } + + public string MyDonName { get; set; } = string.Empty; + + public string Title { get; set; } = string.Empty; + + public uint TitlePlateId { get; set; } + + public uint Kigurumi { get; set; } + + public uint Head { get; set; } + + public uint Body { get; set; } + + public uint Face { get; set; } + + public uint Puchi { get; set; } + + public List UnlockedKigurumi { get; set; } = new(); + + public List UnlockedHead { get; set; } = new(); + + public List UnlockedBody { get; set; } = new(); + + public List UnlockedFace { get; set; } = new(); + + public List UnlockedPuchi { get; set; } = new(); + + public uint FaceColor { get; set; } + + public uint BodyColor { get; set; } + + public uint LimbColor { get; set; } + +} \ No newline at end of file diff --git a/SharedProject/README.md b/SharedProject/README.md new file mode 100644 index 0000000..3af2da0 --- /dev/null +++ b/SharedProject/README.md @@ -0,0 +1,3 @@ +# Shared Project + +This is the shared project for shared enums/models/utils etc. between server and web ui. \ No newline at end of file diff --git a/SharedProject/SharedProject.csproj b/SharedProject/SharedProject.csproj new file mode 100644 index 0000000..f6af8be --- /dev/null +++ b/SharedProject/SharedProject.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/SharedProject/Utils/PathHelper.cs b/SharedProject/Utils/PathHelper.cs new file mode 100644 index 0000000..e522552 --- /dev/null +++ b/SharedProject/Utils/PathHelper.cs @@ -0,0 +1,24 @@ +namespace SharedProject.Utils; + +public static class PathHelper +{ + public static string GetRootPath() + { + var path = Environment.ProcessPath; + if (path is null) + { + throw new ApplicationException(); + } + var parentPath = Directory.GetParent(path); + if (parentPath is null) + { + throw new ApplicationException(); + } + return Path.Combine(parentPath.ToString(), "wwwroot"); + } + + public static string GetDataPath() + { + return Path.Combine(GetRootPath(), "data"); + } +} \ No newline at end of file diff --git a/SharedProject/Utils/PlaySettingConverter.cs b/SharedProject/Utils/PlaySettingConverter.cs new file mode 100644 index 0000000..ec29632 --- /dev/null +++ b/SharedProject/Utils/PlaySettingConverter.cs @@ -0,0 +1,48 @@ +using System.Buffers.Binary; +using System.Collections; +using System.Collections.Specialized; +using SharedProject.Enums; +using SharedProject.Models; +using Throw; + +namespace SharedProject.Utils; + +public static class PlaySettingConverter +{ + public static PlaySetting ShortToPlaySetting(short input) + { + var bits = new BitVector32(input); + var speedSection = BitVector32.CreateSection(15); + var vanishSection = BitVector32.CreateSection(1, speedSection); + var inverseSection = BitVector32.CreateSection(1, vanishSection); + var randomSection = BitVector32.CreateSection(2, inverseSection); + + var randomType = (RandomType)bits[randomSection]; + randomType.Throw().IfOutOfRange(); + var result = new PlaySetting + { + Speed = (uint)bits[speedSection], + IsVanishOn = bits[vanishSection] == 1, + IsInverseOn = bits[inverseSection] == 1, + RandomType = randomType + }; + + return result; + } + + public static short PlaySettingToShort(PlaySetting setting) + { + var bits = new BitVector32(); + var speedSection = BitVector32.CreateSection(15); + var vanishSection = BitVector32.CreateSection(1, speedSection); + var inverseSection = BitVector32.CreateSection(1, vanishSection); + var randomSection = BitVector32.CreateSection(2, inverseSection); + + bits[speedSection] = (int)setting.Speed; + bits[vanishSection] = setting.IsVanishOn ? 1 : 0; + bits[inverseSection] = setting.IsInverseOn ? 1 : 0; + bits[randomSection] = (int)setting.RandomType; + + return (short)bits.Data; + } +} \ No newline at end of file diff --git a/SharedProject/Utils/ValueHelpers.cs b/SharedProject/Utils/ValueHelpers.cs new file mode 100644 index 0000000..ecfc8e8 --- /dev/null +++ b/SharedProject/Utils/ValueHelpers.cs @@ -0,0 +1,14 @@ +namespace SharedProject.Utils; + +public static class ValueHelpers +{ + public static T Min(T a, T b) where T : IComparable + { + return Comparer.Default.Compare(a, b) <= 0 ? a : b; + } + + public static T Max(T a, T b) where T : IComparable + { + return Comparer.Default.Compare(a, b) >= 0 ? a : b; + } +} \ No newline at end of file diff --git a/TaikoLocalServer.sln b/TaikoLocalServer.sln new file mode 100644 index 0000000..c30c9c8 --- /dev/null +++ b/TaikoLocalServer.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaikoLocalServer", "TaikoLocalServer\TaikoLocalServer.csproj", "{98FDA12C-CD3C-42D0-BEBE-4E809E6E41AC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedProject", "SharedProject\SharedProject.csproj", "{34BAE5CA-D46B-489B-8617-3CEB2C0C614F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TaikoWebUI", "TaikoWebUI\TaikoWebUI.csproj", "{3F02C2B8-D970-4E8D-89AA-1B938DA6E2FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GameDatabase", "GameDatabase\GameDatabase.csproj", "{76F2B4D1-C05E-40F4-B577-095CA7DF0528}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalSaveModScoreMigrator", "LocalSaveModScoreMigrator\LocalSaveModScoreMigrator.csproj", "{72FAD857-4791-4925-8536-22FABD5976EE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {98FDA12C-CD3C-42D0-BEBE-4E809E6E41AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98FDA12C-CD3C-42D0-BEBE-4E809E6E41AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98FDA12C-CD3C-42D0-BEBE-4E809E6E41AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98FDA12C-CD3C-42D0-BEBE-4E809E6E41AC}.Release|Any CPU.Build.0 = Release|Any CPU + {34BAE5CA-D46B-489B-8617-3CEB2C0C614F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34BAE5CA-D46B-489B-8617-3CEB2C0C614F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34BAE5CA-D46B-489B-8617-3CEB2C0C614F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34BAE5CA-D46B-489B-8617-3CEB2C0C614F}.Release|Any CPU.Build.0 = Release|Any CPU + {3F02C2B8-D970-4E8D-89AA-1B938DA6E2FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F02C2B8-D970-4E8D-89AA-1B938DA6E2FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F02C2B8-D970-4E8D-89AA-1B938DA6E2FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F02C2B8-D970-4E8D-89AA-1B938DA6E2FE}.Release|Any CPU.Build.0 = Release|Any CPU + {76F2B4D1-C05E-40F4-B577-095CA7DF0528}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76F2B4D1-C05E-40F4-B577-095CA7DF0528}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76F2B4D1-C05E-40F4-B577-095CA7DF0528}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76F2B4D1-C05E-40F4-B577-095CA7DF0528}.Release|Any CPU.Build.0 = Release|Any CPU + {72FAD857-4791-4925-8536-22FABD5976EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72FAD857-4791-4925-8536-22FABD5976EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72FAD857-4791-4925-8536-22FABD5976EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72FAD857-4791-4925-8536-22FABD5976EE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9CF7BC99-7D07-47BA-A735-B292D48174C4} + EndGlobalSection +EndGlobal diff --git a/TaikoLocalServer.sln.DotSettings b/TaikoLocalServer.sln.DotSettings new file mode 100644 index 0000000..abd12a3 --- /dev/null +++ b/TaikoLocalServer.sln.DotSettings @@ -0,0 +1,6 @@ + + True + True + True + True + True \ No newline at end of file diff --git a/TaikoLocalServer/.config/dotnet-tools.json b/TaikoLocalServer/.config/dotnet-tools.json new file mode 100644 index 0000000..98091c9 --- /dev/null +++ b/TaikoLocalServer/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "6.0.8", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/TaikoLocalServer/.gitignore b/TaikoLocalServer/.gitignore new file mode 100644 index 0000000..388d155 --- /dev/null +++ b/TaikoLocalServer/.gitignore @@ -0,0 +1 @@ +wwwroot/data/music_attribute.json \ No newline at end of file diff --git a/TaikoLocalServer/Certificates/cert.pfx b/TaikoLocalServer/Certificates/cert.pfx new file mode 100644 index 0000000000000000000000000000000000000000..b703cde823635c2df6343fce4b5056fdbc6f2726 GIT binary patch literal 2781 zcmV<33L^C|f(qFJ0Ru3C3ZDiEDuzgg_YDCD0ic2kkOYDXj4*-x-xe~@*GjlsAoQw`VD}c3K9IqSTfU*&J#Wk zHgH%uQ2P+P_GJnr3_}uaJ2 zs^#4l<5MRNM9vpwwj~5<O@;1T8U$OY^f#U*e0se)4}#wTbBC-dNx?05e%do;b;fg_i28M1|lqNckJ1 z0tG@wJn_oebykGy!Gy(?$U0rndaM;8aEU7P3W@be*?|S+3lc{&CuTkO;W){6CmUln zvtTpUq^PjA<$2lBSU7O`KaIzF#qD$4@17Gp`sRp!BXsMrg0Oki6TvA&ZvPhvvgDTX zjX+lE(YO`Sqh@>t1bM~fhmg~_iiWt0 zKYe?4ALR_P;*c7HFy4!BdHaOu$eV5ppZ4hmlDf~!v~!=FaK+OlDp#5CkWM8JBkXG# z1tMbka$~0FHuU!C-oZK!*KZ#Igv{hB-!|$mpihEfVvmRG<3xBRG@IV)42x#1ZwL{a z#0@xrm_qxO*vzz8=5=O)+PirKG{yIS!d+e;@j5BnO=JGAj4+%|d7JC(AGJztMce2p zma_kEAxUaBAG=)AwIy=ecpgT5iI^uyqLR~-v5y6sZG9N?ne2UbI& z73&mUcW4!z5j0t<0md^2U>EbgqzG_-R4e*y{^UmWc)e`!lR}?k)FTQ@NILd+mKR!?)vovrN|6>L}k$Pc96MdoQ-x;errZzZ;Faz*Als_##a}e@Aq^X%;u{*A-JXoICbb2$CV$W2LF0{vgv%AA-jWoh zN%sNp4JzTo+IWeY9)as)8s%n6xTe*#5VO;c)W&6Y#?woDTYvyy_*^s+Pf6X&Zhkhk zLR&{SVoLGu2u?827y9KjyXn~RT{pVP*+E*!!?mcxqLNe{&=RFO#=R&v?w_=6h1it| zeA&~zGnjq|Oak~uihj;0RrmF+v!*)dqHak0zPm7Dk>O7Un*E8aIYj-PhJ7wxMnmbB z>QpTCYLx6LAz2}-P99#_Dlx(&{z-3TEzhR>>`#twt&Id##Y$;|YA!$GSAs;UJ=LEX zwQLUF^1FV#?L=!bp4_k#qN5O>-n-|+{lFvv4tkK&&( zMjl@>N&GtV9pWvKrO}k>x^!2^y(bscw}!&aJfh-DM~4x0FoFd^1_>&LNQUPW zLKFeB_f*lY6TPZ!Rgnwh5Z`v~N}&Ac$CJOaF+L|jXpyJjZ%^n16inV5bBVlL3v&p# z!Se5|+2*PMD47fkl4CQ=K{KN?^Qz`Nzrd`ETe8Gt9`e!x^{v zn2tzG;GJuos$`9#OBkee^f(NmV5fZ_a(O}n`~#{@AIS`7{Ae9BpmPYBA-}W^{v`=% zMF!cN3%@6%EzjqiaY0k@C>J>m-oyJGk0B|FP3m-=E5#X-KZtSi7Npq>Pc|{O1K1R1 zZI;OH9op<2!;v`_B9;!#?2sXs$tFHAx+{(FWuU5QSZaS1DrCO?qlvtpox4yZH`r#} z_>~`EVImy1dccB0P>ZY=(ijXCj|&i0WdO7ld6@k%s&>w4L?582(SaxFiTWD&W(%%PGtptrVGWPp%L zdwQjvSYaaiYmBe+X{5Pya_Yw+#nKoFQCWEqRmufypz2j>+DGnk$E0pbH?~Lc#Ar7&5wy4TZkrpg+EW8pt8->qq^}cPGL_GxNlqLh^3SG9BsjT?x;gUI;#{nw|QJK-%YSw*+x{$zn_!#kroBRzA}V;2$Tw;*nVY zU~7{NiDb!`Ld$BQ!`1UB-K{j>>NS^{8Ju`0Epj@-Y#jba`1M?mFoxTzIWR&8)^xzw+7J8KG<}-aCClUGEVDy4}*$_TkqE zS9hr;1Nes~eht4Oox{iu4N1XG$VRaU(707BRKEiF%n4m|`vEQAGy(S&0H*#2lrIBd zaTxo86KT?3%*a|BZa~^!zC_Z8K4ef6qQDYGmS&@H{LmJ$J`67edSb(>VDnX-%V>Zl zHTp#xk#%zH{7DZ{FbFi=*^te)7hir91WqPhCnH!{$QH^n?JGP|3=*C|zG(gVkzTOL zzs7tIdeR3H0rni)SfT!WEZv5540zTfEYY}(@&pQKj-)EDm<8$GG!(l&b${V~!rSS& zrNZut&fYb1V)V%woYU5@6XP>iYZZCu7@}?B+3UV^aYao<{V5xAwB~%#0;*0yB}qFk zk@zsuMl?$7%djUCnHrAmZ%{{`Y(!CR@ka1VMlP*oTYHvDgqNh-f$I&r^`m1Gd;T2L zeoxgHA+N8HX?U>Kk(O`*9pSVc>~q>;4#40xU}{4uNxW{Pj=-{H61h~bf=MwYFe3&D zDuzgg_YDCF6)_eB6ei~Lk0QirTYBCkG)hUirF`9YCNMEDAutIB1uG5%0vZJX1QhBI j)dlwk-yW|l`tCfv95;U7i?jp?e?G*9wp2{@0s;sC);ciX literal 0 HcmV?d00001 diff --git a/TaikoLocalServer/Certificates/root.pfx b/TaikoLocalServer/Certificates/root.pfx new file mode 100644 index 0000000000000000000000000000000000000000..a40e669d776b2c7ef23b04b2b3030fbaed318488 GIT binary patch literal 2653 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�vI*32~bBtCkA5S7M9%rVMrjd8q{fu%SJ3iQV^zaeW0&8--e%AP8(^#=vm zU%Z+|k+~y*y>EK7Zx$%BAhYU7c=(kdypg7hLL>gGBUDaz7g+WI7IyrjQ!h!)MOv2+ zs2F|&HONKlqTy($AVf=C0Hgo`fMtOQfta>QmCM?Xl*s!%(*|-bPk_O~_g4Amw1#7B H{wVn`_9Wp^ literal 0 HcmV?d00001 diff --git a/TaikoLocalServer/Common/Constants.cs b/TaikoLocalServer/Common/Constants.cs new file mode 100644 index 0000000..71c96c3 --- /dev/null +++ b/TaikoLocalServer/Common/Constants.cs @@ -0,0 +1,48 @@ +namespace TaikoLocalServer.Common; + +public static class Constants +{ + public const string DATE_TIME_FORMAT = "yyyyMMddHHmmss"; + + public const int MUSIC_ID_MAX = 1599; + + public const int MUSIC_ID_MAX_EXPANDED = 9000; + + public const string DEFAULT_DB_NAME = "taiko.db3"; + + public const string MUSIC_INFO_FILE_NAME = "musicinfo.json"; + public const string MUSIC_INFO_COMPRESSED_FILE_NAME = "musicinfo.bin"; + + public const string MUSIC_ATTRIBUTE_FILE_NAME = "music_attribute.json"; + public const string MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME = "music_attribute.bin"; + + public const string DAN_DATA_FILE_NAME = "dan_data.json"; + public const string INTRO_DATA_FILE_NAME = "intro_data.json"; + public const string EVENT_FOLDER_DATA_FILE_NAME = "event_folder_data.json"; + + public static readonly int[] EVENT_FOLDER_IDS = { + 1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14 + }; + + public const int MIN_DAN_ID = 1; + public const int MAX_DAN_ID = 19; + + public const int TONE_UID_MAX = 19; + + public const int TITLE_UID_MAX = 814; + + private const int COSTUME_FLAG_1_ARRAY_SIZE = 154; + private const int COSTUME_FLAG_2_ARRAY_SIZE = 140; + private const int COSTUME_FLAG_3_ARRAY_SIZE = 156; + private const int COSTUME_FLAG_4_ARRAY_SIZE = 58; + private const int COSTUME_FLAG_5_ARRAY_SIZE = 129; + public static readonly int[] CostumeFlagArraySizes = + { + COSTUME_FLAG_1_ARRAY_SIZE, + COSTUME_FLAG_2_ARRAY_SIZE, + COSTUME_FLAG_3_ARRAY_SIZE, + COSTUME_FLAG_4_ARRAY_SIZE, + COSTUME_FLAG_5_ARRAY_SIZE + + }; +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/OrderedSet.cs b/TaikoLocalServer/Common/OrderedSet.cs new file mode 100644 index 0000000..f983fad --- /dev/null +++ b/TaikoLocalServer/Common/OrderedSet.cs @@ -0,0 +1,73 @@ +using System.Collections; + +namespace TaikoLocalServer.Common; + +public class OrderedSet : ICollection where T : notnull +{ + private readonly IDictionary> dictionary; + private readonly LinkedList linkedList; + + public OrderedSet() + : this(EqualityComparer.Default) + { + } + + public OrderedSet(IEqualityComparer comparer) + { + dictionary = new Dictionary>(comparer); + linkedList = new LinkedList(); + } + + public int Count => dictionary.Count; + + public virtual bool IsReadOnly => dictionary.IsReadOnly; + + void ICollection.Add(T item) + { + Add(item); + } + + public bool Add(T item) + { + if (dictionary.ContainsKey(item)) return false; + var node = linkedList.AddLast(item); + dictionary.Add(item, node); + return true; + } + + public void Clear() + { + linkedList.Clear(); + dictionary.Clear(); + } + + public bool Remove(T? item) + { + if (item == null) return false; + var found = dictionary.TryGetValue(item, out var node); + if (!found) return false; + dictionary.Remove(item); + if (node != null) linkedList.Remove(node); + return true; + } + + public IEnumerator GetEnumerator() + { + return linkedList.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Contains(T? item) + { + return item != null && dictionary.ContainsKey(item); + } + + public void CopyTo(T[] array, int arrayIndex) + { + linkedList.CopyTo(array, arrayIndex); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/Extensions.cs b/TaikoLocalServer/Common/Utils/Extensions.cs new file mode 100644 index 0000000..24ad916 --- /dev/null +++ b/TaikoLocalServer/Common/Utils/Extensions.cs @@ -0,0 +1,24 @@ +using GameDatabase.Entities; +using SharedProject.Utils; + +namespace TaikoLocalServer.Common.Utils; + +public static class Extensions +{ + public static void UpdateBest(this AiSectionScoreDatum datum, PlayResultDataRequest.StageData.AiStageSectionData sectionData) + { + var crown = (CrownType)sectionData.Crown; + if (crown == CrownType.Gold && sectionData.OkCnt == 0) + { + crown = CrownType.Dondaful; + } + + datum.IsWin = sectionData.IsWin ? sectionData.IsWin : datum.IsWin; + datum.Crown = ValueHelpers.Max(crown, datum.Crown); + datum.Score = ValueHelpers.Max(sectionData.Score, datum.Score); + datum.GoodCount = ValueHelpers.Max(sectionData.GoodCnt, datum.GoodCount); + datum.OkCount = ValueHelpers.Min(sectionData.OkCnt, datum.OkCount); + datum.MissCount = ValueHelpers.Min(sectionData.NgCnt, datum.MissCount); + datum.DrumrollCount = ValueHelpers.Max(sectionData.PoundCnt, datum.DrumrollCount); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/FlagCalculator.cs b/TaikoLocalServer/Common/Utils/FlagCalculator.cs new file mode 100644 index 0000000..643070f --- /dev/null +++ b/TaikoLocalServer/Common/Utils/FlagCalculator.cs @@ -0,0 +1,129 @@ +using System.Collections; +using System.Collections.Specialized; +using System.Runtime.InteropServices; +using GameDatabase.Entities; + +namespace TaikoLocalServer.Common.Utils; + +public static class FlagCalculator +{ + public static byte ComputeDondafulCrownFlag(byte previous, Difficulty difficulty) + { + // ReSharper disable once ArrangeRedundantParentheses + var flag = 1 << ((int)difficulty - 1); + return (byte)(previous | flag); + } + + public static ushort ComputeCrownFlag(ushort previous, CrownType crownType, Difficulty difficulty) + { + int flagBase; + switch (crownType) + { + case CrownType.Clear: + flagBase = 0b10; + break; + case CrownType.Gold: + flagBase = 0b11; + break; + case CrownType.None: + case CrownType.Dondaful: + default: + throw new ArgumentOutOfRangeException(nameof(crownType), crownType, null); + } + var offset = ((int)difficulty - 1) * 2; + var flag = (ushort)(flagBase << offset); + return (ushort)(previous | flag); + } + + public static byte ComputeKiwamiScoreRankFlag(byte previous, Difficulty difficulty) + { + // ReSharper disable once ArrangeRedundantParentheses + var result = 1 << ((int)difficulty - 1); + return (byte)(previous | result); + } + + public static ushort ComputeMiyabiOrIkiScoreRank(ushort previous, ScoreRank scoreRank, Difficulty difficulty) + { + int resultBase; + switch (scoreRank) + { + case ScoreRank.White: + case ScoreRank.Gold: + resultBase = 0b01; + break; + case ScoreRank.Bronze: + case ScoreRank.Sakura: + resultBase = 0b10; + break; + case ScoreRank.Silver: + case ScoreRank.Purple: + resultBase = 0b11; + break; + case ScoreRank.None: + case ScoreRank.Dondaful: + default: + throw new ArgumentOutOfRangeException(nameof(scoreRank), scoreRank, "Score rank out of range"); + } + var offset = ((int)difficulty - 1) * 2; + var result = resultBase << offset; + + return (ushort)(previous | result); + } + + public static byte[] ComputeGotDanFlags(List danScoreData) + { + var gotDanFlagList = new List(); + var gotDanFlag = new BitVector32(); + var section1 = BitVector32.CreateSection(8); + var section2 = BitVector32.CreateSection(8, section1); + var section3 = BitVector32.CreateSection(8, section2); + var section4 = BitVector32.CreateSection(8, section3); + var section5 = BitVector32.CreateSection(8, section4); + var section6 = BitVector32.CreateSection(8, section5); + var section7 = BitVector32.CreateSection(8, section6); + var section8 = BitVector32.CreateSection(8, section7); + + var sections = new[] { section1, section2, section3, section4, section5, section6, section7, section8 }; + + for (var i = Constants.MIN_DAN_ID; i < Constants.MAX_DAN_ID; i++) + { + var danId = i; + var flag = 0; + if (danScoreData.Any(datum => datum.DanId == danId)) + { + var danScore = danScoreData.First(datum => datum.DanId == danId); + flag = (int)danScore.ClearState + 1; + } + var section = sections[(danId - 1) % 8]; + gotDanFlag[section] = flag; + + if (!section.Equals(section8)) + { + continue; + } + gotDanFlagList.Add(gotDanFlag.Data); + gotDanFlag = new BitVector32(); + } + + gotDanFlagList.Add(gotDanFlag.Data); + return MemoryMarshal.AsBytes(new ReadOnlySpan(gotDanFlagList.ToArray())).ToArray(); + } + + public static byte[] GetBitArrayFromIds(IEnumerable idArray, int bitArraySize, ILogger logger) + { + var result = new byte[bitArraySize / 8 + 1]; + var bitSet = new BitArray(bitArraySize + 1); + foreach (var id in idArray) + { + if (id >= bitArraySize) + { + logger.LogWarning("Id {Id} out of range!", id); + continue; + } + bitSet.Set((int)id, true); + } + bitSet.CopyTo(result, 0); + + return result; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/FormOutputUtil.cs b/TaikoLocalServer/Common/Utils/FormOutputUtil.cs new file mode 100644 index 0000000..2c5eccb --- /dev/null +++ b/TaikoLocalServer/Common/Utils/FormOutputUtil.cs @@ -0,0 +1,20 @@ +using System.Text; + +namespace TaikoLocalServer.Common.Utils; + +public static class FormOutputUtil +{ + public static string ToFormOutput(Dictionary response) + { + var responseStr = new StringBuilder(); + foreach (var pair in response) + { + responseStr.Append(pair.Key) + .Append('=') + .Append(pair.Value) + .Append('&'); + } + + return responseStr.ToString().TrimEnd('&'); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/GZipBytesUtil.cs b/TaikoLocalServer/Common/Utils/GZipBytesUtil.cs new file mode 100644 index 0000000..35a30aa --- /dev/null +++ b/TaikoLocalServer/Common/Utils/GZipBytesUtil.cs @@ -0,0 +1,61 @@ +using System.Runtime.InteropServices; +using System.Text; +using ICSharpCode.SharpZipLib.GZip; + +namespace TaikoLocalServer.Common.Utils; + +public static class GZipBytesUtil +{ + public static MemoryStream GenerateStreamFromString(string value) + { + return new MemoryStream(Encoding.UTF8.GetBytes(value)); + } + + public static byte[] GetEmptyJsonGZipBytes() + { + var outputStream = new MemoryStream(1024); + using (var stream = new GZipOutputStream(outputStream)) + using (var writer = new StreamWriter(stream, Encoding.UTF8)) + { + /*writer.AutoFlush = true; + writer.WriteLine("{}");*/ + stream.Write(Array.Empty()); + } + + return outputStream.ToArray(); + } + + public static byte[] GetGZipBytes(byte[] input) + { + var outputStream = new MemoryStream(1024); + using (var stream = new GZipOutputStream(outputStream)) + { + stream.Write(input); + } + + return outputStream.ToArray(); + } + + public static byte[] GetGZipBytes(T[] data) where T : struct + { + var outputStream = new MemoryStream(1024); + using (var stream = new GZipOutputStream(outputStream)) + { + var byteRef = MemoryMarshal.AsBytes(new ReadOnlySpan(data)); + stream.Write(byteRef); + } + + return outputStream.ToArray(); + } + + public static byte[] DecompressGZipBytes(byte[] input) + { + using (var inputStream = new MemoryStream(input)) + using (var stream = new GZipInputStream(inputStream)) + using (var outputStream = new MemoryStream(1024)) + { + stream.CopyTo(outputStream); + return outputStream.ToArray(); + } + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/JsonHelper.cs b/TaikoLocalServer/Common/Utils/JsonHelper.cs new file mode 100644 index 0000000..49549d7 --- /dev/null +++ b/TaikoLocalServer/Common/Utils/JsonHelper.cs @@ -0,0 +1,53 @@ +using System.Text.Json; +using GameDatabase.Entities; + +namespace TaikoLocalServer.Common.Utils; + +public static class JsonHelper +{ + public static List GetCostumeDataFromUserData(UserDatum userData, ILogger logger) + { + var costumeData = new List { 0, 0, 0, 0, 0 }; + try + { + costumeData = JsonSerializer.Deserialize>(userData.CostumeData); + } + catch (JsonException e) + { + logger.LogError(e, "Parsing costume json data failed"); + } + + if (costumeData != null && costumeData.Count >= 5) + { + return costumeData; + } + + logger.LogWarning("Costume data is null or count less than 5!"); + costumeData = new List { 0, 0, 0, 0, 0 }; + + return costumeData; + } + + public static List> GetCostumeUnlockDataFromUserData(UserDatum userData, ILogger logger) + { + var costumeUnlockData = new List> { new(), new(), new(), new(), new() }; + try + { + costumeUnlockData = JsonSerializer.Deserialize>>(userData.CostumeFlgArray); + } + catch (JsonException e) + { + logger.LogError(e, "Parsing costume json data failed"); + } + + if (costumeUnlockData != null && costumeUnlockData.Count >= 5) + { + return costumeUnlockData; + } + + logger.LogWarning("Costume unlock data is null or count less than 5!"); + costumeUnlockData = new List> { new(), new(), new(), new(), new() }; + + return costumeUnlockData; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/ObjectMappers.cs b/TaikoLocalServer/Common/Utils/ObjectMappers.cs new file mode 100644 index 0000000..b873c73 --- /dev/null +++ b/TaikoLocalServer/Common/Utils/ObjectMappers.cs @@ -0,0 +1,26 @@ +using GameDatabase.Entities; +using Swan.Mapping; + +namespace TaikoLocalServer.Common.Utils; + +using DanScoreDataStage = GetDanScoreResponse.DanScoreData.DanScoreDataStage; + +public static class ObjectMappers +{ + + public static readonly IObjectMap DanStageDbToResponseMap; + + static ObjectMappers() + { + var mapper = new ObjectMapper(); + DanStageDbToResponseMap = mapper.AddMap() + .Add(t => t.ComboCnt, s => s.ComboCount) + .Add(t => t.GoodCnt, s => s.GoodCount) + .Add(t => t.OkCnt, s => s.OkCount) + .Add(t => t.NgCnt, s => s.BadCount) + .Add(t => t.HitCnt, s => s.TotalHitCount) + .Add(t => t.PoundCnt, s => s.DrumrollCount) + .Add(t => t.PlayScore, s => s.PlayScore) + .Add(t => t.HighScore, s => s.HighScore); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/DataSettings.json b/TaikoLocalServer/Configurations/DataSettings.json new file mode 100644 index 0000000..3e01ff6 --- /dev/null +++ b/TaikoLocalServer/Configurations/DataSettings.json @@ -0,0 +1,7 @@ +{ + "DataSettings" : { + "DanDataFileName" : "dan_data.json", + "EventFolderDataFileName" : "event_folder_data.json", + "IntroDataFileName" : "intro_data.json" + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/Database.json b/TaikoLocalServer/Configurations/Database.json new file mode 100644 index 0000000..1dbc08c --- /dev/null +++ b/TaikoLocalServer/Configurations/Database.json @@ -0,0 +1,3 @@ +{ + "DbFileName" : "taiko.db3" +} \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/Kestrel.json b/TaikoLocalServer/Configurations/Kestrel.json new file mode 100644 index 0000000..1254ce2 --- /dev/null +++ b/TaikoLocalServer/Configurations/Kestrel.json @@ -0,0 +1,28 @@ +{ + "Kestrel": { + "Endpoints": { + "BaseServer": { + "Url": "http://0.0.0.0:5000" + }, + "AmAuthServer": { + "Url": "http://0.0.0.0:80" + }, + "MuchaServer": { + "Url": "https://0.0.0.0:10122" + }, + "GameServer1": { + "Url": "https://0.0.0.0:57402" + }, + "GameServer2": { + "Url": "https://0.0.0.0:54431" + } + }, + "Certificates": { + "Default": { + "Path": "Certificates/cert.pfx", + "Password": "", + "AllowInvalid": true + } + } + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/Logging.json b/TaikoLocalServer/Configurations/Logging.json new file mode 100644 index 0000000..5a5b182 --- /dev/null +++ b/TaikoLocalServer/Configurations/Logging.json @@ -0,0 +1,27 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.AspNetCore": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "Filter": [ + { + "Name": "ByExcluding", + "Args": { + "expression": "@mt = 'An unhandled exception has occurred while executing the request.'" + } + } + ], + "WriteTo": [ + { + "Name": "File", + "Args": { "path": "./Logs/log-.txt", "rollingInterval": "Day" } + } + ] + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/ServerSettings.json b/TaikoLocalServer/Configurations/ServerSettings.json new file mode 100644 index 0000000..31294fb --- /dev/null +++ b/TaikoLocalServer/Configurations/ServerSettings.json @@ -0,0 +1,7 @@ +{ + "ServerSettings": { + "MuchaUrl": "https://v402-front.mucha-prd.nbgi-amnet.jp:10122", + "GameUrl": "vsapi.taiko-p.jp", + "EnableMoreSongs": false + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/AmAuth/PowerOnController.cs b/TaikoLocalServer/Controllers/AmAuth/PowerOnController.cs new file mode 100644 index 0000000..06c203a --- /dev/null +++ b/TaikoLocalServer/Controllers/AmAuth/PowerOnController.cs @@ -0,0 +1,50 @@ +using Microsoft.Extensions.Options; +using TaikoLocalServer.Settings; + +namespace TaikoLocalServer.Controllers.AmAuth; + +[ApiController] +[Route("/sys/servlet/PowerOn")] +public class PowerOnController : BaseController +{ + private readonly ServerSettings settings; + + public PowerOnController(IOptions settings) + { + this.settings = settings.Value; + } + + [HttpPost] + public ContentResult PowerOn([FromForm] PowerOnRequest request) + { + Logger.LogInformation("Power on request: {Request}",request.Stringify()); + var now = DateTime.Now; + var response = new Dictionary + { + {"stat", "1"}, + {"uri", settings.GameUrl}, + {"host", settings.GameUrl}, + {"place_id", "JPN0123"}, + {"name", "NAMCO"}, + {"nickname", "NAMCO"}, + {"region0", "1"}, + {"region_name0", "NAMCO"}, + {"region_name1", "X"}, + {"region_name2", "Y"}, + {"region_name3", "Z"}, + {"country", "JPN"}, + {"allnet_id", "456"}, + {"timezone", "002,00"}, + {"setting", ""}, + {"year", now.Year.ToString()}, + {"month", now.Month.ToString()}, + {"day", now.Day.ToString()}, + {"hour", now.Hour.ToString()}, + {"minute", now.Minute.ToString()}, + {"second", now.Second.ToString()}, + {"res_class", "PowerOnResponseVer2"}, + {"token", "123"} + }; + return Content(FormOutputUtil.ToFormOutput(response) + '\n'); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/AmUpdater/MuchaController.cs b/TaikoLocalServer/Controllers/AmUpdater/MuchaController.cs new file mode 100644 index 0000000..22b8895 --- /dev/null +++ b/TaikoLocalServer/Controllers/AmUpdater/MuchaController.cs @@ -0,0 +1,87 @@ +using Microsoft.Extensions.Options; +using TaikoLocalServer.Settings; + +namespace TaikoLocalServer.Controllers.AmUpdater; + +public class MuchaController : BaseController +{ + private readonly ServerSettings settings; + + public MuchaController(IOptions settings) + { + this.settings = settings.Value; + } + + [HttpPost("/mucha_front/boardauth.do")] + + public ContentResult BoardAuth([FromForm] MuchaUpdateCheckRequest request) + { + Logger.LogInformation("Mucha request: {Request}", request.Stringify()); + var serverTime = DateTime.Now.ToString("yyyyMMddHHmm"); + var utcServerTime = DateTime.UtcNow.ToString("yyyyMMddHHmm"); + var response = new Dictionary + { + { "RESULTS", "001" }, + { "AREA_0", "008" }, + { "AREA_0_EN", "" }, + { "AREA_1", "009" }, + { "AREA_1_EN", "" }, + { "AREA_2", "010" }, + { "AREA_2_EN", "" }, + { "AREA_3", "011" }, + { "AREA_3_EN", "" }, + { "AREA_FULL_0", "" }, + { "AREA_FULL_0_EN", "" }, + { "AREA_FULL_1", "" }, + { "AREA_FULL_1_EN", "" }, + { "AREA_FULL_2", "" }, + { "AREA_FULL_2_EN", "" }, + { "AREA_FULL_3", "" }, + { "AREA_FULL_3_EN", "" }, + { "AUTH_INTERVAL", "86400" }, + { "CHARGE_URL", $"{settings.MuchaUrl}/charge/" }, + { "CONSUME_TOKEN", "0" }, + { "COUNTRY_CD", "JPN" }, + { "DONGLE_FLG", "1" }, + { "EXPIRATION_DATE", "null" }, + { "FILE_URL", $"{settings.MuchaUrl}/file/" }, + { "FORCE_BOOT", "0" }, + { "PLACE_ID", request.PlaceId ?? "" }, + { "PREFECTURE_ID", "14" }, + { "SERVER_TIME", serverTime }, + { "UTC_SERVER_TIME", utcServerTime }, + { "SHOP_NAME", "NAMCO" }, + { "SHOP_NAME_EN", "NAMCO" }, + { "SHOP_NICKNAME", "W" }, + { "SHOP_NICKNAME_EN", "W" }, + { "URL_1", $"{settings.MuchaUrl}/url1/" }, + { "URL_2", $"{settings.MuchaUrl}/url2/" }, + { "URL_3", $"{settings.MuchaUrl}/url3/" }, + { "USE_TOKEN", "0" } + }; + var formOutput = FormOutputUtil.ToFormOutput(response); + return Content(formOutput); + } + + [HttpPost("/mucha_front/updatacheck.do")] + public ContentResult UpdateCheck(MuchaBoardAuthRequest request) + { + Logger.LogInformation("Request is {Request}", request.Stringify()); + var response = new Dictionary + { + { "RESULTS", "001" }, + { "UPDATE_VER_1", request.GameVersion ?? "S1210JPN08.18" }, + { "UPDATE_URL_1", $"{settings.MuchaUrl}/updUrl1/" }, + { "UPDATE_SIZE_1", "0" }, + { "UPDATE_CRC_1", "0000000000000000" }, + { "CHECK_URL_1", $"{settings.MuchaUrl}/checkUrl/" }, + { "EXE_VER_1", request.GameVersion ?? "S1210JPN08.18" }, + { "INFO_SIZE_1", "0" }, + { "COM_SIZE_1", "0" }, + { "COM_TIME_1", "0" }, + { "LAN_INFO_SIZE_1", "0" } + }; + var formOutput = FormOutputUtil.ToFormOutput(response); + return Content(formOutput); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Api/CardsController.cs b/TaikoLocalServer/Controllers/Api/CardsController.cs new file mode 100644 index 0000000..bbbea64 --- /dev/null +++ b/TaikoLocalServer/Controllers/Api/CardsController.cs @@ -0,0 +1,22 @@ +namespace TaikoLocalServer.Controllers.Api; + +[ApiController] +[Route("api/[controller]")] +public class CardsController : BaseController +{ + private readonly ICardService cardService; + + public CardsController(ICardService cardService) + { + this.cardService = cardService; + } + + [HttpDelete("{accessCode}")] + public async Task DeleteUser(string accessCode) + { + var result = await cardService.DeleteCard(accessCode); + + return result ? NoContent() : NotFound(); + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Api/DanBestDataController.cs b/TaikoLocalServer/Controllers/Api/DanBestDataController.cs new file mode 100644 index 0000000..184f110 --- /dev/null +++ b/TaikoLocalServer/Controllers/Api/DanBestDataController.cs @@ -0,0 +1,35 @@ +using SharedProject.Models; +using SharedProject.Models.Responses; +using Swan.Mapping; + +namespace TaikoLocalServer.Controllers.Api; + +[ApiController] +[Route("api/[controller]")] +public class DanBestDataController : BaseController +{ + private readonly IDanScoreDatumService danScoreDatumService; + + public DanBestDataController(IDanScoreDatumService danScoreDatumService) { + this.danScoreDatumService = danScoreDatumService; + } + + [HttpGet("{baid}")] + public async Task GetDanBestData(ulong baid) + { + var danScores = await danScoreDatumService.GetDanScoreDatumByBaid(baid); + var danDataList = new List(); + + foreach (var danScore in danScores) + { + var danData = danScore.CopyPropertiesToNew(); + danData.DanBestStageDataList = danScore.DanStageScoreData.Select(datum => datum.CopyPropertiesToNew()).ToList(); + danDataList.Add(danData); + } + + return Ok(new DanBestDataResponse + { + DanBestDataList = danDataList + }); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Api/DashboardController.cs b/TaikoLocalServer/Controllers/Api/DashboardController.cs new file mode 100644 index 0000000..be07c28 --- /dev/null +++ b/TaikoLocalServer/Controllers/Api/DashboardController.cs @@ -0,0 +1,26 @@ +using SharedProject.Models.Responses; + +namespace TaikoLocalServer.Controllers.Api; + +[ApiController] +[Route("/api/[controller]")] +public class DashboardController : BaseController +{ + private readonly ICardService cardService; + + public DashboardController(ICardService cardService) + { + this.cardService = cardService; + } + + [HttpGet] + public async Task GetDashboard() + { + var users = await cardService.GetUsersFromCards(); + return new DashboardResponse + { + Users = users + }; + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Api/FavoriteSongsController.cs b/TaikoLocalServer/Controllers/Api/FavoriteSongsController.cs new file mode 100644 index 0000000..f3c59c0 --- /dev/null +++ b/TaikoLocalServer/Controllers/Api/FavoriteSongsController.cs @@ -0,0 +1,29 @@ +using SharedProject.Models.Requests; + +namespace TaikoLocalServer.Controllers.Api; + +[ApiController] +[Route("api/[controller]")] +public class FavoriteSongsController : BaseController +{ + private readonly IUserDatumService userDatumService; + + public FavoriteSongsController(IUserDatumService userDatumService) + { + this.userDatumService = userDatumService; + } + + [HttpPost] + public async Task UpdateFavoriteSong(SetFavoriteRequest request) + { + var user = await userDatumService.GetFirstUserDatumOrNull(request.Baid); + + if (user is null) + { + return NotFound(); + } + + await userDatumService.UpdateFavoriteSong(request.Baid, request.SongId, request.IsFavorite); + return NoContent(); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Api/PlayDataController.cs b/TaikoLocalServer/Controllers/Api/PlayDataController.cs new file mode 100644 index 0000000..95b5766 --- /dev/null +++ b/TaikoLocalServer/Controllers/Api/PlayDataController.cs @@ -0,0 +1,55 @@ +using SharedProject.Models.Responses; + +namespace TaikoLocalServer.Controllers.Api; + +[ApiController] +[Route("api/[controller]")] +public class PlayDataController : BaseController +{ + private readonly IUserDatumService userDatumService; + + private readonly ISongBestDatumService songBestDatumService; + + private readonly ISongPlayDatumService songPlayDatumService; + + public PlayDataController(IUserDatumService userDatumService, ISongBestDatumService songBestDatumService, + ISongPlayDatumService songPlayDatumService) + { + this.userDatumService = userDatumService; + this.songBestDatumService = songBestDatumService; + this.songPlayDatumService = songPlayDatumService; + } + + [HttpGet("{baid}")] + public async Task> GetSongBestRecords(ulong baid) + { + var user = await userDatumService.GetFirstUserDatumOrNull(baid); + if (user is null) + { + return NotFound(); + } + + var songBestRecords = await songBestDatumService.GetAllSongBestAsModel(baid); + var playLogs = await songPlayDatumService.GetSongPlayDatumByBaid(baid); + foreach (var songBestData in songBestRecords) + { + var songPlayLogs = playLogs.Where(datum => datum.SongId == songBestData.SongId && + datum.Difficulty == songBestData.Difficulty).ToList(); + songBestData.PlayCount = songPlayLogs.Count; + songBestData.ClearCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Clear); + songBestData.FullComboCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Gold); + songBestData.PerfectCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Dondaful); + } + var favoriteSongs = await userDatumService.GetFavoriteSongIds(baid); + var favoriteSet = favoriteSongs.ToHashSet(); + foreach (var songBestRecord in songBestRecords.Where(songBestRecord => favoriteSet.Contains(songBestRecord.SongId))) + { + songBestRecord.IsFavorite = true; + } + + return Ok(new SongBestResponse + { + SongBestData = songBestRecords + }); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Api/UserSettingsController.cs b/TaikoLocalServer/Controllers/Api/UserSettingsController.cs new file mode 100644 index 0000000..5b44c72 --- /dev/null +++ b/TaikoLocalServer/Controllers/Api/UserSettingsController.cs @@ -0,0 +1,103 @@ +using System.Text.Json; +using SharedProject.Models; +using SharedProject.Utils; + +namespace TaikoLocalServer.Controllers.Api; + +[ApiController] +[Route("/api/[controller]/{baid}")] +public class UserSettingsController : BaseController +{ + private readonly IUserDatumService userDatumService; + + public UserSettingsController(IUserDatumService userDatumService) + { + this.userDatumService = userDatumService; + } + + [HttpGet] + public async Task> GetUserSetting(ulong baid) + { + var user = await userDatumService.GetFirstUserDatumOrNull(baid); + + if (user is null) + { + return NotFound(); + } + + var costumeData = JsonHelper.GetCostumeDataFromUserData(user, Logger); + + var costumeUnlockData = JsonHelper.GetCostumeUnlockDataFromUserData(user, Logger); + + var response = new UserSetting + { + AchievementDisplayDifficulty = user.AchievementDisplayDifficulty, + IsDisplayAchievement = user.DisplayAchievement, + IsDisplayDanOnNamePlate = user.DisplayDan, + IsVoiceOn = user.IsVoiceOn, + IsSkipOn = user.IsSkipOn, + NotesPosition = user.NotesPosition, + PlaySetting = PlaySettingConverter.ShortToPlaySetting(user.OptionSetting), + ToneId = user.SelectedToneId, + MyDonName = user.MyDonName, + Title = user.Title, + TitlePlateId = user.TitlePlateId, + Kigurumi = costumeData[0], + Head = costumeData[1], + Body = costumeData[2], + Face = costumeData[3], + Puchi = costumeData[4], + UnlockedKigurumi = costumeUnlockData[0], + UnlockedHead = costumeUnlockData[1], + UnlockedBody = costumeUnlockData[2], + UnlockedFace = costumeUnlockData[3], + UnlockedPuchi = costumeUnlockData[4], + BodyColor = user.ColorBody, + FaceColor = user.ColorFace, + LimbColor = user.ColorLimb + }; + return Ok(response); + } + + [HttpPost] + public async Task SaveUserSetting(ulong baid, UserSetting userSetting) + { + var user = await userDatumService.GetFirstUserDatumOrNull(baid); + + if (user is null) + { + return NotFound(); + } + + var costumes = new List + { + userSetting.Kigurumi, + userSetting.Head, + userSetting.Body, + userSetting.Face, + userSetting.Puchi, + }; + + user.IsSkipOn = userSetting.IsSkipOn; + user.IsVoiceOn = userSetting.IsVoiceOn; + user.DisplayAchievement = userSetting.IsDisplayAchievement; + user.DisplayDan = userSetting.IsDisplayDanOnNamePlate; + user.NotesPosition = userSetting.NotesPosition; + user.SelectedToneId = userSetting.ToneId; + user.AchievementDisplayDifficulty = userSetting.AchievementDisplayDifficulty; + user.OptionSetting = PlaySettingConverter.PlaySettingToShort(userSetting.PlaySetting); + user.MyDonName = userSetting.MyDonName; + user.Title = userSetting.Title; + user.TitlePlateId = userSetting.TitlePlateId; + user.ColorBody = userSetting.BodyColor; + user.ColorFace = userSetting.FaceColor; + user.ColorLimb = userSetting.LimbColor; + user.CostumeData = JsonSerializer.Serialize(costumes); + + + await userDatumService.UpdateUserDatum(user); + + return NoContent(); + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/BaseController.cs b/TaikoLocalServer/Controllers/BaseController.cs new file mode 100644 index 0000000..1ae9500 --- /dev/null +++ b/TaikoLocalServer/Controllers/BaseController.cs @@ -0,0 +1,8 @@ +namespace TaikoLocalServer.Controllers; + +public abstract class BaseController : ControllerBase where T : BaseController +{ + private ILogger? logger; + + protected ILogger Logger => (logger ??= HttpContext.RequestServices.GetService>()) ?? throw new InvalidOperationException(); +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/AddTokenCountController.cs b/TaikoLocalServer/Controllers/Game/AddTokenCountController.cs new file mode 100644 index 0000000..fcf0618 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/AddTokenCountController.cs @@ -0,0 +1,20 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/addtokencount.php")] +[ApiController] +public class AddTokenCountController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult AddTokenCount([FromBody] AddTokenCountRequest request) + { + Logger.LogInformation("AddTokenCount request : {Request}", request.Stringify()); + + var response = new AddTokenCountResponse + { + Result = 1 + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/BaidController.cs b/TaikoLocalServer/Controllers/Game/BaidController.cs new file mode 100644 index 0000000..33a81d6 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/BaidController.cs @@ -0,0 +1,186 @@ +using GameDatabase.Entities; +using System.Text.Json; +using Throw; + +namespace TaikoLocalServer.Controllers.Game; + +[ApiController] +[Route("/v12r00_cn/chassis/baidcheck.php")] +public class BaidController : BaseController +{ + private readonly IUserDatumService userDatumService; + + private readonly ICardService cardService; + + private readonly ISongBestDatumService songBestDatumService; + + private readonly IDanScoreDatumService danScoreDatumService; + + private readonly IAiDatumService aiDatumService; + + public BaidController(IUserDatumService userDatumService, ICardService cardService, + ISongBestDatumService songBestDatumService, IDanScoreDatumService danScoreDatumService, IAiDatumService aiDatumService) + { + this.userDatumService = userDatumService; + this.cardService = cardService; + this.songBestDatumService = songBestDatumService; + this.danScoreDatumService = danScoreDatumService; + this.aiDatumService = aiDatumService; + } + + + [HttpPost] + [Produces("application/protobuf")] + public async Task GetBaid([FromBody] BAIDRequest request) + { + Logger.LogInformation("Baid request: {Request}", request.Stringify()); + BAIDResponse response; + var card = await cardService.GetCardByAccessCode(request.WechatQrStr); + if (card is null) + { + Logger.LogInformation("New user with access code {AccessCode}", request.WechatQrStr); + var newId = cardService.GetNextBaid(); + + response = new BAIDResponse + { + Result = 1, + PlayerType = 1, + Baid = newId, + }; + + return Ok(response); + } + + var baid = card.Baid; + + var userData = await userDatumService.GetFirstUserDatumOrDefault(baid); + + var songBestData = await songBestDatumService.GetAllSongBestData(baid); + + var achievementDisplayDifficulty = userData.AchievementDisplayDifficulty; + if (userData.AchievementDisplayDifficulty == Difficulty.None) + { + achievementDisplayDifficulty = songBestData.Any(datum => datum.BestCrown >= CrownType.Clear) ? + songBestData.Where(datum => datum.BestCrown >= CrownType.Clear).Max(datum => datum.Difficulty) : + Difficulty.Easy; + } + + var songCountData = songBestData.Where(datum => achievementDisplayDifficulty != Difficulty.UraOni ? + datum.Difficulty == achievementDisplayDifficulty : + datum.Difficulty is Difficulty.Oni or Difficulty.UraOni).ToList(); + + var crownCount = CalculateCrownCount(songCountData); + + var scoreRankCount = CalculateScoreRankCount(songCountData); + + + var costumeData = JsonHelper.GetCostumeDataFromUserData(userData, Logger); + + var costumeArrays = JsonHelper.GetCostumeUnlockDataFromUserData(userData, Logger); + + var costumeFlagArrays = Constants.CostumeFlagArraySizes + .Select((size, index) => FlagCalculator.GetBitArrayFromIds(costumeArrays[index], size, Logger)) + .ToList(); + + var danData = await danScoreDatumService.GetDanScoreDatumByBaid(baid); + + var maxDan = danData.Where(datum => datum.ClearState != DanClearState.NotClear) + .Select(datum => datum.DanId) + .DefaultIfEmpty() + .Max(); + var gotDanFlagArray = FlagCalculator.ComputeGotDanFlags(danData); + + var genericInfoFlg = Array.Empty(); + try + { + genericInfoFlg = JsonSerializer.Deserialize(userData.GenericInfoFlgArray); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing genericinfo flg json data failed"); + } + + // The only way to get a null is provide string "null" as input, + // which means database content need to be fixed, so better throw + genericInfoFlg.ThrowIfNull("Genericinfo flg should never be null!"); + + var genericInfoFlgLength = genericInfoFlg.Any() ? genericInfoFlg.Max() + 1 : 0; + var genericInfoFlgArray = FlagCalculator.GetBitArrayFromIds(genericInfoFlg, (int)genericInfoFlgLength, Logger); + + var aiRank = (uint)(userData.AiWinCount / 10); + if (aiRank > 11) + { + aiRank = 11; + } + response = new BAIDResponse + { + Result = 1, + PlayerType = 0, + Baid = baid, + MydonName = userData.MyDonName, + Title = userData.Title, + TitleplateId = userData.TitlePlateId, + ColorFace = userData.ColorFace, + ColorBody = userData.ColorBody, + ColorLimb = userData.ColorLimb, + AryCostumedata = new BAIDResponse.CostumeData + { + Costume1 = costumeData[0], + Costume2 = costumeData[1], + Costume3 = costumeData[2], + Costume4 = costumeData[3], + Costume5 = costumeData[4] + }, + CostumeFlg1 = costumeFlagArrays[0], + CostumeFlg2 = costumeFlagArrays[1], + CostumeFlg3 = costumeFlagArrays[2], + CostumeFlg4 = costumeFlagArrays[3], + CostumeFlg5 = costumeFlagArrays[4], + LastPlayDatetime = userData.LastPlayDatetime.ToString(Constants.DATE_TIME_FORMAT), + IsDispDanOn = userData.DisplayDan, + GotDanMax = maxDan, + GotDanFlg = gotDanFlagArray, + GotDanextraFlg = new byte[20], + DefaultToneSetting = userData.SelectedToneId, + GenericInfoFlg = genericInfoFlgArray, + AryCrownCounts = crownCount, + AryScoreRankCounts = scoreRankCount, + IsDispAchievementOn = userData.DisplayAchievement, + DispAchievementType = (uint)achievementDisplayDifficulty, + IsDispAchievementTypeSet = true, + LastPlayMode = userData.LastPlayMode, + IsDispSouuchiOn = true + }; + + return Ok(response); + } + + private static uint[] CalculateScoreRankCount(IReadOnlyCollection songCountData) + { + var scoreRankCount = new uint[7]; + foreach (var scoreRankType in Enum.GetValues()) + { + if (scoreRankType != ScoreRank.None) + { + scoreRankCount[(int)scoreRankType - 2] = + (uint)songCountData.Count(datum => datum.BestScoreRank == scoreRankType); + } + } + + return scoreRankCount; + } + + private static uint[] CalculateCrownCount(IReadOnlyCollection songCountData) + { + var crownCount = new uint[3]; + foreach (var crownType in Enum.GetValues()) + { + if (crownType != CrownType.None) + { + crownCount[(int)crownType - 1] = (uint)songCountData.Count(datum => datum.BestCrown == crownType); + } + } + + return crownCount; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/BookkeepingController.cs b/TaikoLocalServer/Controllers/Game/BookkeepingController.cs new file mode 100644 index 0000000..736d10a --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/BookkeepingController.cs @@ -0,0 +1,21 @@ +namespace TaikoLocalServer.Controllers.Game; + +[ApiController] +[Route("/v12r00_cn/chassis/bookkeeping.php")] +public class BookkeepingController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult StartupAuth([FromBody] BookKeepingRequest request) + { + Logger.LogInformation("Bookkeeping request: {Request}", request.Stringify()); + var response = new BookKeepingResponse + { + Result = 1 + }; + + + return Ok(response); + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs b/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs new file mode 100644 index 0000000..08f873f --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs @@ -0,0 +1,21 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/challengecompe.php")] +[ApiController] +public class ChallengeCompetitionController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult HandleChallenge([FromBody] ChallengeCompeRequest request) + { + Logger.LogInformation("ChallengeCompe request : {Request}", request.Stringify()); + + var response = new ChallengeCompeResponse + { + Result = 1 + }; + + return Ok(response); + + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/CrownsDataController.cs b/TaikoLocalServer/Controllers/Game/CrownsDataController.cs new file mode 100644 index 0000000..771b400 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/CrownsDataController.cs @@ -0,0 +1,59 @@ +using Microsoft.Extensions.Options; +using TaikoLocalServer.Settings; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/crownsdata.php")] +[ApiController] +public class CrownsDataController : BaseController +{ + private readonly ISongBestDatumService songBestDatumService; + + private readonly ServerSettings settings; + + public CrownsDataController(ISongBestDatumService songBestDatumService, IOptions settings) + { + this.songBestDatumService = songBestDatumService; + this.settings = settings.Value; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task CrownsData([FromBody] CrownsDataRequest request) + { + Logger.LogInformation("CrownsData request : {Request}", request.Stringify()); + + var songBestData = await songBestDatumService.GetAllSongBestData(request.Baid); + + var songIdMax = settings.EnableMoreSongs ? Constants.MUSIC_ID_MAX_EXPANDED : Constants.MUSIC_ID_MAX; + var crown = new ushort[songIdMax + 1]; + var dondafulCrown = new byte[songIdMax + 1]; + + for (var songId = 0; songId < songIdMax; songId++) + { + var id = songId; + dondafulCrown[songId] = songBestData + // Select song of this song id with dondaful crown + .Where(datum => datum.SongId == id && + datum.BestCrown == CrownType.Dondaful) + // Calculate flag according to difficulty + .Aggregate((byte)0, (flag, datum) => FlagCalculator.ComputeDondafulCrownFlag(flag, datum.Difficulty)); + + crown[songId] = songBestData + // Select song of this song id with clear or fc crown + .Where(datum => datum.SongId == id && + datum.BestCrown is CrownType.Clear or CrownType.Gold) + // Calculate flag according to difficulty + .Aggregate((ushort)0, (flag, datum) => FlagCalculator.ComputeCrownFlag(flag, datum.BestCrown, datum.Difficulty)); + } + + var response = new CrownsDataResponse + { + Result = 1, + CrownFlg = GZipBytesUtil.GetGZipBytes(crown), + DondafulCrownFlg = GZipBytesUtil.GetGZipBytes(dondafulCrown) + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/ExecuteQrCodeController.cs b/TaikoLocalServer/Controllers/Game/ExecuteQrCodeController.cs new file mode 100644 index 0000000..01202ac --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/ExecuteQrCodeController.cs @@ -0,0 +1,21 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/executeqrcode.php")] +[ApiController] +public class ExecuteQrCodeController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult ExecuteQrCode([FromBody] ExecuteQrcodeRequest request) + { + Logger.LogInformation("ExecuteQrcode request : {Request}", request.Stringify()); + + var response = new ExecuteQrcodeResponse + { + QrcodeId = 1, + Result = 1 + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetAiDataController.cs b/TaikoLocalServer/Controllers/Game/GetAiDataController.cs new file mode 100644 index 0000000..84fb1f9 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetAiDataController.cs @@ -0,0 +1,34 @@ +using Throw; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getaidata.php")] +[ApiController] +public class GetAiDataController : BaseController +{ + private readonly IUserDatumService userDatumService; + + public GetAiDataController(IUserDatumService userDatumService) + { + this.userDatumService = userDatumService; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task GetAiData([FromBody] GetAiDataRequest request) + { + Logger.LogInformation("GetAiData request : {Request}", request.Stringify()); + + var user = await userDatumService.GetFirstUserDatumOrNull(request.Baid); + user.ThrowIfNull($"User with baid {request.Baid} does not exist!"); + var response = new GetAiDataResponse + { + Result = 1, + TotalWinnings = (uint)user.AiWinCount, + InputMedian = "1000", + InputVariance = "2000" + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetAiScoreController.cs b/TaikoLocalServer/Controllers/Game/GetAiScoreController.cs new file mode 100644 index 0000000..18c2edf --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetAiScoreController.cs @@ -0,0 +1,106 @@ +using Throw; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getaiscore.php")] +[ApiController] +public class GetAiScoreController : BaseController +{ + private readonly IAiDatumService aiDatumService; + + public GetAiScoreController(IAiDatumService aiDatumService) + { + this.aiDatumService = aiDatumService; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task GetAiScore([FromBody] GetAiScoreRequest request) + { + Logger.LogInformation("GetAiScore request : {Request}", request.Stringify()); + + var response = new GetAiScoreResponse + { + Result = 1 + }; + + var difficulty = (Difficulty)request.Level; + difficulty.Throw().IfOutOfRange(); + + var aiData = await aiDatumService.GetSongAiScore(request.Baid, request.SongNo, difficulty); + if (aiData is null) + { + return Ok(response); + } + + for (var index = 0; index < aiData.AiSectionScoreData.Count; index++) + { + var sectionScoreDatum = aiData.AiSectionScoreData[index]; + response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData + { + Crown = (uint)sectionScoreDatum.Crown, + GoodCnt = sectionScoreDatum.GoodCount, + OkCnt = sectionScoreDatum.OkCount, + NgCnt = sectionScoreDatum.MissCount, + PoundCnt = sectionScoreDatum.DrumrollCount, + Score = sectionScoreDatum.Score, + SectionNo = (uint)index + }); + } + + // There's either 3 or 5 total sections + // SectionNo doesn't seem to actually affect which section is being assigned to, only the List order matters + /*response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData() + { + SectionNo = 1, + Crown = (uint)CrownType.Clear, + Score = 100000, + GoodCnt = 100, + OkCnt = 50, + NgCnt = 25, + PoundCnt = 12 + }); + response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData() + { + SectionNo = 2, + Crown = (uint)CrownType.Gold, + Score = 100001, + GoodCnt = 101, + OkCnt = 50, + NgCnt = 25, + PoundCnt = 12 + }); + response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData() + { + SectionNo = 3, + Crown = (uint)CrownType.Dondaful, + Score = 100002, + GoodCnt = 102, + OkCnt = 50, + NgCnt = 25, + PoundCnt = 12 + }); + response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData() + { + SectionNo = 4, + Crown = (uint)CrownType.Gold, + Score = 100003, + GoodCnt = 103, + OkCnt = 50, + NgCnt = 25, + PoundCnt = 12 + }); + response.AryBestSectionDatas.Add(new GetAiScoreResponse.AiBestSectionData() + { + SectionNo = 5, + Crown = (uint)CrownType.Clear, + Score = 100004, + GoodCnt = 104, + OkCnt = 50, + NgCnt = 25, + PoundCnt = 12 + });*/ + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetApplicationUrlController.cs b/TaikoLocalServer/Controllers/Game/GetApplicationUrlController.cs new file mode 100644 index 0000000..f6b0e36 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetApplicationUrlController.cs @@ -0,0 +1,23 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getapplicationurl.php")] +[ApiController] +public class GetApplicationUrlController : BaseController +{ + private const string APPLICATION_URL = "vsapi.taiko-p.jp"; + + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetApplicationUrl([FromBody] GetApplicationUrlRequest request) + { + Logger.LogInformation("GetApplicationUrl request : {Request}", request.Stringify()); + + var response = new GetApplicationUrlResponse + { + Result = 1, + ApplicationUrl = APPLICATION_URL + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs new file mode 100644 index 0000000..a1072ca --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs @@ -0,0 +1,44 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getdanodai.php")] +[ApiController] +public class GetDanOdaiController : BaseController +{ + private readonly IGameDataService gameDataService; + + public GetDanOdaiController(IGameDataService gameDataService) + { + this.gameDataService = gameDataService; + } + + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetDanOdai([FromBody] GetDanOdaiRequest request) + { + Logger.LogInformation("GetDanOdai request : {Request}", request.Stringify()); + + var response = new GetDanOdaiResponse + { + Result = 1 + }; + + if (request.Type == 2) + { + return Ok(response); + } + + foreach (var danId in request.DanIds) + { + gameDataService.GetDanDataDictionary().TryGetValue(danId, out var odaiData); + if (odaiData is null) + { + Logger.LogWarning("Requested dan id {Id} does not exist!", danId); + continue; + } + + response.AryOdaiDatas.Add(odaiData); + } + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetDanScoreController.cs b/TaikoLocalServer/Controllers/Game/GetDanScoreController.cs new file mode 100644 index 0000000..73bd1ba --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetDanScoreController.cs @@ -0,0 +1,50 @@ +using GameDatabase.Entities; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getdanscore.php")] +[ApiController] +public class GetDanScoreController : BaseController +{ + private readonly IDanScoreDatumService danScoreDatumService; + + public GetDanScoreController(IDanScoreDatumService danScoreDatumService) + { + this.danScoreDatumService = danScoreDatumService; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task GetDanScore([FromBody] GetDanScoreRequest request) + { + Logger.LogInformation("GetDanScore request : {Request}", request.Stringify()); + + var response = new GetDanScoreResponse + { + Result = 1 + }; + + var danScoreData = await danScoreDatumService.GetDanScoreDatumByBaid(request.Baid); + + foreach (var danId in request.DanIds) + { + var datum = danScoreData.FirstOrDefault(scoreDatum => scoreDatum.DanId == danId, new DanScoreDatum()); + + var responseData = new GetDanScoreResponse.DanScoreData + { + DanId = danId, + ArrivalSongCnt = datum.ArrivalSongCount, + ComboCntTotal = datum.ComboCountTotal, + SoulGaugeTotal = datum.SoulGaugeTotal + }; + foreach (var stageScoreDatum in datum.DanStageScoreData) + { + responseData.AryDanScoreDataStages.Add(ObjectMappers.DanStageDbToResponseMap.Apply(stageScoreDatum)); + } + + response.AryDanScoreDatas.Add(responseData); + } + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetFolderController.cs b/TaikoLocalServer/Controllers/Game/GetFolderController.cs new file mode 100644 index 0000000..5339aad --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetFolderController.cs @@ -0,0 +1,38 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getfolder.php")] +[ApiController] +public class GetFolderController : BaseController +{ + private readonly IGameDataService gameDataService; + public GetFolderController(IGameDataService gameDataService) + { + this.gameDataService = gameDataService; + } + + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetFolder([FromBody] GetfolderRequest request) + { + Logger.LogInformation("GetFolder request : {Request}", request.Stringify()); + + var response = new GetfolderResponse + { + Result = 1 + }; + + foreach (var folderId in request.FolderIds) + { + gameDataService.GetFolderDictionary().TryGetValue(folderId, out var folderData); + if (folderData is null) + { + Logger.LogWarning("Requested folder id {Id} does not exist!", folderId); + continue; + } + + response.AryEventfolderDatas.Add(folderData); + } + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetScoreRankController.cs b/TaikoLocalServer/Controllers/Game/GetScoreRankController.cs new file mode 100644 index 0000000..618d04b --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetScoreRankController.cs @@ -0,0 +1,59 @@ +using Microsoft.Extensions.Options; +using TaikoLocalServer.Settings; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getscorerank.php")] +[ApiController] +public class GetScoreRankController : BaseController +{ + private readonly ISongBestDatumService songBestDatumService; + + private readonly ServerSettings settings; + + public GetScoreRankController(ISongBestDatumService songBestDatumService, IOptions settings) + { + this.songBestDatumService = songBestDatumService; + this.settings = settings.Value; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task GetScoreRank([FromBody] GetScoreRankRequest request) + { + Logger.LogInformation("GetScoreRank request : {Request}", request.Stringify()); + var songIdMax = settings.EnableMoreSongs ? Constants.MUSIC_ID_MAX_EXPANDED : Constants.MUSIC_ID_MAX; + var kiwamiScores = new byte[songIdMax + 1]; + var miyabiScores = new ushort[songIdMax + 1]; + var ikiScores = new ushort[songIdMax + 1]; + var songBestData = await songBestDatumService.GetAllSongBestData(request.Baid); + + for (var songId = 0; songId < songIdMax; songId++) + { + var id = songId; + kiwamiScores[songId] = songBestData + .Where(datum => datum.SongId == id && + datum.BestScoreRank == ScoreRank.Dondaful) + .Aggregate((byte)0, (flag, datum) => FlagCalculator.ComputeKiwamiScoreRankFlag(flag, datum.Difficulty)); + + ikiScores[songId] = songBestData + .Where(datum => datum.SongId == id && + datum.BestScoreRank is ScoreRank.White or ScoreRank.Bronze or ScoreRank.Silver) + .Aggregate((ushort)0, (flag, datum) => FlagCalculator.ComputeMiyabiOrIkiScoreRank(flag, datum.BestScoreRank, datum.Difficulty)); + + miyabiScores[songId] = songBestData + .Where(datum => datum.SongId == id && + datum.BestScoreRank is ScoreRank.Gold or ScoreRank.Purple or ScoreRank.Sakura) + .Aggregate((ushort)0, (flag, datum) => FlagCalculator.ComputeMiyabiOrIkiScoreRank(flag, datum.BestScoreRank, datum.Difficulty)); + } + var response = new GetScoreRankResponse + { + Result = 1, + IkiScoreRankFlg = GZipBytesUtil.GetGZipBytes(ikiScores), + KiwamiScoreRankFlg = GZipBytesUtil.GetGZipBytes(kiwamiScores), + MiyabiScoreRankFlg = GZipBytesUtil.GetGZipBytes(miyabiScores) + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetShopFolderController.cs b/TaikoLocalServer/Controllers/Game/GetShopFolderController.cs new file mode 100644 index 0000000..e4f31ac --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetShopFolderController.cs @@ -0,0 +1,28 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getshopfolder.php")] +[ApiController] +public class GetShopFolderController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetShopFolder([FromBody] GetShopFolderRequest request) + { + Logger.LogInformation("GetShopFolder request : {Request}", request.Stringify()); + + var response = new GetShopFolderResponse + { + Result = 1, + TokenId = 1, + VerupNo = 2 + }; + + response.AryShopFolderDatas.Add(new GetShopFolderResponse.ShopFolderData + { + Price = 1, + SongNo = 2 + }); + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetSongIntroductionController.cs b/TaikoLocalServer/Controllers/Game/GetSongIntroductionController.cs new file mode 100644 index 0000000..65604be --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetSongIntroductionController.cs @@ -0,0 +1,39 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/getsongintroduction.php")] +[ApiController] +public class GetSongIntroductionController : BaseController +{ + private readonly IGameDataService gameDataService; + + public GetSongIntroductionController(IGameDataService gameDataService) + { + this.gameDataService = gameDataService; + } + + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetSongIntroduction([FromBody] GetSongIntroductionRequest request) + { + Logger.LogInformation("GetSongIntroduction request : {Request}", request.Stringify()); + + var response = new GetSongIntroductionResponse + { + Result = 1 + }; + + foreach (var setId in request.SetIds) + { + gameDataService.GetSongIntroDictionary().TryGetValue(setId, out var introData); + if (introData is null) + { + Logger.LogWarning("Requested set id {Id} does not exist!", setId); + continue; + } + + response.ArySongIntroductionDatas.Add(introData); + } + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetTelopController.cs b/TaikoLocalServer/Controllers/Game/GetTelopController.cs new file mode 100644 index 0000000..0de4b6c --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetTelopController.cs @@ -0,0 +1,27 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/gettelop.php")] +[ApiController] +public class GetTelopController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetTelop([FromBody] GettelopRequest request) + { + Logger.LogInformation("GetTelop request : {Request}", request.Stringify()); + + var startDateTime = DateTime.Now - TimeSpan.FromDays(999.0); + var endDateTime = DateTime.Now + TimeSpan.FromDays(999.0); + + var response = new GettelopResponse + { + Result = 1, + StartDatetime = startDateTime.ToString(Constants.DATE_TIME_FORMAT), + EndDatetime = endDateTime.ToString(Constants.DATE_TIME_FORMAT), + Telop = "Hello world", + VerupNo = 1 + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs new file mode 100644 index 0000000..2dc3a9e --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs @@ -0,0 +1,26 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/gettokencount.php")] +[ApiController] +public class GetTokenCountController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetTokenCount([FromBody] GetTokenCountRequest request) + { + Logger.LogInformation("GetTokenCount request : {Request}", request.Stringify()); + + var response = new GetTokenCountResponse + { + Result = 1 + }; + + response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + { + TokenCount = 10, + TokenId = 1 + }); + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/Headclerk2Controller.cs b/TaikoLocalServer/Controllers/Game/Headclerk2Controller.cs new file mode 100644 index 0000000..d71bf69 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/Headclerk2Controller.cs @@ -0,0 +1,19 @@ +namespace TaikoLocalServer.Controllers.Game; + +[ApiController] +[Route("/v12r00_cn/chassis/headclerk2.php")] +public class Headclerk2Controller : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult Headclerk2([FromBody] HeadClerk2Request request) + { + Logger.LogInformation("Headclerk2 request: {Request}", request.Stringify()); + var response = new HeadClerk2Response + { + Result = 1 + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/HeartbeatController.cs b/TaikoLocalServer/Controllers/Game/HeartbeatController.cs new file mode 100644 index 0000000..bcb5582 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/HeartbeatController.cs @@ -0,0 +1,20 @@ +namespace TaikoLocalServer.Controllers.Game; + +[ApiController] +[Route("/v12r00_cn/chassis/heartbeat.php")] +public class HeartbeatController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult HeartBeat([FromBody] HeartBeatRequest request) + { + Logger.LogInformation("Heartbeat request: {Request}", request.Stringify()); + var response = new HeartBeatResponse + { + Result = 1, + GameSvrStat = 1 + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs new file mode 100644 index 0000000..bdd2cc1 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -0,0 +1,46 @@ +using Microsoft.Extensions.Options; +using TaikoLocalServer.Settings; + +namespace TaikoLocalServer.Controllers.Game; + +[ApiController] +[Route("/v12r00_cn/chassis/initialdatacheck.php")] +public class InitialDataCheckController : BaseController +{ + private readonly IGameDataService gameDataService; + + private readonly ServerSettings settings; + + public InitialDataCheckController(IGameDataService gameDataService, IOptions settings) + { + this.gameDataService = gameDataService; + this.settings = settings.Value; + } + + [HttpPost] + [Produces("application/protobuf")] + public IActionResult InitialDataCheck([FromBody] InitialdatacheckRequest request) + { + Logger.LogInformation("Initial data check request: {Request}", request.Stringify()); + + var songIdMax = settings.EnableMoreSongs ? Constants.MUSIC_ID_MAX_EXPANDED : Constants.MUSIC_ID_MAX; + var enabledArray = + FlagCalculator.GetBitArrayFromIds(gameDataService.GetMusicList(), songIdMax, Logger); + + var defaultSongWithUraList = gameDataService.GetMusicWithUraList(); + var uraReleaseBit = + FlagCalculator.GetBitArrayFromIds(defaultSongWithUraList, songIdMax, Logger); + + var response = new InitialdatacheckResponse + { + Result = 1, + DefaultSongFlg = enabledArray, + AchievementSongBit = enabledArray, + UraReleaseBit = uraReleaseBit, + SongIntroductionEndDatetime = DateTime.Now.AddYears(10).ToString(Constants.DATE_TIME_FORMAT) + }; + + return Ok(response); + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs b/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs new file mode 100644 index 0000000..ba0b4a1 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs @@ -0,0 +1,60 @@ +using GameDatabase.Entities; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/mydonentry.php")] +[ApiController] +public class MyDonEntryController : BaseController +{ + private readonly IUserDatumService userDatumService; + + private readonly ICardService cardService; + + public MyDonEntryController(IUserDatumService userDatumService, ICardService cardService) + { + this.userDatumService = userDatumService; + this.cardService = cardService; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task GetMyDonEntry([FromBody] MydonEntryRequest request) + { + Logger.LogInformation("MyDonEntry request : {Request}", request.Stringify()); + + var newId = cardService.GetNextBaid(); + await cardService.AddCard(new Card + { + AccessCode = request.WechatQrStr, + Baid = newId + }); + + var newUser = new UserDatum + { + Baid = newId, + MyDonName = request.MydonName, + DisplayDan = true, + DisplayAchievement = true, + AchievementDisplayDifficulty = Difficulty.None, + ColorFace = 0, + ColorBody = 1, + ColorLimb = 3, + FavoriteSongsArray = "[]", + ToneFlgArray = "[]", + TitleFlgArray = "[]", + CostumeFlgArray = "[[],[],[],[],[]]", + GenericInfoFlgArray = "[]" + }; + + await userDatumService.InsertUserDatum(newUser); + + var response = new MydonEntryResponse + { + Result = 1, + Baid = newId, + MydonName = request.MydonName, + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/PlayResultController.cs b/TaikoLocalServer/Controllers/Game/PlayResultController.cs new file mode 100644 index 0000000..013f12c --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/PlayResultController.cs @@ -0,0 +1,387 @@ +using System.Buffers.Binary; +using System.Globalization; +using System.Text.Json; +using GameDatabase.Entities; +using Throw; + +namespace TaikoLocalServer.Controllers.Game; + +using StageData = PlayResultDataRequest.StageData; + +[Route("/v12r00_cn/chassis/playresult.php")] +[ApiController] +public class PlayResultController : BaseController +{ + private readonly IUserDatumService userDatumService; + + private readonly ISongPlayDatumService songPlayDatumService; + + private readonly ISongBestDatumService songBestDatumService; + + private readonly IDanScoreDatumService danScoreDatumService; + + private readonly IAiDatumService aiDatumService; + + public PlayResultController(IUserDatumService userDatumService, ISongPlayDatumService songPlayDatumService, + ISongBestDatumService songBestDatumService, IDanScoreDatumService danScoreDatumService, IAiDatumService aiDatumService) + { + this.userDatumService = userDatumService; + this.songPlayDatumService = songPlayDatumService; + this.songBestDatumService = songBestDatumService; + this.danScoreDatumService = danScoreDatumService; + this.aiDatumService = aiDatumService; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task UploadPlayResult([FromBody] PlayResultRequest request) + { + Logger.LogInformation("PlayResult request : {Request}", request.Stringify()); + var decompressed = GZipBytesUtil.DecompressGZipBytes(request.PlayresultData); + + var playResultData = Serializer.Deserialize(new ReadOnlySpan(decompressed)); + + Logger.LogInformation("Play result data {Data}", playResultData.Stringify()); + + var response = new PlayResultResponse + { + Result = 1 + }; + + // Fix issue caused by guest play, god knows why they send guest play data + if (request.BaidConf == 0) + { + return Ok(response); + } + + if (await userDatumService.GetFirstUserDatumOrNull(request.BaidConf) is null) + { + Logger.LogWarning("Game uploading a non exisiting user with baid {Baid}", request.BaidConf); + return Ok(response); + } + + var lastPlayDatetime = DateTime.ParseExact(playResultData.PlayDatetime, Constants.DATE_TIME_FORMAT, + CultureInfo.InvariantCulture); + + await UpdateUserData(request, playResultData, lastPlayDatetime); + + var playMode = (PlayMode)playResultData.PlayMode; + + if (playMode == PlayMode.DanMode) + { + await UpdateDanPlayData(request, playResultData); + return Ok(response); + } + + var bestData = await songBestDatumService.GetAllSongBestData(request.BaidConf); + for (var songNumber = 0; songNumber < playResultData.AryStageInfoes.Count; songNumber++) + { + var stageData = playResultData.AryStageInfoes[songNumber]; + + if (stageData.IsSkipUse) + { + await UpdatePlayData(request, songNumber, stageData, lastPlayDatetime); + continue; + } + + if (playMode == PlayMode.AiBattle) + { + await UpdateAiBattleData(request, stageData); + } + + await UpdateBestData(request, stageData, bestData); + + await UpdatePlayData(request, songNumber, stageData, lastPlayDatetime); + } + + return Ok(response); + } + + private async Task UpdateDanPlayData(PlayResultRequest request, PlayResultDataRequest playResultDataRequest) + { + if (playResultDataRequest.IsNotRecordedDan) + { + Logger.LogInformation("Dan score will not be saved!"); + return; + } + + var danScoreData = + await danScoreDatumService.GetSingleDanScoreDatum(request.BaidConf, playResultDataRequest.DanId) ?? + new DanScoreDatum + { + Baid = request.BaidConf, + DanId = playResultDataRequest.DanId + }; + danScoreData.ClearState = + (DanClearState)Math.Max(playResultDataRequest.DanResult, (uint)danScoreData.ClearState); + danScoreData.ArrivalSongCount = + Math.Max((uint)playResultDataRequest.AryStageInfoes.Count, danScoreData.ArrivalSongCount); + danScoreData.ComboCountTotal = Math.Max(playResultDataRequest.ComboCntTotal, danScoreData.ComboCountTotal); + danScoreData.SoulGaugeTotal = Math.Max(playResultDataRequest.SoulGaugeTotal, danScoreData.SoulGaugeTotal); + + UpdateDanStageData(playResultDataRequest, danScoreData); + + await danScoreDatumService.InsertOrUpdateDanScoreDatum(danScoreData); + } + + private void UpdateDanStageData(PlayResultDataRequest playResultDataRequest, DanScoreDatum danScoreData) + { + for (var i = 0; i < playResultDataRequest.AryStageInfoes.Count; i++) + { + var stageData = playResultDataRequest.AryStageInfoes[i]; + + var songNumber = i; + var danStageData = danScoreData.DanStageScoreData.FirstOrDefault(datum => datum.SongNumber == songNumber, + new DanStageScoreDatum + { + Baid = danScoreData.Baid, + DanId = danScoreData.DanId, + SongNumber = (uint)songNumber, + OkCount = stageData.OkCnt, + BadCount = stageData.NgCnt + }); + + danStageData.HighScore = Math.Max(danStageData.HighScore, stageData.PlayScore); + danStageData.ComboCount = Math.Max(danStageData.ComboCount, stageData.ComboCnt); + danStageData.DrumrollCount = Math.Max(danStageData.DrumrollCount, stageData.PoundCnt); + danStageData.GoodCount = Math.Max(danStageData.GoodCount, stageData.GoodCnt); + danStageData.TotalHitCount = Math.Max(danStageData.TotalHitCount, stageData.HitCnt); + danStageData.OkCount = Math.Min(danStageData.OkCount, stageData.OkCnt); + danStageData.BadCount = Math.Min(danStageData.BadCount, stageData.NgCnt); + + var index = danScoreData.DanStageScoreData.IndexOf(danStageData); + if (index == -1) + { + danScoreData.DanStageScoreData.Add(danStageData); + } + } + } + + private async Task UpdatePlayData(PlayResultRequest request, int songNumber, StageData stageData, + DateTime lastPlayDatetime) + { + var songPlayDatum = new SongPlayDatum + { + Baid = request.BaidConf, + SongNumber = (uint)songNumber, + GoodCount = stageData.GoodCnt, + OkCount = stageData.OkCnt, + MissCount = stageData.NgCnt, + ComboCount = stageData.ComboCnt, + HitCount = stageData.HitCnt, + DrumrollCount = stageData.PoundCnt, + Crown = PlayResultToCrown(stageData.PlayResult, stageData.OkCnt), + Score = stageData.PlayScore, + ScoreRate = stageData.ScoreRate, + ScoreRank = (ScoreRank)stageData.ScoreRank, + Skipped = stageData.IsSkipUse, + SongId = stageData.SongNo, + PlayTime = lastPlayDatetime, + Difficulty = (Difficulty)stageData.Level + }; + await songPlayDatumService.AddSongPlayDatum(songPlayDatum); + } + + private async Task UpdateUserData(PlayResultRequest request, PlayResultDataRequest playResultData, + DateTime lastPlayDatetime) + { + var userdata = await userDatumService.GetFirstUserDatumOrNull(request.BaidConf); + + userdata.ThrowIfNull($"User data is null! Baid: {request.BaidConf}"); + + var playMode = (PlayMode)playResultData.PlayMode; + + userdata.Title = playResultData.Title; + userdata.TitlePlateId = playResultData.TitleplateId; + var costumeData = new List + { + playResultData.AryCurrentCostume.Costume1, + playResultData.AryCurrentCostume.Costume2, + playResultData.AryCurrentCostume.Costume3, + playResultData.AryCurrentCostume.Costume4, + playResultData.AryCurrentCostume.Costume5 + }; + userdata.CostumeData = JsonSerializer.Serialize(costumeData); + + // Skip user setting saving when in dan mode as dan mode uses its own default setting + if (playMode != PlayMode.DanMode) + { + var lastStage = playResultData.AryStageInfoes.Last(); + var option = BinaryPrimitives.ReadInt16LittleEndian(lastStage.OptionFlg); + userdata.OptionSetting = option; + userdata.IsSkipOn = lastStage.IsSkipOn; + userdata.IsVoiceOn = !lastStage.IsVoiceOn; + userdata.NotesPosition = lastStage.NotesPosition; + } + + userdata.LastPlayDatetime = lastPlayDatetime; + userdata.LastPlayMode = playResultData.PlayMode; + + userdata.ToneFlgArray = + UpdateJsonUintFlagArray(userdata.ToneFlgArray, playResultData.GetToneNoes, nameof(userdata.ToneFlgArray)); + + userdata.TitleFlgArray = + UpdateJsonUintFlagArray(userdata.TitleFlgArray, playResultData.GetTitleNoes, nameof(userdata.TitleFlgArray)); + + userdata.CostumeFlgArray = UpdateJsonCostumeFlagArray(userdata.CostumeFlgArray, + new[] + { + playResultData.GetCostumeNo1s, + playResultData.GetCostumeNo2s, + playResultData.GetCostumeNo3s, + playResultData.GetCostumeNo4s, + playResultData.GetCostumeNo5s + }); + + userdata.GenericInfoFlgArray = + UpdateJsonUintFlagArray(userdata.GenericInfoFlgArray, playResultData.GetGenericInfoNoes, nameof(userdata.GenericInfoFlgArray)); + + userdata.AiWinCount += playResultData.AryStageInfoes.Count(data => data.IsWin); + await userDatumService.UpdateUserDatum(userdata); + } + + private string UpdateJsonUintFlagArray(string originalValue, IReadOnlyCollection? newValue, string fieldName) + { + var flgData = new List(); + try + { + flgData = JsonSerializer.Deserialize>(originalValue); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing {FieldName} json data failed", fieldName); + } + + flgData?.AddRange(newValue ?? Array.Empty()); + var flgArray = flgData ?? new List(); + return JsonSerializer.Serialize(flgArray); + } + + private string UpdateJsonCostumeFlagArray(string originalValue, IReadOnlyList?>? newValue) + { + var flgData = new List>(); + try + { + flgData = JsonSerializer.Deserialize>>(originalValue); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing Costume flag json data failed"); + } + + if (flgData is null) + { + flgData = new List>(); + } + + for (var index = 0; index < flgData.Count; index++) + { + var subFlgData = flgData[index]; + subFlgData.AddRange(newValue?[index] ?? Array.Empty()); + } + + if (flgData.Count >= 5) + { + return JsonSerializer.Serialize(flgData); + } + + Logger.LogWarning("Costume flag array count less than 5!"); + flgData = new List> + { + new(), new(), new(), new(), new() + }; + + return JsonSerializer.Serialize(flgData); + } + + private async Task UpdateBestData(PlayResultRequest request, StageData stageData, + IEnumerable bestData) + { + var bestDatum = bestData + .FirstOrDefault(datum => datum.SongId == stageData.SongNo && + datum.Difficulty == (Difficulty)stageData.Level, + new SongBestDatum + { + Baid = request.BaidConf, + SongId = stageData.SongNo, + Difficulty = (Difficulty)stageData.Level + }); + + // Determine whether it is dondaful crown as this is not reflected by play result + var crown = PlayResultToCrown(stageData.PlayResult, stageData.OkCnt); + + bestDatum.UpdateBestData(crown, stageData.ScoreRank, stageData.PlayScore, stageData.ScoreRate); + + await songBestDatumService.UpdateOrInsertSongBestDatum(bestDatum); + } + + private async Task UpdateAiBattleData(PlayResultRequest request, StageData stageData) + { + var difficulty = (Difficulty)stageData.Level; + difficulty.Throw().IfOutOfRange(); + var existing = await aiDatumService.GetSongAiScore(request.BaidConf, + stageData.SongNo, difficulty); + + if (existing is null) + { + var aiScoreDatum = new AiScoreDatum + { + Baid = request.BaidConf, + SongId = stageData.SongNo, + Difficulty = difficulty, + IsWin = stageData.IsWin + }; + for (var index = 0; index < stageData.ArySectionDatas.Count; index++) + { + AddNewAiSectionScore(request, stageData, index, difficulty, aiScoreDatum); + } + + await aiDatumService.InsertSongAiScore(aiScoreDatum); + return; + } + + for (var index = 0; index < stageData.ArySectionDatas.Count; index++) + { + var sectionData = stageData.ArySectionDatas[index]; + if (index < existing.AiSectionScoreData.Count) + { + existing.AiSectionScoreData[index].UpdateBest(sectionData); + } + else + { + AddNewAiSectionScore(request,stageData,index,difficulty,existing); + } + } + + await aiDatumService.UpdateSongAiScore(existing); + } + + private static void AddNewAiSectionScore(PlayResultRequest request, StageData stageData, int index, Difficulty difficulty, + AiScoreDatum aiScoreDatum) + { + var sectionData = stageData.ArySectionDatas[index]; + var aiSectionScoreDatum = new AiSectionScoreDatum + { + Baid = request.BaidConf, + SongId = stageData.SongNo, + Difficulty = difficulty, + SectionIndex = index, + OkCount = sectionData.OkCnt, + MissCount = sectionData.NgCnt + }; + aiSectionScoreDatum.UpdateBest(sectionData); + aiScoreDatum.AiSectionScoreData.Add(aiSectionScoreDatum); + } + + + private static CrownType PlayResultToCrown(uint playResult, uint okCount) + { + var crown = (CrownType)playResult; + if (crown == CrownType.Gold && okCount == 0) + { + crown = CrownType.Dondaful; + } + + return crown; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/RewardItemController.cs b/TaikoLocalServer/Controllers/Game/RewardItemController.cs new file mode 100644 index 0000000..705beec --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/RewardItemController.cs @@ -0,0 +1,20 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/rewarditem.php")] +[ApiController] +public class RewardItemController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult RewardItem([FromBody] RewardItemRequest request) + { + Logger.LogInformation("RewardItem request : {Request}", request.Stringify()); + + var response = new RewardItemResponse + { + Result = 1 + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/SelfBestController.cs b/TaikoLocalServer/Controllers/Game/SelfBestController.cs new file mode 100644 index 0000000..16cfbeb --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/SelfBestController.cs @@ -0,0 +1,81 @@ +using GameDatabase.Entities; +using Throw; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/selfbest.php")] +[ApiController] +public class SelfBestController : BaseController +{ + private readonly ISongBestDatumService songBestDatumService; + + private readonly IGameDataService gameDataService; + + public SelfBestController(ISongBestDatumService songBestDatumService, IGameDataService gameDataService) + { + this.songBestDatumService = songBestDatumService; + this.gameDataService = gameDataService; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task SelfBest([FromBody] SelfBestRequest request) + { + Logger.LogInformation("SelfBest request : {Request}", request.Stringify()); + + var response = new SelfBestResponse + { + Result = 1, + Level = request.Level + }; + + var requestDifficulty = (Difficulty)request.Level; + requestDifficulty.Throw().IfOutOfRange(); + + var playerBestData = await songBestDatumService.GetAllSongBestData(request.Baid); + playerBestData = playerBestData + .Where(datum => datum.Difficulty == requestDifficulty || + (datum.Difficulty == Difficulty.UraOni && requestDifficulty == Difficulty.Oni)) + .ToList(); + foreach (var songNo in request.ArySongNoes) + { + if (!gameDataService.GetMusicAttributes().ContainsKey(songNo)) + { + Logger.LogWarning("Music no {No} is missing!", songNo); + continue; + } + + var selfBestData = GetSongSelfBestData(playerBestData, songNo); + + response.ArySelfbestScores.Add(selfBestData); + } + response.ArySelfbestScores.Sort((data, otherData) => data.SongNo.CompareTo(otherData.SongNo)); + + return Ok(response); + } + + private static SelfBestResponse.SelfBestData GetSongSelfBestData(IEnumerable playerBestData, uint songNo) + { + var songBestDatum = playerBestData.Where(datum => datum.SongId == songNo); + + var selfBestData = new SelfBestResponse.SelfBestData + { + SongNo = songNo, + }; + + foreach (var datum in songBestDatum) + { + if (datum.Difficulty == Difficulty.UraOni) + { + selfBestData.UraBestScore = datum.BestScore; + selfBestData.UraBestScoreRate = datum.BestRate; + continue; + } + + selfBestData.SelfBestScore = datum.BestScore; + selfBestData.SelfBestScoreRate = datum.BestRate; + } + + return selfBestData; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/SongPurchaseController.cs b/TaikoLocalServer/Controllers/Game/SongPurchaseController.cs new file mode 100644 index 0000000..b26850c --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/SongPurchaseController.cs @@ -0,0 +1,21 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/songpurchase.php")] +[ApiController] +public class SongPurchaseController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult SongPurchase([FromBody] SongPurchaseRequest request) + { + Logger.LogInformation("SongPurchase request : {Request}", request.Stringify()); + + var response = new SongPurchaseResponse + { + Result = 1, + TokenCount = (int)(10 - request.Price) + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/StartupAuthController.cs b/TaikoLocalServer/Controllers/Game/StartupAuthController.cs new file mode 100644 index 0000000..3eac7bd --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/StartupAuthController.cs @@ -0,0 +1,28 @@ +using taiko.vsinterface; + +namespace TaikoLocalServer.Controllers.Game; + +[ApiController] +[Route("/v01r00/chassis/startupauth.php")] +public class StartupAuthController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult StartupAuth([FromBody] StartupAuthRequest request) + { + Logger.LogInformation("StartupAuth request: {Request}", request.Stringify()); + var response = new StartupAuthResponse + { + Result = 1 + }; + var info = request.AryOperationInfoes.ConvertAll(input => + new StartupAuthResponse.OperationData + { + KeyData = input.KeyData, + ValueData = input.ValueData + }); + response.AryOperationInfoes.AddRange(info); + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/TournamentCheckController.cs b/TaikoLocalServer/Controllers/Game/TournamentCheckController.cs new file mode 100644 index 0000000..9766084 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/TournamentCheckController.cs @@ -0,0 +1,20 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/tournamentcheck.php")] +[ApiController] +public class TournamentCheckController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult TournamentCheck([FromBody] TournamentcheckRequest request) + { + Logger.LogInformation("TournamentCheck request : {Request}", request.Stringify()); + + var response = new TournamentcheckResponse + { + Result = 1, + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs new file mode 100644 index 0000000..cca201a --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -0,0 +1,133 @@ +using System.Buffers.Binary; +using System.Text.Json; +using Microsoft.Extensions.Options; +using TaikoLocalServer.Settings; +using Throw; + +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/userdata.php")] +[ApiController] +public class UserDataController : BaseController +{ + private readonly IUserDatumService userDatumService; + + private readonly ISongPlayDatumService songPlayDatumService; + + private readonly IGameDataService gameDataService; + + private readonly ServerSettings settings; + + public UserDataController(IUserDatumService userDatumService, ISongPlayDatumService songPlayDatumService, + IGameDataService gameDataService, IOptions settings) + { + this.userDatumService = userDatumService; + this.songPlayDatumService = songPlayDatumService; + this.gameDataService = gameDataService; + this.settings = settings.Value; + } + + [HttpPost] + [Produces("application/protobuf")] + public async Task GetUserData([FromBody] UserDataRequest request) + { + Logger.LogInformation("UserData request : {Request}", request.Stringify()); + + var songIdMax = settings.EnableMoreSongs ? Constants.MUSIC_ID_MAX_EXPANDED : Constants.MUSIC_ID_MAX; + var releaseSongArray = + FlagCalculator.GetBitArrayFromIds(gameDataService.GetMusicList(), songIdMax, Logger); + + var uraSongArray = + FlagCalculator.GetBitArrayFromIds(gameDataService.GetMusicWithUraList(), songIdMax, Logger); + + var userData = await userDatumService.GetFirstUserDatumOrDefault(request.Baid); + + var toneFlg = Array.Empty(); + try + { + toneFlg = JsonSerializer.Deserialize(userData.ToneFlgArray); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing tone flg json data failed"); + } + + // The only way to get a null is provide string "null" as input, + // which means database content need to be fixed, so better throw + toneFlg.ThrowIfNull("Tone flg should never be null!"); + + var toneArray = FlagCalculator.GetBitArrayFromIds(toneFlg, Constants.TONE_UID_MAX, Logger); + + var titleFlg = Array.Empty(); + try + { + titleFlg = JsonSerializer.Deserialize(userData.TitleFlgArray); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing title flg json data failed"); + } + + // The only way to get a null is provide string "null" as input, + // which means database content need to be fixed, so better throw + titleFlg.ThrowIfNull("Title flg should never be null!"); + + var titleArray = FlagCalculator.GetBitArrayFromIds(titleFlg, Constants.TITLE_UID_MAX, Logger); + + var recentSongs = (await songPlayDatumService.GetSongPlayDatumByBaid(request.Baid)) + .AsEnumerable() + .OrderByDescending(datum => datum.PlayTime) + .ThenByDescending(datum => datum.SongNumber) + .Select(datum => datum.SongId) + .ToArray(); + + // Use custom implementation as distinctby cannot guarantee preserved element + var recentSet = new OrderedSet(); + foreach (var id in recentSongs) + { + recentSet.Add(id); + if (recentSet.Count == 10) + { + break; + } + } + + recentSongs = recentSet.ToArray(); + + var favoriteSongs = Array.Empty(); + try + { + favoriteSongs = JsonSerializer.Deserialize(userData.FavoriteSongsArray); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing favorite songs json data failed"); + } + + // The only way to get a null is provide string "null" as input, + // which means database content need to be fixed, so better throw + favoriteSongs.ThrowIfNull("Favorite song should never be null!"); + + var defaultOptions = new byte[2]; + BinaryPrimitives.WriteInt16LittleEndian(defaultOptions, userData.OptionSetting); + + var response = new UserDataResponse + { + Result = 1, + ToneFlg = toneArray, + TitleFlg = titleArray, + ReleaseSongFlg = releaseSongArray, + UraReleaseSongFlg = uraSongArray, + DefaultOptionSetting = defaultOptions, + IsVoiceOn = userData.IsVoiceOn, + IsSkipOn = userData.IsSkipOn, + IsChallengecompe = false, + SongRecentCnt = (uint)recentSongs.Length, + AryFavoriteSongNoes = favoriteSongs, + AryRecentSongNoes = recentSongs, + NotesPosition = userData.NotesPosition + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs b/TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs new file mode 100644 index 0000000..36edbb3 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs @@ -0,0 +1,21 @@ +namespace TaikoLocalServer.Controllers.Game; + +[Route("/v12r00_cn/chassis/verifyqrcode.php")] +[ApiController] +public class VerifyQrCodeController : BaseController +{ + [HttpPost] + [Produces("application/protobuf")] + public IActionResult VerifyQrCode([FromBody] VerifyQrcodeRequest request) + { + Logger.LogInformation("VerifyQrCode request : {Request}", request.Stringify()); + + var response = new VerifyQrcodeResponse + { + Result = 1, + QrcodeId = 1 + }; + + return Ok(response); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/GlobalUsings.cs b/TaikoLocalServer/GlobalUsings.cs new file mode 100644 index 0000000..3d8b45b --- /dev/null +++ b/TaikoLocalServer/GlobalUsings.cs @@ -0,0 +1,12 @@ +// Global using directives +global using Microsoft.AspNetCore.Mvc; +global using Microsoft.EntityFrameworkCore; +global using ProtoBuf; +global using Swan.Formatters; +global using SharedProject.Enums; +global using taiko.game; +global using TaikoLocalServer.Common; +global using TaikoLocalServer.Common.Utils; +global using TaikoLocalServer.Models; +global using TaikoLocalServer.Services; +global using TaikoLocalServer.Services.Interfaces; \ No newline at end of file diff --git a/TaikoLocalServer/Middlewares/AllNetRequestMiddleware.cs b/TaikoLocalServer/Middlewares/AllNetRequestMiddleware.cs new file mode 100644 index 0000000..8d827b5 --- /dev/null +++ b/TaikoLocalServer/Middlewares/AllNetRequestMiddleware.cs @@ -0,0 +1,59 @@ +using System.Net; +using ICSharpCode.SharpZipLib.Zip.Compression.Streams; + +namespace TaikoLocalServer.Middlewares; + +public class AllNetRequestMiddleware +{ + private readonly RequestDelegate next; + + public AllNetRequestMiddleware(RequestDelegate next) + { + this.next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + if (context.Request.Method != WebRequestMethods.Http.Post) + { + context.Response.StatusCode = StatusCodes.Status405MethodNotAllowed; + return; + } + + if (!context.Request.HasFormContentType) + { + await next(context); + return; + } + + context.Request.EnableBuffering(); + var bodyAsText = await new StreamReader(context.Request.Body).ReadToEndAsync(); + var compressed = Convert.FromBase64String(bodyAsText); + var decompressed = Decompress(compressed); + context.Request.Body.Position = 0; + context.Request.Body = decompressed; + context.Request.ContentLength = decompressed.Length; + + // Call the next delegate/middleware in the pipeline. + await next(context); + } + + private static Stream Decompress(byte[] data) + { + var outputStream = new MemoryStream(); + using var compressedStream = new MemoryStream(data); + using var inputStream = new InflaterInputStream(compressedStream); + inputStream.CopyTo(outputStream); + outputStream.Position = 0; + return outputStream; + } +} + +public static class AllNetMiddlewareExtensions +{ + public static IApplicationBuilder UseAllNetRequestMiddleware( + this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/Game.cs b/TaikoLocalServer/Models/Game.cs new file mode 100644 index 0000000..20ba105 --- /dev/null +++ b/TaikoLocalServer/Models/Game.cs @@ -0,0 +1,3228 @@ +// +// This file was generated by a tool; you should avoid making direct changes. +// Consider using 'partial classes' to extend these types +// Input: my.proto +// + +#region Designer generated code +#pragma warning disable CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192 +namespace taiko.game +{ + [global::ProtoBuf.ProtoContract()] + public partial class HeartBeatRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class HeartBeatResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"game_svr_stat", IsRequired = true)] + public uint GameSvrStat { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class BookKeepingRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"update_date", IsRequired = true)] + public string UpdateDate { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"credit_cost_1", IsRequired = true)] + public uint CreditCost1 { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"credit_cost_2", IsRequired = true)] + public uint CreditCost2 { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"credit_songs_1", IsRequired = true)] + public uint CreditSongs1 { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"credit_songs_2", IsRequired = true)] + public uint CreditSongs2 { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"all_play_cnt", IsRequired = true)] + public uint AllPlayCnt { get; set; } + + [global::ProtoBuf.ProtoMember(9, Name = @"service_sw_cnt", IsRequired = true)] + public uint ServiceSwCnt { get; set; } + + [global::ProtoBuf.ProtoMember(10, Name = @"free_play_cnt", IsRequired = true)] + public uint FreePlayCnt { get; set; } + + [global::ProtoBuf.ProtoMember(11, Name = @"error_log")] + [global::System.ComponentModel.DefaultValue("")] + public string ErrorLog + { + get => __pbn__ErrorLog ?? ""; + set => __pbn__ErrorLog = value; + } + public bool ShouldSerializeErrorLog() => __pbn__ErrorLog != null; + public void ResetErrorLog() => __pbn__ErrorLog = null; + private string __pbn__ErrorLog; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class BookKeepingResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class InitialdatacheckRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"hdd_ver", IsRequired = true)] + public uint HddVer { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class InitialdatacheckResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"default_song_flg")] + public byte[] DefaultSongFlg + { + get => __pbn__DefaultSongFlg; + set => __pbn__DefaultSongFlg = value; + } + public bool ShouldSerializeDefaultSongFlg() => __pbn__DefaultSongFlg != null; + public void ResetDefaultSongFlg() => __pbn__DefaultSongFlg = null; + private byte[] __pbn__DefaultSongFlg; + + [global::ProtoBuf.ProtoMember(3, Name = @"achievement_song_bit")] + public byte[] AchievementSongBit + { + get => __pbn__AchievementSongBit; + set => __pbn__AchievementSongBit = value; + } + public bool ShouldSerializeAchievementSongBit() => __pbn__AchievementSongBit != null; + public void ResetAchievementSongBit() => __pbn__AchievementSongBit = null; + private byte[] __pbn__AchievementSongBit; + + [global::ProtoBuf.ProtoMember(4, Name = @"ura_release_bit")] + public byte[] UraReleaseBit + { + get => __pbn__UraReleaseBit; + set => __pbn__UraReleaseBit = value; + } + public bool ShouldSerializeUraReleaseBit() => __pbn__UraReleaseBit != null; + public void ResetUraReleaseBit() => __pbn__UraReleaseBit = null; + private byte[] __pbn__UraReleaseBit; + + [global::ProtoBuf.ProtoMember(5, Name = @"song_introduction_end_datetime")] + [global::System.ComponentModel.DefaultValue("")] + public string SongIntroductionEndDatetime + { + get => __pbn__SongIntroductionEndDatetime ?? ""; + set => __pbn__SongIntroductionEndDatetime = value; + } + public bool ShouldSerializeSongIntroductionEndDatetime() => __pbn__SongIntroductionEndDatetime != null; + public void ResetSongIntroductionEndDatetime() => __pbn__SongIntroductionEndDatetime = null; + private string __pbn__SongIntroductionEndDatetime; + + [global::ProtoBuf.ProtoMember(6, Name = @"ary_movie_info")] + public global::System.Collections.Generic.List AryMovieInfoes { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(7, Name = @"ary_ai_event_data")] + public global::System.Collections.Generic.List AryAiEventDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(8, Name = @"ary_chassis_function_id")] + public uint[] AryChassisFunctionIds { get; set; } + + [global::ProtoBuf.ProtoMember(9, Name = @"ary_verup_no_data_1")] + public global::System.Collections.Generic.List AryVerupNoData1s { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(10, Name = @"ary_verup_no_data_2")] + public global::System.Collections.Generic.List AryVerupNoData2s { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(11, Name = @"server_current_datetime")] + public ulong ServerCurrentDatetime + { + get => __pbn__ServerCurrentDatetime.GetValueOrDefault(); + set => __pbn__ServerCurrentDatetime = value; + } + public bool ShouldSerializeServerCurrentDatetime() => __pbn__ServerCurrentDatetime != null; + public void ResetServerCurrentDatetime() => __pbn__ServerCurrentDatetime = null; + private ulong? __pbn__ServerCurrentDatetime; + + [global::ProtoBuf.ProtoContract()] + public partial class MovieData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"movie_id", IsRequired = true)] + public uint MovieId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"enable_days", IsRequired = true)] + public uint EnableDays { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class AiEventData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"ai_event_id", IsRequired = true)] + public uint AiEventId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"token_id")] + public uint TokenId + { + get => __pbn__TokenId.GetValueOrDefault(); + set => __pbn__TokenId = value; + } + public bool ShouldSerializeTokenId() => __pbn__TokenId != null; + public void ResetTokenId() => __pbn__TokenId = null; + private uint? __pbn__TokenId; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerupNoData1 : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"master_type", IsRequired = true)] + public uint MasterType { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no", IsRequired = true)] + public uint VerupNo { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerupNoData2 : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"master_type", IsRequired = true)] + public uint MasterType { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_information_data")] + public global::System.Collections.Generic.List AryInformationDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class InformationData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"info_id", IsRequired = true)] + public uint InfoId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no", IsRequired = true)] + public uint VerupNo { get; set; } + + } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GettelopRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"telop_id", IsRequired = true)] + public uint TelopId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GettelopResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no")] + public uint VerupNo + { + get => __pbn__VerupNo.GetValueOrDefault(); + set => __pbn__VerupNo = value; + } + public bool ShouldSerializeVerupNo() => __pbn__VerupNo != null; + public void ResetVerupNo() => __pbn__VerupNo = null; + private uint? __pbn__VerupNo; + + [global::ProtoBuf.ProtoMember(3, Name = @"start_datetime")] + [global::System.ComponentModel.DefaultValue("")] + public string StartDatetime + { + get => __pbn__StartDatetime ?? ""; + set => __pbn__StartDatetime = value; + } + public bool ShouldSerializeStartDatetime() => __pbn__StartDatetime != null; + public void ResetStartDatetime() => __pbn__StartDatetime = null; + private string __pbn__StartDatetime; + + [global::ProtoBuf.ProtoMember(4, Name = @"end_datetime")] + [global::System.ComponentModel.DefaultValue("")] + public string EndDatetime + { + get => __pbn__EndDatetime ?? ""; + set => __pbn__EndDatetime = value; + } + public bool ShouldSerializeEndDatetime() => __pbn__EndDatetime != null; + public void ResetEndDatetime() => __pbn__EndDatetime = null; + private string __pbn__EndDatetime; + + [global::ProtoBuf.ProtoMember(5, Name = @"telop")] + [global::System.ComponentModel.DefaultValue("")] + public string Telop + { + get => __pbn__Telop ?? ""; + set => __pbn__Telop = value; + } + public bool ShouldSerializeTelop() => __pbn__Telop != null; + public void ResetTelop() => __pbn__Telop = null; + private string __pbn__Telop; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetfolderRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"folder_id")] + public uint[] FolderIds { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetfolderResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_eventfolder_data")] + public global::System.Collections.Generic.List AryEventfolderDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class EventfolderData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"folder_id", IsRequired = true)] + public uint FolderId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no", IsRequired = true)] + public uint VerupNo { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"priority", IsRequired = true)] + public uint Priority { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"song_no")] + public uint[] SongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"parent_folder_id", IsRequired = true)] + public uint ParentFolderId { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetShopFolderRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetShopFolderResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no")] + public uint VerupNo + { + get => __pbn__VerupNo.GetValueOrDefault(); + set => __pbn__VerupNo = value; + } + public bool ShouldSerializeVerupNo() => __pbn__VerupNo != null; + public void ResetVerupNo() => __pbn__VerupNo = null; + private uint? __pbn__VerupNo; + + [global::ProtoBuf.ProtoMember(3, Name = @"token_id")] + public uint TokenId + { + get => __pbn__TokenId.GetValueOrDefault(); + set => __pbn__TokenId = value; + } + public bool ShouldSerializeTokenId() => __pbn__TokenId != null; + public void ResetTokenId() => __pbn__TokenId = null; + private uint? __pbn__TokenId; + + [global::ProtoBuf.ProtoMember(4, Name = @"ary_shop_folder_data")] + public global::System.Collections.Generic.List AryShopFolderDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class ShopFolderData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"song_no", IsRequired = true)] + public uint SongNo { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"price", IsRequired = true)] + public uint Price { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetSongIntroductionRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"set_id")] + public uint[] SetIds { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetSongIntroductionResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_song_introduction_data")] + public global::System.Collections.Generic.List ArySongIntroductionDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class SongIntroductionData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"set_id", IsRequired = true)] + public uint SetId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no", IsRequired = true)] + public uint VerupNo { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"main_song_no")] + public uint MainSongNo + { + get => __pbn__MainSongNo.GetValueOrDefault(); + set => __pbn__MainSongNo = value; + } + public bool ShouldSerializeMainSongNo() => __pbn__MainSongNo != null; + public void ResetMainSongNo() => __pbn__MainSongNo = null; + private uint? __pbn__MainSongNo; + + [global::ProtoBuf.ProtoMember(4, Name = @"sub_song_no")] + public uint[] SubSongNoes { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class TournamentcheckRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"kit_id", IsRequired = true)] + public uint KitId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class TournamentcheckResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"rare_rate")] + public uint RareRate + { + get => __pbn__RareRate.GetValueOrDefault(); + set => __pbn__RareRate = value; + } + public bool ShouldSerializeRareRate() => __pbn__RareRate != null; + public void ResetRareRate() => __pbn__RareRate = null; + private uint? __pbn__RareRate; + + [global::ProtoBuf.ProtoMember(3, Name = @"ary_gacha_song_data")] + public global::System.Collections.Generic.List AryGachaSongDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(4, Name = @"ary_gacha_tone_data")] + public global::System.Collections.Generic.List AryGachaToneDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(5, Name = @"ary_gacha_costume_1_data")] + public global::System.Collections.Generic.List AryGachaCostume1Datas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(6, Name = @"ary_gacha_costume_2_data")] + public global::System.Collections.Generic.List AryGachaCostume2Datas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(7, Name = @"ary_gacha_costume_3_data")] + public global::System.Collections.Generic.List AryGachaCostume3Datas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(8, Name = @"ary_gacha_costume_4_data")] + public global::System.Collections.Generic.List AryGachaCostume4Datas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(9, Name = @"ary_gacha_costume_5_data")] + public global::System.Collections.Generic.List AryGachaCostume5Datas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(10, Name = @"ary_gacha_title_data")] + public global::System.Collections.Generic.List AryGachaTitleDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class GachainfoData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"normal_gacha_flg", IsRequired = true)] + public byte[] NormalGachaFlg { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"rare_gacha_flg", IsRequired = true)] + public byte[] RareGachaFlg { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetDanOdaiRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"type", IsRequired = true)] + public uint Type { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"dan_id")] + public uint[] DanIds { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetDanOdaiResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_odai_data")] + public global::System.Collections.Generic.List AryOdaiDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class OdaiData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"dan_id", IsRequired = true)] + public uint DanId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no", IsRequired = true)] + public uint VerupNo { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"title", IsRequired = true)] + public string Title { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"ary_odai_song")] + public global::System.Collections.Generic.List AryOdaiSongs { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(5, Name = @"ary_odai_border")] + public global::System.Collections.Generic.List AryOdaiBorders { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class OdaiSong : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"song_no", IsRequired = true)] + public uint SongNo { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"level", IsRequired = true)] + public uint Level { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"is_hidden_song_name", IsRequired = true)] + public bool IsHiddenSongName { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class OdaiBorder : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"odai_type", IsRequired = true)] + public uint OdaiType { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"border_type", IsRequired = true)] + public uint BorderType { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"red_border_total")] + public uint RedBorderTotal + { + get => __pbn__RedBorderTotal.GetValueOrDefault(); + set => __pbn__RedBorderTotal = value; + } + public bool ShouldSerializeRedBorderTotal() => __pbn__RedBorderTotal != null; + public void ResetRedBorderTotal() => __pbn__RedBorderTotal = null; + private uint? __pbn__RedBorderTotal; + + [global::ProtoBuf.ProtoMember(4, Name = @"gold_border_total")] + public uint GoldBorderTotal + { + get => __pbn__GoldBorderTotal.GetValueOrDefault(); + set => __pbn__GoldBorderTotal = value; + } + public bool ShouldSerializeGoldBorderTotal() => __pbn__GoldBorderTotal != null; + public void ResetGoldBorderTotal() => __pbn__GoldBorderTotal = null; + private uint? __pbn__GoldBorderTotal; + + [global::ProtoBuf.ProtoMember(5, Name = @"red_border_1")] + public uint RedBorder1 + { + get => __pbn__RedBorder1.GetValueOrDefault(); + set => __pbn__RedBorder1 = value; + } + public bool ShouldSerializeRedBorder1() => __pbn__RedBorder1 != null; + public void ResetRedBorder1() => __pbn__RedBorder1 = null; + private uint? __pbn__RedBorder1; + + [global::ProtoBuf.ProtoMember(6, Name = @"gold_border_1")] + public uint GoldBorder1 + { + get => __pbn__GoldBorder1.GetValueOrDefault(); + set => __pbn__GoldBorder1 = value; + } + public bool ShouldSerializeGoldBorder1() => __pbn__GoldBorder1 != null; + public void ResetGoldBorder1() => __pbn__GoldBorder1 = null; + private uint? __pbn__GoldBorder1; + + [global::ProtoBuf.ProtoMember(7, Name = @"red_border_2")] + public uint RedBorder2 + { + get => __pbn__RedBorder2.GetValueOrDefault(); + set => __pbn__RedBorder2 = value; + } + public bool ShouldSerializeRedBorder2() => __pbn__RedBorder2 != null; + public void ResetRedBorder2() => __pbn__RedBorder2 = null; + private uint? __pbn__RedBorder2; + + [global::ProtoBuf.ProtoMember(8, Name = @"gold_border_2")] + public uint GoldBorder2 + { + get => __pbn__GoldBorder2.GetValueOrDefault(); + set => __pbn__GoldBorder2 = value; + } + public bool ShouldSerializeGoldBorder2() => __pbn__GoldBorder2 != null; + public void ResetGoldBorder2() => __pbn__GoldBorder2 = null; + private uint? __pbn__GoldBorder2; + + [global::ProtoBuf.ProtoMember(9, Name = @"red_border_3")] + public uint RedBorder3 + { + get => __pbn__RedBorder3.GetValueOrDefault(); + set => __pbn__RedBorder3 = value; + } + public bool ShouldSerializeRedBorder3() => __pbn__RedBorder3 != null; + public void ResetRedBorder3() => __pbn__RedBorder3 = null; + private uint? __pbn__RedBorder3; + + [global::ProtoBuf.ProtoMember(10, Name = @"gold_border_3")] + public uint GoldBorder3 + { + get => __pbn__GoldBorder3.GetValueOrDefault(); + set => __pbn__GoldBorder3 = value; + } + public bool ShouldSerializeGoldBorder3() => __pbn__GoldBorder3 != null; + public void ResetGoldBorder3() => __pbn__GoldBorder3 = null; + private uint? __pbn__GoldBorder3; + + } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerifyQrcodeRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"qrcode_serial", IsRequired = true)] + public string QrcodeSerial { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"is_new_card")] + public bool IsNewCard + { + get => __pbn__IsNewCard.GetValueOrDefault(); + set => __pbn__IsNewCard = value; + } + public bool ShouldSerializeIsNewCard() => __pbn__IsNewCard != null; + public void ResetIsNewCard() => __pbn__IsNewCard = null; + private bool? __pbn__IsNewCard; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerifyQrcodeResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"qrcode_id")] + public uint QrcodeId + { + get => __pbn__QrcodeId.GetValueOrDefault(); + set => __pbn__QrcodeId = value; + } + public bool ShouldSerializeQrcodeId() => __pbn__QrcodeId != null; + public void ResetQrcodeId() => __pbn__QrcodeId = null; + private uint? __pbn__QrcodeId; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class ExecuteQrcodeRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"qrcode_serial", IsRequired = true)] + public string QrcodeSerial { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class ExecuteQrcodeResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"qrcode_id")] + public uint QrcodeId + { + get => __pbn__QrcodeId.GetValueOrDefault(); + set => __pbn__QrcodeId = value; + } + public bool ShouldSerializeQrcodeId() => __pbn__QrcodeId != null; + public void ResetQrcodeId() => __pbn__QrcodeId = null; + private uint? __pbn__QrcodeId; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetApplicationUrlRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"qrcode_id", IsRequired = true)] + public uint QrcodeId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetApplicationUrlResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"application_url")] + [global::System.ComponentModel.DefaultValue("")] + public string ApplicationUrl + { + get => __pbn__ApplicationUrl ?? ""; + set => __pbn__ApplicationUrl = value; + } + public bool ShouldSerializeApplicationUrl() => __pbn__ApplicationUrl != null; + public void ResetApplicationUrl() => __pbn__ApplicationUrl = null; + private string __pbn__ApplicationUrl; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class SetAnyStringRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"any_string", IsRequired = true)] + public string AnyString { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class SetAnyStringResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetGenericMasterRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"master_type", IsRequired = true)] + public uint MasterType { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetGenericMasterResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"verup_no")] + public uint VerupNo + { + get => __pbn__VerupNo.GetValueOrDefault(); + set => __pbn__VerupNo = value; + } + public bool ShouldSerializeVerupNo() => __pbn__VerupNo != null; + public void ResetVerupNo() => __pbn__VerupNo = null; + private uint? __pbn__VerupNo; + + [global::ProtoBuf.ProtoMember(3, Name = @"enable_id_bit")] + public byte[] EnableIdBit + { + get => __pbn__EnableIdBit; + set => __pbn__EnableIdBit = value; + } + public bool ShouldSerializeEnableIdBit() => __pbn__EnableIdBit != null; + public void ResetEnableIdBit() => __pbn__EnableIdBit = null; + private byte[] __pbn__EnableIdBit; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class MusicUsbAuth1Request : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"usbmem_ver", IsRequired = true)] + public string UsbmemVer { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"usbmem_serial", IsRequired = true)] + public string UsbmemSerial { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"usbmem_vid", IsRequired = true)] + public string UsbmemVid { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"usbmem_pid", IsRequired = true)] + public string UsbmemPid { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"app_ver", IsRequired = true)] + public uint AppVer { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class MusicUsbAuth1Response : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"secret_key_1")] + [global::System.ComponentModel.DefaultValue("")] + public string SecretKey1 + { + get => __pbn__SecretKey1 ?? ""; + set => __pbn__SecretKey1 = value; + } + public bool ShouldSerializeSecretKey1() => __pbn__SecretKey1 != null; + public void ResetSecretKey1() => __pbn__SecretKey1 = null; + private string __pbn__SecretKey1; + + [global::ProtoBuf.ProtoMember(3, Name = @"secret_key_2")] + [global::System.ComponentModel.DefaultValue("")] + public string SecretKey2 + { + get => __pbn__SecretKey2 ?? ""; + set => __pbn__SecretKey2 = value; + } + public bool ShouldSerializeSecretKey2() => __pbn__SecretKey2 != null; + public void ResetSecretKey2() => __pbn__SecretKey2 = null; + private string __pbn__SecretKey2; + + [global::ProtoBuf.ProtoMember(4, Name = @"datafile_hash")] + [global::System.ComponentModel.DefaultValue("")] + public string DatafileHash + { + get => __pbn__DatafileHash ?? ""; + set => __pbn__DatafileHash = value; + } + public bool ShouldSerializeDatafileHash() => __pbn__DatafileHash != null; + public void ResetDatafileHash() => __pbn__DatafileHash = null; + private string __pbn__DatafileHash; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class MusicUsbAuth2Request : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"usbmem_ver", IsRequired = true)] + public string UsbmemVer { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"usbmem_serial", IsRequired = true)] + public string UsbmemSerial { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"usbmem_vid", IsRequired = true)] + public string UsbmemVid { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"usbmem_pid", IsRequired = true)] + public string UsbmemPid { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"app_ver", IsRequired = true)] + public uint AppVer { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"datafile_hash", IsRequired = true)] + public string DatafileHash { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class MusicUsbAuth2Response : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class BAIDRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"country_id", IsRequired = true)] + public string CountryId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class BAIDResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"player_type")] + public uint PlayerType + { + get => __pbn__PlayerType.GetValueOrDefault(); + set => __pbn__PlayerType = value; + } + public bool ShouldSerializePlayerType() => __pbn__PlayerType != null; + public void ResetPlayerType() => __pbn__PlayerType = null; + private uint? __pbn__PlayerType; + + [global::ProtoBuf.ProtoMember(3, Name = @"baid")] + public ulong Baid + { + get => __pbn__Baid.GetValueOrDefault(); + set => __pbn__Baid = value; + } + public bool ShouldSerializeBaid() => __pbn__Baid != null; + public void ResetBaid() => __pbn__Baid = null; + private ulong? __pbn__Baid; + + [global::ProtoBuf.ProtoMember(4, Name = @"mydon_name")] + [global::System.ComponentModel.DefaultValue("")] + public string MydonName + { + get => __pbn__MydonName ?? ""; + set => __pbn__MydonName = value; + } + public bool ShouldSerializeMydonName() => __pbn__MydonName != null; + public void ResetMydonName() => __pbn__MydonName = null; + private string __pbn__MydonName; + + [global::ProtoBuf.ProtoMember(5, Name = @"mydon_name_language")] + public uint MydonNameLanguage + { + get => __pbn__MydonNameLanguage.GetValueOrDefault(); + set => __pbn__MydonNameLanguage = value; + } + public bool ShouldSerializeMydonNameLanguage() => __pbn__MydonNameLanguage != null; + public void ResetMydonNameLanguage() => __pbn__MydonNameLanguage = null; + private uint? __pbn__MydonNameLanguage; + + [global::ProtoBuf.ProtoMember(6, Name = @"title")] + [global::System.ComponentModel.DefaultValue("")] + public string Title + { + get => __pbn__Title ?? ""; + set => __pbn__Title = value; + } + public bool ShouldSerializeTitle() => __pbn__Title != null; + public void ResetTitle() => __pbn__Title = null; + private string __pbn__Title; + + [global::ProtoBuf.ProtoMember(7, Name = @"titleplate_id")] + public uint TitleplateId + { + get => __pbn__TitleplateId.GetValueOrDefault(); + set => __pbn__TitleplateId = value; + } + public bool ShouldSerializeTitleplateId() => __pbn__TitleplateId != null; + public void ResetTitleplateId() => __pbn__TitleplateId = null; + private uint? __pbn__TitleplateId; + + [global::ProtoBuf.ProtoMember(8, Name = @"color_face")] + public uint ColorFace + { + get => __pbn__ColorFace.GetValueOrDefault(); + set => __pbn__ColorFace = value; + } + public bool ShouldSerializeColorFace() => __pbn__ColorFace != null; + public void ResetColorFace() => __pbn__ColorFace = null; + private uint? __pbn__ColorFace; + + [global::ProtoBuf.ProtoMember(9, Name = @"color_body")] + public uint ColorBody + { + get => __pbn__ColorBody.GetValueOrDefault(); + set => __pbn__ColorBody = value; + } + public bool ShouldSerializeColorBody() => __pbn__ColorBody != null; + public void ResetColorBody() => __pbn__ColorBody = null; + private uint? __pbn__ColorBody; + + [global::ProtoBuf.ProtoMember(10, Name = @"color_limb")] + public uint ColorLimb + { + get => __pbn__ColorLimb.GetValueOrDefault(); + set => __pbn__ColorLimb = value; + } + public bool ShouldSerializeColorLimb() => __pbn__ColorLimb != null; + public void ResetColorLimb() => __pbn__ColorLimb = null; + private uint? __pbn__ColorLimb; + + [global::ProtoBuf.ProtoMember(11, Name = @"ary_costumedata")] + public CostumeData AryCostumedata { get; set; } + + [global::ProtoBuf.ProtoMember(12, Name = @"costume_flg_1")] + public byte[] CostumeFlg1 + { + get => __pbn__CostumeFlg1; + set => __pbn__CostumeFlg1 = value; + } + public bool ShouldSerializeCostumeFlg1() => __pbn__CostumeFlg1 != null; + public void ResetCostumeFlg1() => __pbn__CostumeFlg1 = null; + private byte[] __pbn__CostumeFlg1; + + [global::ProtoBuf.ProtoMember(13, Name = @"costume_flg_2")] + public byte[] CostumeFlg2 + { + get => __pbn__CostumeFlg2; + set => __pbn__CostumeFlg2 = value; + } + public bool ShouldSerializeCostumeFlg2() => __pbn__CostumeFlg2 != null; + public void ResetCostumeFlg2() => __pbn__CostumeFlg2 = null; + private byte[] __pbn__CostumeFlg2; + + [global::ProtoBuf.ProtoMember(14, Name = @"costume_flg_3")] + public byte[] CostumeFlg3 + { + get => __pbn__CostumeFlg3; + set => __pbn__CostumeFlg3 = value; + } + public bool ShouldSerializeCostumeFlg3() => __pbn__CostumeFlg3 != null; + public void ResetCostumeFlg3() => __pbn__CostumeFlg3 = null; + private byte[] __pbn__CostumeFlg3; + + [global::ProtoBuf.ProtoMember(15, Name = @"costume_flg_4")] + public byte[] CostumeFlg4 + { + get => __pbn__CostumeFlg4; + set => __pbn__CostumeFlg4 = value; + } + public bool ShouldSerializeCostumeFlg4() => __pbn__CostumeFlg4 != null; + public void ResetCostumeFlg4() => __pbn__CostumeFlg4 = null; + private byte[] __pbn__CostumeFlg4; + + [global::ProtoBuf.ProtoMember(16, Name = @"costume_flg_5")] + public byte[] CostumeFlg5 + { + get => __pbn__CostumeFlg5; + set => __pbn__CostumeFlg5 = value; + } + public bool ShouldSerializeCostumeFlg5() => __pbn__CostumeFlg5 != null; + public void ResetCostumeFlg5() => __pbn__CostumeFlg5 = null; + private byte[] __pbn__CostumeFlg5; + + [global::ProtoBuf.ProtoMember(17, Name = @"last_play_datetime")] + [global::System.ComponentModel.DefaultValue("")] + public string LastPlayDatetime + { + get => __pbn__LastPlayDatetime ?? ""; + set => __pbn__LastPlayDatetime = value; + } + public bool ShouldSerializeLastPlayDatetime() => __pbn__LastPlayDatetime != null; + public void ResetLastPlayDatetime() => __pbn__LastPlayDatetime = null; + private string __pbn__LastPlayDatetime; + + [global::ProtoBuf.ProtoMember(18, Name = @"is_disp_dan_on")] + public bool IsDispDanOn + { + get => __pbn__IsDispDanOn.GetValueOrDefault(); + set => __pbn__IsDispDanOn = value; + } + public bool ShouldSerializeIsDispDanOn() => __pbn__IsDispDanOn != null; + public void ResetIsDispDanOn() => __pbn__IsDispDanOn = null; + private bool? __pbn__IsDispDanOn; + + [global::ProtoBuf.ProtoMember(19, Name = @"got_dan_max")] + public uint GotDanMax + { + get => __pbn__GotDanMax.GetValueOrDefault(); + set => __pbn__GotDanMax = value; + } + public bool ShouldSerializeGotDanMax() => __pbn__GotDanMax != null; + public void ResetGotDanMax() => __pbn__GotDanMax = null; + private uint? __pbn__GotDanMax; + + [global::ProtoBuf.ProtoMember(20, Name = @"got_dan_flg")] + public byte[] GotDanFlg + { + get => __pbn__GotDanFlg; + set => __pbn__GotDanFlg = value; + } + public bool ShouldSerializeGotDanFlg() => __pbn__GotDanFlg != null; + public void ResetGotDanFlg() => __pbn__GotDanFlg = null; + private byte[] __pbn__GotDanFlg; + + [global::ProtoBuf.ProtoMember(21, Name = @"got_danextra_flg")] + public byte[] GotDanextraFlg + { + get => __pbn__GotDanextraFlg; + set => __pbn__GotDanextraFlg = value; + } + public bool ShouldSerializeGotDanextraFlg() => __pbn__GotDanextraFlg != null; + public void ResetGotDanextraFlg() => __pbn__GotDanextraFlg = null; + private byte[] __pbn__GotDanextraFlg; + + [global::ProtoBuf.ProtoMember(22, Name = @"default_tone_setting")] + public uint DefaultToneSetting + { + get => __pbn__DefaultToneSetting.GetValueOrDefault(); + set => __pbn__DefaultToneSetting = value; + } + public bool ShouldSerializeDefaultToneSetting() => __pbn__DefaultToneSetting != null; + public void ResetDefaultToneSetting() => __pbn__DefaultToneSetting = null; + private uint? __pbn__DefaultToneSetting; + + [global::ProtoBuf.ProtoMember(23, Name = @"generic_info_flg")] + public byte[] GenericInfoFlg + { + get => __pbn__GenericInfoFlg; + set => __pbn__GenericInfoFlg = value; + } + public bool ShouldSerializeGenericInfoFlg() => __pbn__GenericInfoFlg != null; + public void ResetGenericInfoFlg() => __pbn__GenericInfoFlg = null; + private byte[] __pbn__GenericInfoFlg; + + [global::ProtoBuf.ProtoMember(24, Name = @"ary_crown_count")] + public uint[] AryCrownCounts { get; set; } + + [global::ProtoBuf.ProtoMember(25, Name = @"ary_score_rank_count")] + public uint[] AryScoreRankCounts { get; set; } + + [global::ProtoBuf.ProtoMember(26, Name = @"is_disp_achievement_on")] + public bool IsDispAchievementOn + { + get => __pbn__IsDispAchievementOn.GetValueOrDefault(); + set => __pbn__IsDispAchievementOn = value; + } + public bool ShouldSerializeIsDispAchievementOn() => __pbn__IsDispAchievementOn != null; + public void ResetIsDispAchievementOn() => __pbn__IsDispAchievementOn = null; + private bool? __pbn__IsDispAchievementOn; + + [global::ProtoBuf.ProtoMember(27, Name = @"disp_achievement_type")] + public uint DispAchievementType + { + get => __pbn__DispAchievementType.GetValueOrDefault(); + set => __pbn__DispAchievementType = value; + } + public bool ShouldSerializeDispAchievementType() => __pbn__DispAchievementType != null; + public void ResetDispAchievementType() => __pbn__DispAchievementType = null; + private uint? __pbn__DispAchievementType; + + [global::ProtoBuf.ProtoMember(28, Name = @"is_disp_achievement_type_set")] + public bool IsDispAchievementTypeSet + { + get => __pbn__IsDispAchievementTypeSet.GetValueOrDefault(); + set => __pbn__IsDispAchievementTypeSet = value; + } + public bool ShouldSerializeIsDispAchievementTypeSet() => __pbn__IsDispAchievementTypeSet != null; + public void ResetIsDispAchievementTypeSet() => __pbn__IsDispAchievementTypeSet = null; + private bool? __pbn__IsDispAchievementTypeSet; + + [global::ProtoBuf.ProtoMember(29, Name = @"last_play_mode")] + public uint LastPlayMode + { + get => __pbn__LastPlayMode.GetValueOrDefault(); + set => __pbn__LastPlayMode = value; + } + public bool ShouldSerializeLastPlayMode() => __pbn__LastPlayMode != null; + public void ResetLastPlayMode() => __pbn__LastPlayMode = null; + private uint? __pbn__LastPlayMode; + + [global::ProtoBuf.ProtoMember(30, Name = @"is_disp_souuchi_on")] + public bool IsDispSouuchiOn + { + get => __pbn__IsDispSouuchiOn.GetValueOrDefault(); + set => __pbn__IsDispSouuchiOn = value; + } + public bool ShouldSerializeIsDispSouuchiOn() => __pbn__IsDispSouuchiOn != null; + public void ResetIsDispSouuchiOn() => __pbn__IsDispSouuchiOn = null; + private bool? __pbn__IsDispSouuchiOn; + + [global::ProtoBuf.ProtoContract()] + public partial class CostumeData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"costume_1")] + public uint Costume1 + { + get => __pbn__Costume1.GetValueOrDefault(); + set => __pbn__Costume1 = value; + } + public bool ShouldSerializeCostume1() => __pbn__Costume1 != null; + public void ResetCostume1() => __pbn__Costume1 = null; + private uint? __pbn__Costume1; + + [global::ProtoBuf.ProtoMember(2, Name = @"costume_2")] + public uint Costume2 + { + get => __pbn__Costume2.GetValueOrDefault(); + set => __pbn__Costume2 = value; + } + public bool ShouldSerializeCostume2() => __pbn__Costume2 != null; + public void ResetCostume2() => __pbn__Costume2 = null; + private uint? __pbn__Costume2; + + [global::ProtoBuf.ProtoMember(3, Name = @"costume_3")] + public uint Costume3 + { + get => __pbn__Costume3.GetValueOrDefault(); + set => __pbn__Costume3 = value; + } + public bool ShouldSerializeCostume3() => __pbn__Costume3 != null; + public void ResetCostume3() => __pbn__Costume3 = null; + private uint? __pbn__Costume3; + + [global::ProtoBuf.ProtoMember(4, Name = @"costume_4")] + public uint Costume4 + { + get => __pbn__Costume4.GetValueOrDefault(); + set => __pbn__Costume4 = value; + } + public bool ShouldSerializeCostume4() => __pbn__Costume4 != null; + public void ResetCostume4() => __pbn__Costume4 = null; + private uint? __pbn__Costume4; + + [global::ProtoBuf.ProtoMember(5, Name = @"costume_5")] + public uint Costume5 + { + get => __pbn__Costume5.GetValueOrDefault(); + set => __pbn__Costume5 = value; + } + public bool ShouldSerializeCostume5() => __pbn__Costume5 != null; + public void ResetCostume5() => __pbn__Costume5 = null; + private uint? __pbn__Costume5; + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class MydonEntryRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"country_id", IsRequired = true)] + public string CountryId { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"mydon_name", IsRequired = true)] + public string MydonName { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"mydon_name_language", IsRequired = true)] + public uint MydonNameLanguage { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class MydonEntryResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid")] + public ulong Baid + { + get => __pbn__Baid.GetValueOrDefault(); + set => __pbn__Baid = value; + } + public bool ShouldSerializeBaid() => __pbn__Baid != null; + public void ResetBaid() => __pbn__Baid = null; + private ulong? __pbn__Baid; + + [global::ProtoBuf.ProtoMember(3, Name = @"mydon_name")] + [global::System.ComponentModel.DefaultValue("")] + public string MydonName + { + get => __pbn__MydonName ?? ""; + set => __pbn__MydonName = value; + } + public bool ShouldSerializeMydonName() => __pbn__MydonName != null; + public void ResetMydonName() => __pbn__MydonName = null; + private string __pbn__MydonName; + + [global::ProtoBuf.ProtoMember(4, Name = @"mydon_name_language")] + public uint MydonNameLanguage + { + get => __pbn__MydonNameLanguage.GetValueOrDefault(); + set => __pbn__MydonNameLanguage = value; + } + public bool ShouldSerializeMydonNameLanguage() => __pbn__MydonNameLanguage != null; + public void ResetMydonNameLanguage() => __pbn__MydonNameLanguage = null; + private uint? __pbn__MydonNameLanguage; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class UserDataRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class UserDataResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"tone_flg")] + public byte[] ToneFlg + { + get => __pbn__ToneFlg; + set => __pbn__ToneFlg = value; + } + public bool ShouldSerializeToneFlg() => __pbn__ToneFlg != null; + public void ResetToneFlg() => __pbn__ToneFlg = null; + private byte[] __pbn__ToneFlg; + + [global::ProtoBuf.ProtoMember(3, Name = @"title_flg")] + public byte[] TitleFlg + { + get => __pbn__TitleFlg; + set => __pbn__TitleFlg = value; + } + public bool ShouldSerializeTitleFlg() => __pbn__TitleFlg != null; + public void ResetTitleFlg() => __pbn__TitleFlg = null; + private byte[] __pbn__TitleFlg; + + [global::ProtoBuf.ProtoMember(4, Name = @"release_song_flg")] + public byte[] ReleaseSongFlg + { + get => __pbn__ReleaseSongFlg; + set => __pbn__ReleaseSongFlg = value; + } + public bool ShouldSerializeReleaseSongFlg() => __pbn__ReleaseSongFlg != null; + public void ResetReleaseSongFlg() => __pbn__ReleaseSongFlg = null; + private byte[] __pbn__ReleaseSongFlg; + + [global::ProtoBuf.ProtoMember(5, Name = @"ura_release_song_flg")] + public byte[] UraReleaseSongFlg + { + get => __pbn__UraReleaseSongFlg; + set => __pbn__UraReleaseSongFlg = value; + } + public bool ShouldSerializeUraReleaseSongFlg() => __pbn__UraReleaseSongFlg != null; + public void ResetUraReleaseSongFlg() => __pbn__UraReleaseSongFlg = null; + private byte[] __pbn__UraReleaseSongFlg; + + [global::ProtoBuf.ProtoMember(6, Name = @"ary_favorite_song_no")] + public uint[] AryFavoriteSongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"ary_recent_song_no")] + public uint[] AryRecentSongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"disp_score_type")] + public uint DispScoreType + { + get => __pbn__DispScoreType.GetValueOrDefault(); + set => __pbn__DispScoreType = value; + } + public bool ShouldSerializeDispScoreType() => __pbn__DispScoreType != null; + public void ResetDispScoreType() => __pbn__DispScoreType = null; + private uint? __pbn__DispScoreType; + + [global::ProtoBuf.ProtoMember(9, Name = @"disp_level_chassis")] + public uint DispLevelChassis + { + get => __pbn__DispLevelChassis.GetValueOrDefault(); + set => __pbn__DispLevelChassis = value; + } + public bool ShouldSerializeDispLevelChassis() => __pbn__DispLevelChassis != null; + public void ResetDispLevelChassis() => __pbn__DispLevelChassis = null; + private uint? __pbn__DispLevelChassis; + + [global::ProtoBuf.ProtoMember(10, Name = @"disp_level_self")] + public uint DispLevelSelf + { + get => __pbn__DispLevelSelf.GetValueOrDefault(); + set => __pbn__DispLevelSelf = value; + } + public bool ShouldSerializeDispLevelSelf() => __pbn__DispLevelSelf != null; + public void ResetDispLevelSelf() => __pbn__DispLevelSelf = null; + private uint? __pbn__DispLevelSelf; + + [global::ProtoBuf.ProtoMember(11, Name = @"is_disp_tojiru_on")] + public bool IsDispTojiruOn + { + get => __pbn__IsDispTojiruOn.GetValueOrDefault(); + set => __pbn__IsDispTojiruOn = value; + } + public bool ShouldSerializeIsDispTojiruOn() => __pbn__IsDispTojiruOn != null; + public void ResetIsDispTojiruOn() => __pbn__IsDispTojiruOn = null; + private bool? __pbn__IsDispTojiruOn; + + [global::ProtoBuf.ProtoMember(12, Name = @"default_option_setting")] + public byte[] DefaultOptionSetting + { + get => __pbn__DefaultOptionSetting; + set => __pbn__DefaultOptionSetting = value; + } + public bool ShouldSerializeDefaultOptionSetting() => __pbn__DefaultOptionSetting != null; + public void ResetDefaultOptionSetting() => __pbn__DefaultOptionSetting = null; + private byte[] __pbn__DefaultOptionSetting; + + [global::ProtoBuf.ProtoMember(13, Name = @"notes_position", DataFormat = global::ProtoBuf.DataFormat.ZigZag)] + public int NotesPosition + { + get => __pbn__NotesPosition.GetValueOrDefault(); + set => __pbn__NotesPosition = value; + } + public bool ShouldSerializeNotesPosition() => __pbn__NotesPosition != null; + public void ResetNotesPosition() => __pbn__NotesPosition = null; + private int? __pbn__NotesPosition; + + [global::ProtoBuf.ProtoMember(14, Name = @"is_voice_on")] + public bool IsVoiceOn + { + get => __pbn__IsVoiceOn.GetValueOrDefault(); + set => __pbn__IsVoiceOn = value; + } + public bool ShouldSerializeIsVoiceOn() => __pbn__IsVoiceOn != null; + public void ResetIsVoiceOn() => __pbn__IsVoiceOn = null; + private bool? __pbn__IsVoiceOn; + + [global::ProtoBuf.ProtoMember(15, Name = @"is_skip_on")] + public bool IsSkipOn + { + get => __pbn__IsSkipOn.GetValueOrDefault(); + set => __pbn__IsSkipOn = value; + } + public bool ShouldSerializeIsSkipOn() => __pbn__IsSkipOn != null; + public void ResetIsSkipOn() => __pbn__IsSkipOn = null; + private bool? __pbn__IsSkipOn; + + [global::ProtoBuf.ProtoMember(16, Name = @"difficulty_setting_course")] + public uint DifficultySettingCourse + { + get => __pbn__DifficultySettingCourse.GetValueOrDefault(); + set => __pbn__DifficultySettingCourse = value; + } + public bool ShouldSerializeDifficultySettingCourse() => __pbn__DifficultySettingCourse != null; + public void ResetDifficultySettingCourse() => __pbn__DifficultySettingCourse = null; + private uint? __pbn__DifficultySettingCourse; + + [global::ProtoBuf.ProtoMember(17, Name = @"difficulty_setting_star")] + public uint DifficultySettingStar + { + get => __pbn__DifficultySettingStar.GetValueOrDefault(); + set => __pbn__DifficultySettingStar = value; + } + public bool ShouldSerializeDifficultySettingStar() => __pbn__DifficultySettingStar != null; + public void ResetDifficultySettingStar() => __pbn__DifficultySettingStar = null; + private uint? __pbn__DifficultySettingStar; + + [global::ProtoBuf.ProtoMember(18, Name = @"difficulty_setting_sort")] + public uint DifficultySettingSort + { + get => __pbn__DifficultySettingSort.GetValueOrDefault(); + set => __pbn__DifficultySettingSort = value; + } + public bool ShouldSerializeDifficultySettingSort() => __pbn__DifficultySettingSort != null; + public void ResetDifficultySettingSort() => __pbn__DifficultySettingSort = null; + private uint? __pbn__DifficultySettingSort; + + [global::ProtoBuf.ProtoMember(19, Name = @"difficulty_played_course")] + public uint DifficultyPlayedCourse + { + get => __pbn__DifficultyPlayedCourse.GetValueOrDefault(); + set => __pbn__DifficultyPlayedCourse = value; + } + public bool ShouldSerializeDifficultyPlayedCourse() => __pbn__DifficultyPlayedCourse != null; + public void ResetDifficultyPlayedCourse() => __pbn__DifficultyPlayedCourse = null; + private uint? __pbn__DifficultyPlayedCourse; + + [global::ProtoBuf.ProtoMember(20, Name = @"difficulty_played_star")] + public uint DifficultyPlayedStar + { + get => __pbn__DifficultyPlayedStar.GetValueOrDefault(); + set => __pbn__DifficultyPlayedStar = value; + } + public bool ShouldSerializeDifficultyPlayedStar() => __pbn__DifficultyPlayedStar != null; + public void ResetDifficultyPlayedStar() => __pbn__DifficultyPlayedStar = null; + private uint? __pbn__DifficultyPlayedStar; + + [global::ProtoBuf.ProtoMember(21, Name = @"difficulty_played_sort")] + public uint DifficultyPlayedSort + { + get => __pbn__DifficultyPlayedSort.GetValueOrDefault(); + set => __pbn__DifficultyPlayedSort = value; + } + public bool ShouldSerializeDifficultyPlayedSort() => __pbn__DifficultyPlayedSort != null; + public void ResetDifficultyPlayedSort() => __pbn__DifficultyPlayedSort = null; + private uint? __pbn__DifficultyPlayedSort; + + [global::ProtoBuf.ProtoMember(22, Name = @"total_credit_cnt")] + public uint TotalCreditCnt + { + get => __pbn__TotalCreditCnt.GetValueOrDefault(); + set => __pbn__TotalCreditCnt = value; + } + public bool ShouldSerializeTotalCreditCnt() => __pbn__TotalCreditCnt != null; + public void ResetTotalCreditCnt() => __pbn__TotalCreditCnt = null; + private uint? __pbn__TotalCreditCnt; + + [global::ProtoBuf.ProtoMember(23, Name = @"song_recent_cnt")] + public uint SongRecentCnt + { + get => __pbn__SongRecentCnt.GetValueOrDefault(); + set => __pbn__SongRecentCnt = value; + } + public bool ShouldSerializeSongRecentCnt() => __pbn__SongRecentCnt != null; + public void ResetSongRecentCnt() => __pbn__SongRecentCnt = null; + private uint? __pbn__SongRecentCnt; + + [global::ProtoBuf.ProtoMember(24, Name = @"is_challengecompe")] + public bool IsChallengecompe + { + get => __pbn__IsChallengecompe.GetValueOrDefault(); + set => __pbn__IsChallengecompe = value; + } + public bool ShouldSerializeIsChallengecompe() => __pbn__IsChallengecompe != null; + public void ResetIsChallengecompe() => __pbn__IsChallengecompe = null; + private bool? __pbn__IsChallengecompe; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class PlayResultRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"baid_conf", IsRequired = true)] + public ulong BaidConf { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id_conf", IsRequired = true)] + public string ChassisIdConf { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id_conf", IsRequired = true)] + public string ShopIdConf { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"play_datetime_conf", IsRequired = true)] + public string PlayDatetimeConf { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"playresult_data", IsRequired = true)] + public byte[] PlayresultData { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class PlayResultResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class PlayResultDataRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"play_datetime", IsRequired = true)] + public string PlayDatetime { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"is_right", IsRequired = true)] + public bool IsRight { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"card_type", IsRequired = true)] + public uint CardType { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"is_two_players", IsRequired = true)] + public bool IsTwoPlayers { get; set; } + + [global::ProtoBuf.ProtoMember(9, Name = @"ary_stage_info")] + public global::System.Collections.Generic.List AryStageInfoes { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(10, Name = @"release_song_no")] + public uint[] ReleaseSongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(11, Name = @"ura_release_song_no")] + public uint[] UraReleaseSongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(12, Name = @"get_tone_no")] + public uint[] GetToneNoes { get; set; } + + [global::ProtoBuf.ProtoMember(13, Name = @"get_costume_no_1")] + public uint[] GetCostumeNo1s { get; set; } + + [global::ProtoBuf.ProtoMember(14, Name = @"get_costume_no_2")] + public uint[] GetCostumeNo2s { get; set; } + + [global::ProtoBuf.ProtoMember(15, Name = @"get_costume_no_3")] + public uint[] GetCostumeNo3s { get; set; } + + [global::ProtoBuf.ProtoMember(16, Name = @"get_costume_no_4")] + public uint[] GetCostumeNo4s { get; set; } + + [global::ProtoBuf.ProtoMember(17, Name = @"get_costume_no_5")] + public uint[] GetCostumeNo5s { get; set; } + + [global::ProtoBuf.ProtoMember(18, Name = @"get_title_no")] + public uint[] GetTitleNoes { get; set; } + + [global::ProtoBuf.ProtoMember(19, Name = @"get_generic_info_no")] + public uint[] GetGenericInfoNoes { get; set; } + + [global::ProtoBuf.ProtoMember(20, Name = @"ary_play_costume", IsRequired = true)] + public CostumeData AryPlayCostume { get; set; } + + [global::ProtoBuf.ProtoMember(21, Name = @"ary_current_costume", IsRequired = true)] + public CostumeData AryCurrentCostume { get; set; } + + [global::ProtoBuf.ProtoMember(22, Name = @"title")] + [global::System.ComponentModel.DefaultValue("")] + public string Title + { + get => __pbn__Title ?? ""; + set => __pbn__Title = value; + } + public bool ShouldSerializeTitle() => __pbn__Title != null; + public void ResetTitle() => __pbn__Title = null; + private string __pbn__Title; + + [global::ProtoBuf.ProtoMember(23, Name = @"titleplate_id")] + public uint TitleplateId + { + get => __pbn__TitleplateId.GetValueOrDefault(); + set => __pbn__TitleplateId = value; + } + public bool ShouldSerializeTitleplateId() => __pbn__TitleplateId != null; + public void ResetTitleplateId() => __pbn__TitleplateId = null; + private uint? __pbn__TitleplateId; + + [global::ProtoBuf.ProtoMember(24, Name = @"play_mode", IsRequired = true)] + public uint PlayMode { get; set; } + + [global::ProtoBuf.ProtoMember(25, Name = @"collaboration_id")] + public uint CollaborationId + { + get => __pbn__CollaborationId.GetValueOrDefault(); + set => __pbn__CollaborationId = value; + } + public bool ShouldSerializeCollaborationId() => __pbn__CollaborationId != null; + public void ResetCollaborationId() => __pbn__CollaborationId = null; + private uint? __pbn__CollaborationId; + + [global::ProtoBuf.ProtoMember(26, Name = @"dan_id")] + public uint DanId + { + get => __pbn__DanId.GetValueOrDefault(); + set => __pbn__DanId = value; + } + public bool ShouldSerializeDanId() => __pbn__DanId != null; + public void ResetDanId() => __pbn__DanId = null; + private uint? __pbn__DanId; + + [global::ProtoBuf.ProtoMember(27, Name = @"dan_result")] + public uint DanResult + { + get => __pbn__DanResult.GetValueOrDefault(); + set => __pbn__DanResult = value; + } + public bool ShouldSerializeDanResult() => __pbn__DanResult != null; + public void ResetDanResult() => __pbn__DanResult = null; + private uint? __pbn__DanResult; + + [global::ProtoBuf.ProtoMember(28, Name = @"soul_gauge_total")] + public uint SoulGaugeTotal + { + get => __pbn__SoulGaugeTotal.GetValueOrDefault(); + set => __pbn__SoulGaugeTotal = value; + } + public bool ShouldSerializeSoulGaugeTotal() => __pbn__SoulGaugeTotal != null; + public void ResetSoulGaugeTotal() => __pbn__SoulGaugeTotal = null; + private uint? __pbn__SoulGaugeTotal; + + [global::ProtoBuf.ProtoMember(29, Name = @"combo_cnt_total")] + public uint ComboCntTotal + { + get => __pbn__ComboCntTotal.GetValueOrDefault(); + set => __pbn__ComboCntTotal = value; + } + public bool ShouldSerializeComboCntTotal() => __pbn__ComboCntTotal != null; + public void ResetComboCntTotal() => __pbn__ComboCntTotal = null; + private uint? __pbn__ComboCntTotal; + + [global::ProtoBuf.ProtoMember(30, Name = @"is_not_recorded_dan")] + public bool IsNotRecordedDan + { + get => __pbn__IsNotRecordedDan.GetValueOrDefault(); + set => __pbn__IsNotRecordedDan = value; + } + public bool ShouldSerializeIsNotRecordedDan() => __pbn__IsNotRecordedDan != null; + public void ResetIsNotRecordedDan() => __pbn__IsNotRecordedDan = null; + private bool? __pbn__IsNotRecordedDan; + + [global::ProtoBuf.ProtoMember(31, Name = @"area_code", IsRequired = true)] + public uint AreaCode { get; set; } + + [global::ProtoBuf.ProtoMember(32, Name = @"reserved", IsRequired = true)] + public byte[] Reserved { get; set; } + + [global::ProtoBuf.ProtoMember(33, Name = @"tournament_mode")] + public uint TournamentMode + { + get => __pbn__TournamentMode.GetValueOrDefault(); + set => __pbn__TournamentMode = value; + } + public bool ShouldSerializeTournamentMode() => __pbn__TournamentMode != null; + public void ResetTournamentMode() => __pbn__TournamentMode = null; + private uint? __pbn__TournamentMode; + + [global::ProtoBuf.ProtoMember(34, Name = @"difficulty_played_course")] + public uint DifficultyPlayedCourse + { + get => __pbn__DifficultyPlayedCourse.GetValueOrDefault(); + set => __pbn__DifficultyPlayedCourse = value; + } + public bool ShouldSerializeDifficultyPlayedCourse() => __pbn__DifficultyPlayedCourse != null; + public void ResetDifficultyPlayedCourse() => __pbn__DifficultyPlayedCourse = null; + private uint? __pbn__DifficultyPlayedCourse; + + [global::ProtoBuf.ProtoMember(35, Name = @"difficulty_played_star")] + public uint DifficultyPlayedStar + { + get => __pbn__DifficultyPlayedStar.GetValueOrDefault(); + set => __pbn__DifficultyPlayedStar = value; + } + public bool ShouldSerializeDifficultyPlayedStar() => __pbn__DifficultyPlayedStar != null; + public void ResetDifficultyPlayedStar() => __pbn__DifficultyPlayedStar = null; + private uint? __pbn__DifficultyPlayedStar; + + [global::ProtoBuf.ProtoMember(36, Name = @"difficulty_played_sort")] + public uint DifficultyPlayedSort + { + get => __pbn__DifficultyPlayedSort.GetValueOrDefault(); + set => __pbn__DifficultyPlayedSort = value; + } + public bool ShouldSerializeDifficultyPlayedSort() => __pbn__DifficultyPlayedSort != null; + public void ResetDifficultyPlayedSort() => __pbn__DifficultyPlayedSort = null; + private uint? __pbn__DifficultyPlayedSort; + + [global::ProtoBuf.ProtoMember(37, Name = @"is_random_use_play")] + public uint IsRandomUsePlay + { + get => __pbn__IsRandomUsePlay.GetValueOrDefault(); + set => __pbn__IsRandomUsePlay = value; + } + public bool ShouldSerializeIsRandomUsePlay() => __pbn__IsRandomUsePlay != null; + public void ResetIsRandomUsePlay() => __pbn__IsRandomUsePlay = null; + private uint? __pbn__IsRandomUsePlay; + + [global::ProtoBuf.ProtoMember(38, Name = @"input_median")] + [global::System.ComponentModel.DefaultValue("")] + public string InputMedian + { + get => __pbn__InputMedian ?? ""; + set => __pbn__InputMedian = value; + } + public bool ShouldSerializeInputMedian() => __pbn__InputMedian != null; + public void ResetInputMedian() => __pbn__InputMedian = null; + private string __pbn__InputMedian; + + [global::ProtoBuf.ProtoMember(39, Name = @"input_variance")] + [global::System.ComponentModel.DefaultValue("")] + public string InputVariance + { + get => __pbn__InputVariance ?? ""; + set => __pbn__InputVariance = value; + } + public bool ShouldSerializeInputVariance() => __pbn__InputVariance != null; + public void ResetInputVariance() => __pbn__InputVariance = null; + private string __pbn__InputVariance; + + [global::ProtoBuf.ProtoContract()] + public partial class StageData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"song_no", IsRequired = true)] + public uint SongNo { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"level", IsRequired = true)] + public uint Level { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"stage_mode", IsRequired = true)] + public uint StageMode { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"play_result", IsRequired = true)] + public uint PlayResult { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"play_score", IsRequired = true)] + public uint PlayScore { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"score_rate", IsRequired = true)] + public uint ScoreRate { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"score_rank", IsRequired = true)] + public uint ScoreRank { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"good_cnt", IsRequired = true)] + public uint GoodCnt { get; set; } + + [global::ProtoBuf.ProtoMember(9, Name = @"ok_cnt", IsRequired = true)] + public uint OkCnt { get; set; } + + [global::ProtoBuf.ProtoMember(10, Name = @"ng_cnt", IsRequired = true)] + public uint NgCnt { get; set; } + + [global::ProtoBuf.ProtoMember(11, Name = @"pound_cnt", IsRequired = true)] + public uint PoundCnt { get; set; } + + [global::ProtoBuf.ProtoMember(12, Name = @"combo_cnt", IsRequired = true)] + public uint ComboCnt { get; set; } + + [global::ProtoBuf.ProtoMember(13, Name = @"hit_cnt")] + public uint HitCnt + { + get => __pbn__HitCnt.GetValueOrDefault(); + set => __pbn__HitCnt = value; + } + public bool ShouldSerializeHitCnt() => __pbn__HitCnt != null; + public void ResetHitCnt() => __pbn__HitCnt = null; + private uint? __pbn__HitCnt; + + [global::ProtoBuf.ProtoMember(14, Name = @"option_flg", IsRequired = true)] + public byte[] OptionFlg { get; set; } + + [global::ProtoBuf.ProtoMember(15, Name = @"tone_flg", IsRequired = true)] + public byte[] ToneFlg { get; set; } + + [global::ProtoBuf.ProtoMember(16, Name = @"notes_position", DataFormat = global::ProtoBuf.DataFormat.ZigZag, IsRequired = true)] + public int NotesPosition { get; set; } + + [global::ProtoBuf.ProtoMember(17, Name = @"is_voice_on", IsRequired = true)] + public bool IsVoiceOn { get; set; } + + [global::ProtoBuf.ProtoMember(18, Name = @"is_skip_on", IsRequired = true)] + public bool IsSkipOn { get; set; } + + [global::ProtoBuf.ProtoMember(19, Name = @"is_skip_use", IsRequired = true)] + public bool IsSkipUse { get; set; } + + [global::ProtoBuf.ProtoMember(20, Name = @"ary_challenge_id")] + public global::System.Collections.Generic.List AryChallengeIds { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(21, Name = @"ary_user_compe_id")] + public global::System.Collections.Generic.List AryUserCompeIds { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(22, Name = @"ary_bng_compe_id")] + public global::System.Collections.Generic.List AryBngCompeIds { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(23, Name = @"music_categ", IsRequired = true)] + public uint MusicCateg { get; set; } + + [global::ProtoBuf.ProtoMember(24, Name = @"is_favorite", IsRequired = true)] + public bool IsFavorite { get; set; } + + [global::ProtoBuf.ProtoMember(25, Name = @"is_recent", IsRequired = true)] + public bool IsRecent { get; set; } + + [global::ProtoBuf.ProtoMember(26, Name = @"selected_folder_id", IsRequired = true)] + public uint SelectedFolderId { get; set; } + + [global::ProtoBuf.ProtoMember(27, Name = @"is_random_use_stage")] + public uint IsRandomUseStage + { + get => __pbn__IsRandomUseStage.GetValueOrDefault(); + set => __pbn__IsRandomUseStage = value; + } + public bool ShouldSerializeIsRandomUseStage() => __pbn__IsRandomUseStage != null; + public void ResetIsRandomUseStage() => __pbn__IsRandomUseStage = null; + private uint? __pbn__IsRandomUseStage; + + [global::ProtoBuf.ProtoMember(28, Name = @"is_papamama", IsRequired = true)] + public bool IsPapamama { get; set; } + + [global::ProtoBuf.ProtoMember(29, Name = @"star_level", IsRequired = true)] + public uint StarLevel { get; set; } + + [global::ProtoBuf.ProtoMember(30, Name = @"is_win")] + public bool IsWin + { + get => __pbn__IsWin.GetValueOrDefault(); + set => __pbn__IsWin = value; + } + public bool ShouldSerializeIsWin() => __pbn__IsWin != null; + public void ResetIsWin() => __pbn__IsWin = null; + private bool? __pbn__IsWin; + + [global::ProtoBuf.ProtoMember(31, Name = @"ary_section_data")] + public global::System.Collections.Generic.List ArySectionDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class ResultcompeData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"compe_id", IsRequired = true)] + public uint CompeId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"track_no", IsRequired = true)] + public uint TrackNo { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class AiStageSectionData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"is_win", IsRequired = true)] + public bool IsWin { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"crown", IsRequired = true)] + public uint Crown { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"score", IsRequired = true)] + public uint Score { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"good_cnt", IsRequired = true)] + public uint GoodCnt { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"ok_cnt", IsRequired = true)] + public uint OkCnt { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"ng_cnt", IsRequired = true)] + public uint NgCnt { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"pound_cnt", IsRequired = true)] + public uint PoundCnt { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class CostumeData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"costume_1")] + public uint Costume1 + { + get => __pbn__Costume1.GetValueOrDefault(); + set => __pbn__Costume1 = value; + } + public bool ShouldSerializeCostume1() => __pbn__Costume1 != null; + public void ResetCostume1() => __pbn__Costume1 = null; + private uint? __pbn__Costume1; + + [global::ProtoBuf.ProtoMember(2, Name = @"costume_2")] + public uint Costume2 + { + get => __pbn__Costume2.GetValueOrDefault(); + set => __pbn__Costume2 = value; + } + public bool ShouldSerializeCostume2() => __pbn__Costume2 != null; + public void ResetCostume2() => __pbn__Costume2 = null; + private uint? __pbn__Costume2; + + [global::ProtoBuf.ProtoMember(3, Name = @"costume_3")] + public uint Costume3 + { + get => __pbn__Costume3.GetValueOrDefault(); + set => __pbn__Costume3 = value; + } + public bool ShouldSerializeCostume3() => __pbn__Costume3 != null; + public void ResetCostume3() => __pbn__Costume3 = null; + private uint? __pbn__Costume3; + + [global::ProtoBuf.ProtoMember(4, Name = @"costume_4")] + public uint Costume4 + { + get => __pbn__Costume4.GetValueOrDefault(); + set => __pbn__Costume4 = value; + } + public bool ShouldSerializeCostume4() => __pbn__Costume4 != null; + public void ResetCostume4() => __pbn__Costume4 = null; + private uint? __pbn__Costume4; + + [global::ProtoBuf.ProtoMember(5, Name = @"costume_5")] + public uint Costume5 + { + get => __pbn__Costume5.GetValueOrDefault(); + set => __pbn__Costume5 = value; + } + public bool ShouldSerializeCostume5() => __pbn__Costume5 != null; + public void ResetCostume5() => __pbn__Costume5 = null; + private uint? __pbn__Costume5; + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class SelfBestRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"level")] + public uint Level + { + get => __pbn__Level.GetValueOrDefault(); + set => __pbn__Level = value; + } + public bool ShouldSerializeLevel() => __pbn__Level != null; + public void ResetLevel() => __pbn__Level = null; + private uint? __pbn__Level; + + [global::ProtoBuf.ProtoMember(6, Name = @"ary_song_no")] + public uint[] ArySongNoes { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class SelfBestResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"level")] + public uint Level + { + get => __pbn__Level.GetValueOrDefault(); + set => __pbn__Level = value; + } + public bool ShouldSerializeLevel() => __pbn__Level != null; + public void ResetLevel() => __pbn__Level = null; + private uint? __pbn__Level; + + [global::ProtoBuf.ProtoMember(3, Name = @"ary_selfbest_score")] + public global::System.Collections.Generic.List ArySelfbestScores { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class SelfBestData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"song_no", IsRequired = true)] + public uint SongNo { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"self_best_score", IsRequired = true)] + public uint SelfBestScore { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"self_best_score_rate", IsRequired = true)] + public uint SelfBestScoreRate { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"ura_best_score", IsRequired = true)] + public uint UraBestScore { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"ura_best_score_rate", IsRequired = true)] + public uint UraBestScoreRate { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class CrownsDataRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class CrownsDataResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"crown_flg")] + public byte[] CrownFlg + { + get => __pbn__CrownFlg; + set => __pbn__CrownFlg = value; + } + public bool ShouldSerializeCrownFlg() => __pbn__CrownFlg != null; + public void ResetCrownFlg() => __pbn__CrownFlg = null; + private byte[] __pbn__CrownFlg; + + [global::ProtoBuf.ProtoMember(3, Name = @"dondaful_crown_flg")] + public byte[] DondafulCrownFlg + { + get => __pbn__DondafulCrownFlg; + set => __pbn__DondafulCrownFlg = value; + } + public bool ShouldSerializeDondafulCrownFlg() => __pbn__DondafulCrownFlg != null; + public void ResetDondafulCrownFlg() => __pbn__DondafulCrownFlg = null; + private byte[] __pbn__DondafulCrownFlg; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class ChallengeCompeRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class ChallengeCompeResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_challenge_stat")] + public global::System.Collections.Generic.List AryChallengeStats { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(3, Name = @"ary_user_compe_stat")] + public global::System.Collections.Generic.List AryUserCompeStats { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(4, Name = @"ary_bng_compe_stat")] + public global::System.Collections.Generic.List AryBngCompeStats { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class CompeData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"compe_id", IsRequired = true)] + public uint CompeId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_track_stat")] + public global::System.Collections.Generic.List AryTrackStats { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class TracksData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"song_no", IsRequired = true)] + public uint SongNo { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"level", IsRequired = true)] + public uint Level { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"option_flg", IsRequired = true)] + public byte[] OptionFlg { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"high_score", IsRequired = true)] + public uint HighScore { get; set; } + + } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetAiDataRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetAiDataResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"total_winnings")] + public uint TotalWinnings + { + get => __pbn__TotalWinnings.GetValueOrDefault(); + set => __pbn__TotalWinnings = value; + } + public bool ShouldSerializeTotalWinnings() => __pbn__TotalWinnings != null; + public void ResetTotalWinnings() => __pbn__TotalWinnings = null; + private uint? __pbn__TotalWinnings; + + [global::ProtoBuf.ProtoMember(3, Name = @"input_median")] + [global::System.ComponentModel.DefaultValue("")] + public string InputMedian + { + get => __pbn__InputMedian ?? ""; + set => __pbn__InputMedian = value; + } + public bool ShouldSerializeInputMedian() => __pbn__InputMedian != null; + public void ResetInputMedian() => __pbn__InputMedian = null; + private string __pbn__InputMedian; + + [global::ProtoBuf.ProtoMember(4, Name = @"input_variance")] + [global::System.ComponentModel.DefaultValue("")] + public string InputVariance + { + get => __pbn__InputVariance ?? ""; + set => __pbn__InputVariance = value; + } + public bool ShouldSerializeInputVariance() => __pbn__InputVariance != null; + public void ResetInputVariance() => __pbn__InputVariance = null; + private string __pbn__InputVariance; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetAiScoreRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"song_no", IsRequired = true)] + public uint SongNo { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"level", IsRequired = true)] + public uint Level { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetAiScoreResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_best_section_data")] + public global::System.Collections.Generic.List AryBestSectionDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class AiBestSectionData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"section_no", IsRequired = true)] + public uint SectionNo { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"crown")] + public uint Crown + { + get => __pbn__Crown.GetValueOrDefault(); + set => __pbn__Crown = value; + } + public bool ShouldSerializeCrown() => __pbn__Crown != null; + public void ResetCrown() => __pbn__Crown = null; + private uint? __pbn__Crown; + + [global::ProtoBuf.ProtoMember(3, Name = @"score")] + public uint Score + { + get => __pbn__Score.GetValueOrDefault(); + set => __pbn__Score = value; + } + public bool ShouldSerializeScore() => __pbn__Score != null; + public void ResetScore() => __pbn__Score = null; + private uint? __pbn__Score; + + [global::ProtoBuf.ProtoMember(4, Name = @"good_cnt", IsRequired = true)] + public uint GoodCnt { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"ok_cnt", IsRequired = true)] + public uint OkCnt { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"ng_cnt", IsRequired = true)] + public uint NgCnt { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"pound_cnt", IsRequired = true)] + public uint PoundCnt { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetTokenCountRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetTokenCountResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_token_count_data")] + public global::System.Collections.Generic.List AryTokenCountDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class TokenCountData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"token_id", IsRequired = true)] + public uint TokenId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"token_count", DataFormat = global::ProtoBuf.DataFormat.ZigZag, IsRequired = true)] + public int TokenCount { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class AddTokenCountRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"ary_add_token_count_data")] + public global::System.Collections.Generic.List AryAddTokenCountDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class AddTokenCountData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"token_id", IsRequired = true)] + public uint TokenId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"add_token_count", DataFormat = global::ProtoBuf.DataFormat.ZigZag, IsRequired = true)] + public int AddTokenCount { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class AddTokenCountResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class SongPurchaseRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"song_no", IsRequired = true)] + public uint SongNo { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"token_id", IsRequired = true)] + public uint TokenId { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"price", IsRequired = true)] + public uint Price { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class SongPurchaseResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"token_count", DataFormat = global::ProtoBuf.DataFormat.ZigZag)] + public int TokenCount + { + get => __pbn__TokenCount.GetValueOrDefault(); + set => __pbn__TokenCount = value; + } + public bool ShouldSerializeTokenCount() => __pbn__TokenCount != null; + public void ResetTokenCount() => __pbn__TokenCount = null; + private int? __pbn__TokenCount; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class HeadClerk2Request : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"ary_play_info")] + public global::System.Collections.Generic.List AryPlayInfoes { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class PlayData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"played_at", IsRequired = true)] + public string PlayedAt { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"is_right", IsRequired = true)] + public bool IsRight { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"type")] + public uint Type + { + get => __pbn__Type.GetValueOrDefault(); + set => __pbn__Type = value; + } + public bool ShouldSerializeType() => __pbn__Type != null; + public void ResetType() => __pbn__Type = null; + private uint? __pbn__Type; + + [global::ProtoBuf.ProtoMember(5, Name = @"amount")] + public uint Amount + { + get => __pbn__Amount.GetValueOrDefault(); + set => __pbn__Amount = value; + } + public bool ShouldSerializeAmount() => __pbn__Amount != null; + public void ResetAmount() => __pbn__Amount = null; + private uint? __pbn__Amount; + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class HeadClerk2Response : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class RewardcardcheckRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"country_id", IsRequired = true)] + public string CountryId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class RewardcardcheckResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid")] + public ulong Baid + { + get => __pbn__Baid.GetValueOrDefault(); + set => __pbn__Baid = value; + } + public bool ShouldSerializeBaid() => __pbn__Baid != null; + public void ResetBaid() => __pbn__Baid = null; + private ulong? __pbn__Baid; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class RewardexecutionRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"release_song_no")] + public uint[] ReleaseSongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"get_tone_no")] + public uint[] GetToneNoes { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"get_costume_no_1")] + public uint[] GetCostumeNo1s { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"get_costume_no_2")] + public uint[] GetCostumeNo2s { get; set; } + + [global::ProtoBuf.ProtoMember(9, Name = @"get_costume_no_3")] + public uint[] GetCostumeNo3s { get; set; } + + [global::ProtoBuf.ProtoMember(10, Name = @"get_costume_no_4")] + public uint[] GetCostumeNo4s { get; set; } + + [global::ProtoBuf.ProtoMember(11, Name = @"get_costume_no_5")] + public uint[] GetCostumeNo5s { get; set; } + + [global::ProtoBuf.ProtoMember(12, Name = @"get_title_no")] + public uint[] GetTitleNoes { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class RewardexecutionResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetDanScoreRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"type", IsRequired = true)] + public uint Type { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"dan_id")] + public uint[] DanIds { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetDanScoreResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_dan_score_data")] + public global::System.Collections.Generic.List AryDanScoreDatas { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class DanScoreData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"dan_id", IsRequired = true)] + public uint DanId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"arrival_song_cnt", IsRequired = true)] + public uint ArrivalSongCnt { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"soul_gauge_total", IsRequired = true)] + public uint SoulGaugeTotal { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"combo_cnt_total", IsRequired = true)] + public uint ComboCntTotal { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"ary_dan_score_data_stage")] + public global::System.Collections.Generic.List AryDanScoreDataStages { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class DanScoreDataStage : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"play_score", IsRequired = true)] + public uint PlayScore { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"good_cnt", IsRequired = true)] + public uint GoodCnt { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"ok_cnt", IsRequired = true)] + public uint OkCnt { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"ng_cnt", IsRequired = true)] + public uint NgCnt { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"pound_cnt", IsRequired = true)] + public uint PoundCnt { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"hit_cnt", IsRequired = true)] + public uint HitCnt { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"combo_cnt", IsRequired = true)] + public uint ComboCnt { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"high_score")] + public uint HighScore + { + get => __pbn__HighScore.GetValueOrDefault(); + set => __pbn__HighScore = value; + } + public bool ShouldSerializeHighScore() => __pbn__HighScore != null; + public void ResetHighScore() => __pbn__HighScore = null; + private uint? __pbn__HighScore; + + } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class RewardItemRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"release_song_no")] + public uint[] ReleaseSongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"ura_release_song_no")] + public uint[] UraReleaseSongNoes { get; set; } + + [global::ProtoBuf.ProtoMember(7, Name = @"get_tone_no")] + public uint[] GetToneNoes { get; set; } + + [global::ProtoBuf.ProtoMember(8, Name = @"get_costume_no_1")] + public uint[] GetCostumeNo1s { get; set; } + + [global::ProtoBuf.ProtoMember(9, Name = @"get_costume_no_2")] + public uint[] GetCostumeNo2s { get; set; } + + [global::ProtoBuf.ProtoMember(10, Name = @"get_costume_no_3")] + public uint[] GetCostumeNo3s { get; set; } + + [global::ProtoBuf.ProtoMember(11, Name = @"get_costume_no_4")] + public uint[] GetCostumeNo4s { get; set; } + + [global::ProtoBuf.ProtoMember(12, Name = @"get_costume_no_5")] + public uint[] GetCostumeNo5s { get; set; } + + [global::ProtoBuf.ProtoMember(13, Name = @"get_title_no")] + public uint[] GetTitleNoes { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class RewardItemResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetScoreRankRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"wechat_qr_str", IsRequired = true)] + public string WechatQrStr { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"baid", IsRequired = true)] + public ulong Baid { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class GetScoreRankResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"iki_score_rank_flg")] + public byte[] IkiScoreRankFlg + { + get => __pbn__IkiScoreRankFlg; + set => __pbn__IkiScoreRankFlg = value; + } + public bool ShouldSerializeIkiScoreRankFlg() => __pbn__IkiScoreRankFlg != null; + public void ResetIkiScoreRankFlg() => __pbn__IkiScoreRankFlg = null; + private byte[] __pbn__IkiScoreRankFlg; + + [global::ProtoBuf.ProtoMember(3, Name = @"miyabi_score_rank_flg")] + public byte[] MiyabiScoreRankFlg + { + get => __pbn__MiyabiScoreRankFlg; + set => __pbn__MiyabiScoreRankFlg = value; + } + public bool ShouldSerializeMiyabiScoreRankFlg() => __pbn__MiyabiScoreRankFlg != null; + public void ResetMiyabiScoreRankFlg() => __pbn__MiyabiScoreRankFlg = null; + private byte[] __pbn__MiyabiScoreRankFlg; + + [global::ProtoBuf.ProtoMember(4, Name = @"kiwami_score_rank_flg")] + public byte[] KiwamiScoreRankFlg + { + get => __pbn__KiwamiScoreRankFlg; + set => __pbn__KiwamiScoreRankFlg = value; + } + public bool ShouldSerializeKiwamiScoreRankFlg() => __pbn__KiwamiScoreRankFlg != null; + public void ResetKiwamiScoreRankFlg() => __pbn__KiwamiScoreRankFlg = null; + private byte[] __pbn__KiwamiScoreRankFlg; + + } + +} + +#pragma warning restore CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192 +#endregion diff --git a/TaikoLocalServer/Models/MuchaBoardAuthRequest.cs b/TaikoLocalServer/Models/MuchaBoardAuthRequest.cs new file mode 100644 index 0000000..f56f928 --- /dev/null +++ b/TaikoLocalServer/Models/MuchaBoardAuthRequest.cs @@ -0,0 +1,38 @@ +namespace TaikoLocalServer.Models; + +public class MuchaBoardAuthRequest +{ + [FromForm(Name = "gameVer")] + public string? GameVersion { get; set; } + + [FromForm(Name = "sendDate")] + public string? SendDate { get; set; } + + [FromForm(Name = "serialNum")] + public string? SerialNumber { get; set; } + + [FromForm(Name = "gameCd")] + public string? GameCode { get; set; } + + [FromForm(Name = "boardType")] + public string? BoardType { get; set; } + + [FromForm(Name = "boardId")] + public string? BoardId { get; set; } + + [FromForm(Name = "placeId")] + public string? PlaceId { get; set; } + + [FromForm(Name = "storeRouterIp")] + public string? StoreRouterIp { get; set; } + + [FromForm(Name = "countryCd")] + public string? CountryCode { get; set; } + + [FromForm(Name = "useToken")] + public string? UseToken { get; set; } + + [FromForm(Name = "allToken")] + public string? AllToken { get; set; } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/MuchaUpdateCheckRequest.cs b/TaikoLocalServer/Models/MuchaUpdateCheckRequest.cs new file mode 100644 index 0000000..e7293fb --- /dev/null +++ b/TaikoLocalServer/Models/MuchaUpdateCheckRequest.cs @@ -0,0 +1,22 @@ +namespace TaikoLocalServer.Models; + +public class MuchaUpdateCheckRequest +{ + [FromForm(Name = "gameCd")] + public string? GameCode { get; set; } + + [FromForm(Name = "gameVer")] + public string? GameVersion { get; set; } + + [FromForm(Name = "serialNum")] + public string? SerialNumber { get; set; } + + [FromForm(Name = "countryCd")] + public string? CountryCode { get; set; } + + [FromForm(Name = "placeId")] + public string? PlaceId { get; set; } + + [FromForm(Name = "storeRouterIp")] + public string? StoreRouterIp { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/MusicAttributeEntry.cs b/TaikoLocalServer/Models/MusicAttributeEntry.cs new file mode 100644 index 0000000..d6fb212 --- /dev/null +++ b/TaikoLocalServer/Models/MusicAttributeEntry.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class MusicAttributeEntry +{ + [JsonPropertyName("uniqueId")] + public uint MusicId { get; set; } + + [JsonPropertyName("canPlayUra")] + public bool HasUra { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/MusicAttributes.cs b/TaikoLocalServer/Models/MusicAttributes.cs new file mode 100644 index 0000000..db526d6 --- /dev/null +++ b/TaikoLocalServer/Models/MusicAttributes.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class MusicAttributes +{ + [JsonPropertyName("items")] + public List MusicAttributeEntries { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/MusicInfoEntry.cs b/TaikoLocalServer/Models/MusicInfoEntry.cs new file mode 100644 index 0000000..b5e7142 --- /dev/null +++ b/TaikoLocalServer/Models/MusicInfoEntry.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class MusicInfoEntry +{ + [JsonPropertyName("uniqueId")] + public uint MusicId { get; set; } + + [JsonPropertyName("starUra")] + public uint starUra { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/MusicInfoes.cs b/TaikoLocalServer/Models/MusicInfoes.cs new file mode 100644 index 0000000..2fdf64a --- /dev/null +++ b/TaikoLocalServer/Models/MusicInfoes.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class MusicInfoes +{ + [JsonPropertyName("items")] + public List MusicInfoEntries { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/PowerOnRequest.cs b/TaikoLocalServer/Models/PowerOnRequest.cs new file mode 100644 index 0000000..f045c1f --- /dev/null +++ b/TaikoLocalServer/Models/PowerOnRequest.cs @@ -0,0 +1,31 @@ +namespace TaikoLocalServer.Models; + +public class PowerOnRequest +{ + [FromForm(Name = "game_id")] + public string? GameId { get; set; } + + [FromForm(Name = "ver")] + public string? Version { get; set; } + + [FromForm(Name = "serial")] + public string? Serial { get; set; } + + [FromForm(Name = "ip")] + public string? Ip { get; set; } + + [FromForm(Name = "firm_ver")] + public string? FirmwareVersion { get; set; } + + [FromForm(Name = "boot_ver")] + public string? BootVersion { get; set; } + + [FromForm(Name = "encode")] + public string? Encode { get; set; } + + [FromForm(Name = "format_ver")] + public string? FormatVersion { get; set; } + + [FromForm(Name = "hops")] + public string? Hops { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/VsInterface.cs b/TaikoLocalServer/Models/VsInterface.cs new file mode 100644 index 0000000..bdda2c9 --- /dev/null +++ b/TaikoLocalServer/Models/VsInterface.cs @@ -0,0 +1,257 @@ +// +// This file was generated by a tool; you should avoid making direct changes. +// Consider using 'partial classes' to extend these types +// Input: my.proto +// + +#region Designer generated code +#pragma warning disable CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192 +namespace taiko.vsinterface +{ + [global::ProtoBuf.ProtoContract()] + public partial class StartupAuthRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"usbmem_key")] + [global::System.ComponentModel.DefaultValue("")] + public string UsbmemKey + { + get => __pbn__UsbmemKey ?? ""; + set => __pbn__UsbmemKey = value; + } + public bool ShouldSerializeUsbmemKey() => __pbn__UsbmemKey != null; + public void ResetUsbmemKey() => __pbn__UsbmemKey = null; + private string __pbn__UsbmemKey; + + [global::ProtoBuf.ProtoMember(3, Name = @"hdd_ver", IsRequired = true)] + public uint HddVer { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"usbmem_ver")] + public uint UsbmemVer + { + get => __pbn__UsbmemVer.GetValueOrDefault(); + set => __pbn__UsbmemVer = value; + } + public bool ShouldSerializeUsbmemVer() => __pbn__UsbmemVer != null; + public void ResetUsbmemVer() => __pbn__UsbmemVer = null; + private uint? __pbn__UsbmemVer; + + [global::ProtoBuf.ProtoMember(5, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"rack_id")] + [global::System.ComponentModel.DefaultValue("")] + public string RackId + { + get => __pbn__RackId ?? ""; + set => __pbn__RackId = value; + } + public bool ShouldSerializeRackId() => __pbn__RackId != null; + public void ResetRackId() => __pbn__RackId = null; + private string __pbn__RackId; + + [global::ProtoBuf.ProtoMember(7, Name = @"country_id")] + [global::System.ComponentModel.DefaultValue("")] + public string CountryId + { + get => __pbn__CountryId ?? ""; + set => __pbn__CountryId = value; + } + public bool ShouldSerializeCountryId() => __pbn__CountryId != null; + public void ResetCountryId() => __pbn__CountryId = null; + private string __pbn__CountryId; + + [global::ProtoBuf.ProtoMember(8, Name = @"ary_operation_info")] + public global::System.Collections.Generic.List AryOperationInfoes { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class OperationData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"key_data", IsRequired = true)] + public uint KeyData { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"value_data", IsRequired = true)] + public byte[] ValueData { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class StartupAuthResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"ary_movie_info")] + public global::System.Collections.Generic.List AryMovieInfoes { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoMember(3, Name = @"ary_operation_info")] + public global::System.Collections.Generic.List AryOperationInfoes { get; } = new global::System.Collections.Generic.List(); + + [global::ProtoBuf.ProtoContract()] + public partial class MovieData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"movie_id", IsRequired = true)] + public uint MovieId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"enable_days", IsRequired = true)] + public uint EnableDays { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class OperationData : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"key_data", IsRequired = true)] + public uint KeyData { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"value_data", IsRequired = true)] + public byte[] ValueData { get; set; } + + } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerupAuthRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"usbmem_key", IsRequired = true)] + public string UsbmemKey { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"hdd_ver", IsRequired = true)] + public uint HddVer { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"usbmem_ver", IsRequired = true)] + public uint UsbmemVer { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"rack_id")] + [global::System.ComponentModel.DefaultValue("")] + public string RackId + { + get => __pbn__RackId ?? ""; + set => __pbn__RackId = value; + } + public bool ShouldSerializeRackId() => __pbn__RackId != null; + public void ResetRackId() => __pbn__RackId = null; + private string __pbn__RackId; + + [global::ProtoBuf.ProtoMember(7, Name = @"country_id")] + [global::System.ComponentModel.DefaultValue("")] + public string CountryId + { + get => __pbn__CountryId ?? ""; + set => __pbn__CountryId = value; + } + public bool ShouldSerializeCountryId() => __pbn__CountryId != null; + public void ResetCountryId() => __pbn__CountryId = null; + private string __pbn__CountryId; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerupAuthResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerupCompleteRequest : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"chassis_id", IsRequired = true)] + public string ChassisId { get; set; } + + [global::ProtoBuf.ProtoMember(2, Name = @"usbmem_key", IsRequired = true)] + public string UsbmemKey { get; set; } + + [global::ProtoBuf.ProtoMember(3, Name = @"hdd_ver", IsRequired = true)] + public uint HddVer { get; set; } + + [global::ProtoBuf.ProtoMember(4, Name = @"usbmem_ver", IsRequired = true)] + public uint UsbmemVer { get; set; } + + [global::ProtoBuf.ProtoMember(5, Name = @"shop_id", IsRequired = true)] + public string ShopId { get; set; } + + [global::ProtoBuf.ProtoMember(6, Name = @"rack_id")] + [global::System.ComponentModel.DefaultValue("")] + public string RackId + { + get => __pbn__RackId ?? ""; + set => __pbn__RackId = value; + } + public bool ShouldSerializeRackId() => __pbn__RackId != null; + public void ResetRackId() => __pbn__RackId = null; + private string __pbn__RackId; + + [global::ProtoBuf.ProtoMember(7, Name = @"country_id")] + [global::System.ComponentModel.DefaultValue("")] + public string CountryId + { + get => __pbn__CountryId ?? ""; + set => __pbn__CountryId = value; + } + public bool ShouldSerializeCountryId() => __pbn__CountryId != null; + public void ResetCountryId() => __pbn__CountryId = null; + private string __pbn__CountryId; + + } + + [global::ProtoBuf.ProtoContract()] + public partial class VerupCompleteResponse : global::ProtoBuf.IExtensible + { + private global::ProtoBuf.IExtension __pbn__extensionData; + global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) + => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); + + [global::ProtoBuf.ProtoMember(1, Name = @"result", IsRequired = true)] + public uint Result { get; set; } + + } + +} + +#pragma warning restore CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192 +#endregion diff --git a/TaikoLocalServer/Program.cs b/TaikoLocalServer/Program.cs new file mode 100644 index 0000000..059505e --- /dev/null +++ b/TaikoLocalServer/Program.cs @@ -0,0 +1,137 @@ +using System.Reflection; +using System.Security.Authentication; +using GameDatabase.Context; +using Microsoft.AspNetCore.HttpOverrides; +using TaikoLocalServer.Middlewares; +using TaikoLocalServer.Services.Extentions; +using TaikoLocalServer.Settings; +using Throw; +using Serilog; +using SharedProject.Utils; + +Log.Logger = new LoggerConfiguration() + .WriteTo.Console() + .CreateBootstrapLogger(); + +var version = Assembly.GetEntryAssembly()?.GetCustomAttribute()? + .InformationalVersion; +Log.Information("TaikoLocalServer version {Version}", version); + +Log.Information("Server starting up..."); + +try +{ + var builder = WebApplication.CreateBuilder(args); + + builder.Host.ConfigureAppConfiguration((hostingContext, config) => + { + const string configurationsDirectory = "Configurations"; + config.AddJsonFile($"{configurationsDirectory}/Kestrel.json", optional: true, reloadOnChange: false); + config.AddJsonFile($"{configurationsDirectory}/Logging.json", optional: false, reloadOnChange: false); + config.AddJsonFile($"{configurationsDirectory}/Database.json", optional: false, reloadOnChange: false); + config.AddJsonFile($"{configurationsDirectory}/ServerSettings.json", optional: false, reloadOnChange: false); + config.AddJsonFile($"{configurationsDirectory}/DataSettings.json", optional: true, reloadOnChange: false); + }); + + // Manually enable tls 1.0 + builder.WebHost.UseKestrel(kestrelOptions => + { + kestrelOptions.ConfigureHttpsDefaults(options => + options.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13); + }); + + builder.Host.UseSerilog((context, configuration) => + { + configuration.WriteTo.Console().ReadFrom.Configuration(context.Configuration); + }); + + if (builder.Configuration.GetValue("ServerSettings:EnableMoreSongs")) + { + Log.Warning("Song limit expanded! Use at your own risk!"); + } + + // Add services to the container. + builder.Services.AddOptions(); + builder.Services.AddSingleton(); + builder.Services.Configure(builder.Configuration.GetSection(nameof(ServerSettings))); + builder.Services.Configure(builder.Configuration.GetSection(nameof(DataSettings))); + builder.Services.AddControllers().AddProtoBufNet(); + builder.Services.AddDbContext(option => + { + var dbName = builder.Configuration["DbFileName"]; + if (string.IsNullOrEmpty(dbName)) + { + dbName = Constants.DEFAULT_DB_NAME; + } + + var path = Path.Combine(PathHelper.GetRootPath(), dbName); + option.UseSqlite($"Data Source={path}"); + }); + builder.Services.AddMemoryCache(); + builder.Services.AddCors(options => + { + options.AddPolicy("AllowAllCorsPolicy", policy => + { + policy + .AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + builder.Services.AddTaikoDbServices(); + + var app = builder.Build(); + + // Migrate db + using (var scope = app.Services.CreateScope()) + { + var db = scope.ServiceProvider.GetRequiredService(); + db.Database.Migrate(); + } + + app.UseSerilogRequestLogging(options => + { + options.MessageTemplate = "HTTP {RequestMethod} {RequestPath} responded {StatusCode} in {Elapsed:0.0000} ms, " + + "request host: {RequestHost}"; + options.EnrichDiagnosticContext = (diagnosticContext, httpContext) => + { + diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value); + }; + }); + + var gameDataService = app.Services.GetService(); + gameDataService.ThrowIfNull(); + await gameDataService.InitializeAsync(); + + // For reverse proxy + app.UseForwardedHeaders(new ForwardedHeadersOptions + { + ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto + }); + + app.UseCors("AllowAllCorsPolicy"); + // For blazor hosting + app.UseBlazorFrameworkFiles(); + app.UseStaticFiles(); + app.UseRouting(); + + + app.UseHttpLogging(); + app.MapControllers(); + app.MapFallbackToFile("index.html"); + + app.UseWhen( + context => context.Request.Path.StartsWithSegments("/sys/servlet/PowerOn", StringComparison.InvariantCulture), + applicationBuilder => applicationBuilder.UseAllNetRequestMiddleware()); + + app.Run(); +} +catch (Exception ex) +{ + Log.Fatal(ex, "Unhandled exception"); +} +finally +{ + Log.Information("Shut down complete"); + Log.CloseAndFlush(); +} \ No newline at end of file diff --git a/TaikoLocalServer/Properties/launchSettings.json b/TaikoLocalServer/Properties/launchSettings.json new file mode 100644 index 0000000..b04626b --- /dev/null +++ b/TaikoLocalServer/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:40332", + "sslPort": 44396 + } + }, + "profiles": { + "TaikoLocalServer": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "", + "applicationUrl": "http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/TaikoLocalServer/README.md b/TaikoLocalServer/README.md new file mode 100644 index 0000000..1cd9ad9 --- /dev/null +++ b/TaikoLocalServer/README.md @@ -0,0 +1,7 @@ +# Server + +This is the solution for server. + +Server is implemented with ASP.NET Core 6. ORM is Entity Framework Core 6. Database is SQLite for easier setup. + +As the game uses protobuf, `protobuf-net` is used for serializing and deserializing the data. \ No newline at end of file diff --git a/TaikoLocalServer/Services/AiDatumService.cs b/TaikoLocalServer/Services/AiDatumService.cs new file mode 100644 index 0000000..ec95b53 --- /dev/null +++ b/TaikoLocalServer/Services/AiDatumService.cs @@ -0,0 +1,51 @@ +using GameDatabase.Context; +using GameDatabase.Entities; +using Throw; + +namespace TaikoLocalServer.Services; + +public class AiDatumService : IAiDatumService +{ + private readonly TaikoDbContext context; + + public AiDatumService(TaikoDbContext context) + { + this.context = context; + } + + public async Task> GetAllAiScoreById(ulong baid) + { + return await context.AiScoreData.Where(datum => datum.Baid == baid) + .Include(datum => datum.AiSectionScoreData) + .ToListAsync(); + } + + public async Task GetSongAiScore(ulong baid, uint songId, Difficulty difficulty) + { + return await context.AiScoreData.Where(datum => datum.Baid == baid && + datum.SongId == songId && + datum.Difficulty == difficulty) + .Include(datum => datum.AiSectionScoreData) + .FirstOrDefaultAsync(); + } + + public async Task UpdateSongAiScore(AiScoreDatum datum) + { + var existing = await context.AiScoreData.FindAsync(datum.Baid, datum.SongId, datum.Difficulty); + existing.ThrowIfNull("Cannot update a non-existing ai score!"); + + context.AiScoreData.Update(datum); + await context.SaveChangesAsync(); + } + + public async Task InsertSongAiScore(AiScoreDatum datum) + { + var existing = await context.AiScoreData.FindAsync(datum.Baid, datum.SongId, datum.Difficulty); + if (existing is not null) + { + throw new ArgumentException("Ai score already exists!", nameof(datum)); + } + context.AiScoreData.Add(datum); + await context.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/CardService.cs b/TaikoLocalServer/Services/CardService.cs new file mode 100644 index 0000000..11d36c1 --- /dev/null +++ b/TaikoLocalServer/Services/CardService.cs @@ -0,0 +1,52 @@ +using GameDatabase.Context; +using GameDatabase.Entities; +using SharedProject.Models; +using Swan.Mapping; + +namespace TaikoLocalServer.Services; + +public class CardService : ICardService +{ + private readonly TaikoDbContext context; + + public CardService(TaikoDbContext context) + { + this.context = context; + } + + public async Task GetCardByAccessCode(string accessCode) + { + return await context.Cards.FindAsync(accessCode); + } + + public ulong GetNextBaid() + { + return context.Cards.Any() ? context.Cards.Max(card => card.Baid) + 1 : 1; + } + + public async Task> GetUsersFromCards() + { + return await context.Cards.Select(card => card.CopyPropertiesToNew(null)).ToListAsync(); + } + + public async Task AddCard(Card card) + { + context.Add(card); + await context.SaveChangesAsync(); + } + + public async Task DeleteCard(string accessCode) + { + var card = await context.Cards.FindAsync(accessCode); + + if (card is null) + { + return false; + } + + context.Cards.Remove(card); + await context.SaveChangesAsync(); + + return true; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/DanScoreDatumService.cs b/TaikoLocalServer/Services/DanScoreDatumService.cs new file mode 100644 index 0000000..005f9a2 --- /dev/null +++ b/TaikoLocalServer/Services/DanScoreDatumService.cs @@ -0,0 +1,42 @@ +using GameDatabase.Context; +using GameDatabase.Entities; + +namespace TaikoLocalServer.Services; + +public class DanScoreDatumService : IDanScoreDatumService +{ + private readonly TaikoDbContext context; + + public DanScoreDatumService(TaikoDbContext context) + { + this.context = context; + } + + public async Task> GetDanScoreDatumByBaid(ulong baid) + { + return await context.DanScoreData.Where(datum => datum.Baid == baid) + .Include(datum => datum.DanStageScoreData) + .ToListAsync(); + } + + public async Task GetSingleDanScoreDatum(ulong baid, uint danId) + { + return await context.DanScoreData.Include(datum => datum.DanStageScoreData) + .FirstOrDefaultAsync(datum => datum.Baid == baid && + datum.DanId == danId); + } + + public async Task InsertOrUpdateDanScoreDatum(DanScoreDatum datum) + { + var existing = await context.DanScoreData.FindAsync(datum.Baid, datum.DanId); + if (existing is null) + { + context.DanScoreData.Add(datum); + await context.SaveChangesAsync(); + return; + } + + context.DanScoreData.Update(datum); + await context.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/Extentions/ServiceExtensions.cs b/TaikoLocalServer/Services/Extentions/ServiceExtensions.cs new file mode 100644 index 0000000..bd9642b --- /dev/null +++ b/TaikoLocalServer/Services/Extentions/ServiceExtensions.cs @@ -0,0 +1,16 @@ +namespace TaikoLocalServer.Services.Extentions; + +public static class ServiceExtensions +{ + public static IServiceCollection AddTaikoDbServices(this IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + return services; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/GameDataService.cs b/TaikoLocalServer/Services/GameDataService.cs new file mode 100644 index 0000000..e834d4e --- /dev/null +++ b/TaikoLocalServer/Services/GameDataService.cs @@ -0,0 +1,226 @@ +using ICSharpCode.SharpZipLib.GZip; +using Microsoft.Extensions.Options; +using SharedProject.Models; +using SharedProject.Utils; +using Swan.Mapping; +using System.Collections.Immutable; +using System.Text.Json; +using TaikoLocalServer.Settings; +using Throw; + +namespace TaikoLocalServer.Services; + +public class GameDataService : IGameDataService +{ + private ImmutableDictionary musicInfoes = + ImmutableDictionary.Empty; + + private ImmutableDictionary danDataDictionary = + ImmutableDictionary.Empty; + + private ImmutableDictionary introDataDictionary = + ImmutableDictionary.Empty; + + private ImmutableDictionary musicAttributes = + ImmutableDictionary.Empty; + + private ImmutableDictionary folderDictionary = + ImmutableDictionary.Empty; + + private List musics = new(); + + private List musicsWithUra = new(); + + private readonly DataSettings settings; + + public GameDataService(IOptions settings) + { + this.settings = settings.Value; + } + + public List GetMusicList() + { + return musics; + } + + public List GetMusicWithUraList() + { + return musicsWithUra; + } + + public ImmutableDictionary GetMusicInfoes() + { + return musicInfoes; + } + + public ImmutableDictionary GetMusicAttributes() + { + return musicAttributes; + } + + public ImmutableDictionary GetDanDataDictionary() + { + return danDataDictionary; + } + + public ImmutableDictionary GetSongIntroDictionary() + { + return introDataDictionary; + } + + public ImmutableDictionary GetFolderDictionary() + { + return folderDictionary; + } + + public async Task InitializeAsync() + { + var dataPath = PathHelper.GetDataPath(); + var musicInfoPath = Path.Combine(dataPath, Constants.MUSIC_INFO_FILE_NAME); + var compressedMusicInfoPath = Path.Combine(dataPath, Constants.MUSIC_INFO_COMPRESSED_FILE_NAME); + var musicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_FILE_NAME); + var compressedMusicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME); + var danDataPath = Path.Combine(dataPath, settings.DanDataFileName); + var songIntroDataPath = Path.Combine(dataPath, settings.IntroDataFileName); + var eventFolderDataPath = Path.Combine(dataPath, settings.EventFolderDataFileName); + + if (File.Exists(compressedMusicInfoPath)) + { + TryDecompressMusicInfo(); + } + if (File.Exists(compressedMusicAttributePath)) + { + TryDecompressMusicAttribute(); + } + await using var musicInfoFile = File.OpenRead(musicInfoPath); + await using var musicAttributeFile = File.OpenRead(musicAttributePath); + await using var danDataFile = File.OpenRead(danDataPath); + await using var songIntroDataFile = File.OpenRead(songIntroDataPath); + await using var eventFolderDataFile = File.OpenRead(eventFolderDataPath); + + var infoesData = await JsonSerializer.DeserializeAsync(musicInfoFile); + var attributesData = await JsonSerializer.DeserializeAsync(musicAttributeFile); + var danData = await JsonSerializer.DeserializeAsync>(danDataFile); + var introData = await JsonSerializer.DeserializeAsync>(songIntroDataFile); + var eventFolderData = await JsonSerializer.DeserializeAsync>(eventFolderDataFile); + + InitializeMusicInfoes(infoesData); + + InitializeMusicAttributes(attributesData); + + InitializeDanData(danData); + + InitializeIntroData(introData); + + InitializeEventFolderData(eventFolderData); + } + + private static void TryDecompressMusicInfo() + { + var dataPath = PathHelper.GetDataPath(); + var musicInfoPath = Path.Combine(dataPath, Constants.MUSIC_INFO_FILE_NAME); + var compressedMusicInfoPath = Path.Combine(dataPath, Constants.MUSIC_INFO_COMPRESSED_FILE_NAME); + + using var compressed = File.Open(compressedMusicInfoPath, FileMode.Open); + using var output = File.Create(musicInfoPath); + + GZip.Decompress(compressed, output, true); + } + + private static void TryDecompressMusicAttribute() + { + var dataPath = PathHelper.GetDataPath(); + var musicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_FILE_NAME); + var compressedMusicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME); + + using var compressed = File.Open(compressedMusicAttributePath, FileMode.Open); + using var output = File.Create(musicAttributePath); + + GZip.Decompress(compressed, output, true); + } + + private void InitializeIntroData(List? introData) + { + introData.ThrowIfNull("Shouldn't happen!"); + introDataDictionary = introData.ToImmutableDictionary(data => data.SetId, ToResponseIntroData); + } + + private void InitializeDanData(List? danData) + { + danData.ThrowIfNull("Shouldn't happen!"); + danDataDictionary = danData.ToImmutableDictionary(data => data.DanId, ToResponseOdaiData); + } + + private void InitializeEventFolderData(List? eventFolderData) + { + eventFolderData.ThrowIfNull("Shouldn't happen!"); + folderDictionary = eventFolderData.ToImmutableDictionary(data => data.FolderId, ToResponseEventFolderData); + } + + private void InitializeMusicInfoes(MusicInfoes? infoesData) + { + infoesData.ThrowIfNull("Shouldn't happen!"); + + musicInfoes = infoesData.MusicInfoEntries.ToImmutableDictionary(info => info.MusicId); + + musicsWithUra = musicInfoes.Where(info => info.Value.starUra > 0) + .Select(pair => pair.Key) + .ToList(); + musicsWithUra.Sort(); + } + + private void InitializeMusicAttributes(MusicAttributes? attributesData) + { + attributesData.ThrowIfNull("Shouldn't happen!"); + + musicAttributes = attributesData.MusicAttributeEntries.ToImmutableDictionary(attribute => attribute.MusicId); + + musics = musicAttributes.Select(pair => pair.Key) + .ToList(); + musics.Sort(); + } + + private static GetDanOdaiResponse.OdaiData ToResponseOdaiData(DanData data) + { + var responseOdaiData = new GetDanOdaiResponse.OdaiData + { + DanId = data.DanId, + Title = data.Title, + VerupNo = data.VerupNo + }; + + var odaiSongs = data.OdaiSongList.Select(song => song.CopyPropertiesToNew()); + responseOdaiData.AryOdaiSongs.AddRange(odaiSongs); + + var odaiBorders = data.OdaiBorderList.Select(border => border.CopyPropertiesToNew()); + responseOdaiData.AryOdaiBorders.AddRange(odaiBorders); + + return responseOdaiData; + } + + private static GetSongIntroductionResponse.SongIntroductionData ToResponseIntroData(SongIntroductionData data) + { + var responseOdaiData = new GetSongIntroductionResponse.SongIntroductionData + { + SetId = data.SetId, + VerupNo = data.VerupNo, + MainSongNo = data.MainSongNo, + SubSongNoes = data.SubSongNo + }; + + return responseOdaiData; + } + + private static GetfolderResponse.EventfolderData ToResponseEventFolderData(EventFolderData data) + { + var responseEventFolderData = new GetfolderResponse.EventfolderData + { + FolderId = data.FolderId, + VerupNo = data.VerupNo, + Priority = data.Priority, + SongNoes = data.SongNo + }; + + return responseEventFolderData; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/Interfaces/IAiDatumService.cs b/TaikoLocalServer/Services/Interfaces/IAiDatumService.cs new file mode 100644 index 0000000..fc29213 --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/IAiDatumService.cs @@ -0,0 +1,14 @@ +using GameDatabase.Entities; + +namespace TaikoLocalServer.Services.Interfaces; + +public interface IAiDatumService +{ + public Task> GetAllAiScoreById(ulong baid); + + public Task GetSongAiScore(ulong baid, uint songId, Difficulty difficulty); + + public Task UpdateSongAiScore(AiScoreDatum datum); + + public Task InsertSongAiScore(AiScoreDatum datum); +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/Interfaces/ICardService.cs b/TaikoLocalServer/Services/Interfaces/ICardService.cs new file mode 100644 index 0000000..4217027 --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/ICardService.cs @@ -0,0 +1,17 @@ +using GameDatabase.Entities; +using SharedProject.Models; + +namespace TaikoLocalServer.Services.Interfaces; + +public interface ICardService +{ + public Task GetCardByAccessCode(string accessCode); + + public ulong GetNextBaid(); + + public Task> GetUsersFromCards(); + + public Task AddCard(Card card); + + public Task DeleteCard(string accessCode); +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/Interfaces/IDanScoreDatumService.cs b/TaikoLocalServer/Services/Interfaces/IDanScoreDatumService.cs new file mode 100644 index 0000000..17fef69 --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/IDanScoreDatumService.cs @@ -0,0 +1,12 @@ +using GameDatabase.Entities; + +namespace TaikoLocalServer.Services.Interfaces; + +public interface IDanScoreDatumService +{ + public Task> GetDanScoreDatumByBaid(ulong baid); + + public Task GetSingleDanScoreDatum(ulong baid, uint danId); + + public Task InsertOrUpdateDanScoreDatum(DanScoreDatum datum); +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs new file mode 100644 index 0000000..0e5ac80 --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs @@ -0,0 +1,23 @@ +using System.Collections.Immutable; + +namespace TaikoLocalServer.Services.Interfaces; + +public interface IGameDataService +{ + public Task InitializeAsync(); + + public List GetMusicList(); + + public List GetMusicWithUraList(); + + public ImmutableDictionary GetMusicInfoes(); + + public ImmutableDictionary GetMusicAttributes(); + + public ImmutableDictionary GetDanDataDictionary(); + + public ImmutableDictionary GetSongIntroDictionary(); + + public ImmutableDictionary GetFolderDictionary(); +} + diff --git a/TaikoLocalServer/Services/Interfaces/ISongBestDatumService.cs b/TaikoLocalServer/Services/Interfaces/ISongBestDatumService.cs new file mode 100644 index 0000000..77664dc --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/ISongBestDatumService.cs @@ -0,0 +1,13 @@ +using GameDatabase.Entities; +using SharedProject.Models; + +namespace TaikoLocalServer.Services.Interfaces; + +public interface ISongBestDatumService +{ + public Task> GetAllSongBestData(ulong baid); + + public Task UpdateOrInsertSongBestDatum(SongBestDatum datum); + + public Task> GetAllSongBestAsModel(ulong baid); +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/Interfaces/ISongPlayDatumService.cs b/TaikoLocalServer/Services/Interfaces/ISongPlayDatumService.cs new file mode 100644 index 0000000..1f8e3ca --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/ISongPlayDatumService.cs @@ -0,0 +1,10 @@ +using GameDatabase.Entities; + +namespace TaikoLocalServer.Services.Interfaces; + +public interface ISongPlayDatumService +{ + public Task> GetSongPlayDatumByBaid(ulong baid); + + public Task AddSongPlayDatum(SongPlayDatum datum); +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/Interfaces/IUserDatumService.cs b/TaikoLocalServer/Services/Interfaces/IUserDatumService.cs new file mode 100644 index 0000000..5019be5 --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/IUserDatumService.cs @@ -0,0 +1,24 @@ +using GameDatabase.Entities; + +namespace TaikoLocalServer.Services.Interfaces; + +public interface IUserDatumService +{ + public Task GetFirstUserDatumOrNull(ulong baid); + + public Task GetFirstUserDatumOrDefault(ulong baid); + + public Task> GetAllUserData(); + + public Task UpdateOrInsertUserDatum(UserDatum userDatum); + + public Task InsertUserDatum(UserDatum userDatum); + + public Task UpdateUserDatum(UserDatum userDatum); + + public Task> GetFavoriteSongIds(ulong baid); + + public Task UpdateFavoriteSong(ulong baid, uint songId, bool isFavorite); + + +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/SongBestDatumService.cs b/TaikoLocalServer/Services/SongBestDatumService.cs new file mode 100644 index 0000000..f76ce61 --- /dev/null +++ b/TaikoLocalServer/Services/SongBestDatumService.cs @@ -0,0 +1,87 @@ +using GameDatabase.Context; +using GameDatabase.Entities; +using SharedProject.Models; +using Swan.Mapping; +using Throw; + +namespace TaikoLocalServer.Services; + +public class SongBestDatumService : ISongBestDatumService +{ + private readonly TaikoDbContext context; + + public SongBestDatumService(TaikoDbContext context) + { + this.context = context; + } + + public async Task> GetAllSongBestData(ulong baid) + { + return await context.SongBestData.Where(datum => datum.Baid == baid).ToListAsync(); + } + + public async Task UpdateOrInsertSongBestDatum(SongBestDatum datum) + { + var existing = await context.SongBestData.AnyAsync( + bestDatum => bestDatum.Baid == datum.Baid && + bestDatum.Difficulty == datum.Difficulty && + bestDatum.SongId == datum.SongId); + if (existing) + { + context.SongBestData.Update(datum); + await context.SaveChangesAsync(); + return; + } + + context.SongBestData.Add(datum); + await context.SaveChangesAsync(); + } + + public async Task> GetAllSongBestAsModel(ulong baid) + { + var songbestDbData = await context.SongBestData.Where(datum => datum.Baid == baid) + .ToListAsync(); + + var result = songbestDbData.Select(datum => datum.CopyPropertiesToNew()).ToList(); + + var aiSectionBest = await context.AiScoreData.Where(datum => datum.Baid == baid) + .Include(datum => datum.AiSectionScoreData) + .ToListAsync(); + + var playLogs = await context.SongPlayData.Where(datum => datum.Baid == baid).ToListAsync(); + foreach (var bestData in result) + { + var songPlayDatums = playLogs.Where(datum => datum.Difficulty == bestData.Difficulty && + datum.SongId == bestData.SongId).ToArray(); + songPlayDatums.Throw($"Play log for song id {bestData.SongId} is null! " + + "Something is wrong with db!") + .IfEmpty(); + var lastPlayLog = songPlayDatums + .MaxBy(datum => datum.PlayTime); + bestData.LastPlayTime = lastPlayLog!.PlayTime; + + var bestLog = songPlayDatums + .MaxBy(datum => datum.Score); + bestLog.CopyOnlyPropertiesTo(bestData, + nameof(SongPlayDatum.GoodCount), + nameof(SongPlayDatum.OkCount), + nameof(SongPlayDatum.MissCount), + nameof(SongPlayDatum.HitCount), + nameof(SongPlayDatum.DrumrollCount), + nameof(SongPlayDatum.ComboCount) + ); + + var aiSection = aiSectionBest.FirstOrDefault(datum => datum.Difficulty == bestData.Difficulty && + datum.SongId == bestData.SongId); + if (aiSection is null) + { + continue; + } + + bestData.AiSectionBestData = aiSection.AiSectionScoreData + .Select(datum => datum.CopyPropertiesToNew()).ToList(); + } + + return result; + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/SongPlayDatumService.cs b/TaikoLocalServer/Services/SongPlayDatumService.cs new file mode 100644 index 0000000..55229b6 --- /dev/null +++ b/TaikoLocalServer/Services/SongPlayDatumService.cs @@ -0,0 +1,25 @@ +using GameDatabase.Context; +using GameDatabase.Entities; + +namespace TaikoLocalServer.Services; + +class SongPlayDatumService : ISongPlayDatumService +{ + private readonly TaikoDbContext context; + + public SongPlayDatumService(TaikoDbContext context) + { + this.context = context; + } + + public async Task> GetSongPlayDatumByBaid(ulong baid) + { + return await context.SongPlayData.Where(datum => datum.Baid == baid).ToListAsync(); + } + + public async Task AddSongPlayDatum(SongPlayDatum datum) + { + context.SongPlayData.Add(datum); + await context.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/UserDatumService.cs b/TaikoLocalServer/Services/UserDatumService.cs new file mode 100644 index 0000000..00a1f43 --- /dev/null +++ b/TaikoLocalServer/Services/UserDatumService.cs @@ -0,0 +1,118 @@ +using System.Text.Json; +using GameDatabase.Context; +using GameDatabase.Entities; +using Throw; + +namespace TaikoLocalServer.Services; + +public class UserDatumService : IUserDatumService +{ + private readonly TaikoDbContext context; + + private readonly ILogger logger; + + public UserDatumService(TaikoDbContext context, ILogger logger) + { + this.context = context; + this.logger = logger; + } + + public async Task GetFirstUserDatumOrNull(ulong baid) + { + return await context.UserData.FindAsync(baid); + } + + public async Task GetFirstUserDatumOrDefault(ulong baid) + { + return await context.UserData.FindAsync(baid) ?? new UserDatum(); + } + + public async Task> GetAllUserData() + { + return await context.UserData.ToListAsync(); + } + + public async Task UpdateOrInsertUserDatum(UserDatum userDatum) + { + if (await context.UserData.AnyAsync(datum => datum.Baid == userDatum.Baid)) + { + context.UserData.Add(userDatum); + await context.SaveChangesAsync(); + return; + } + + context.Update(userDatum); + await context.SaveChangesAsync(); + } + + public async Task InsertUserDatum(UserDatum userDatum) + { + context.UserData.Add(userDatum); + await context.SaveChangesAsync(); + } + + public async Task UpdateUserDatum(UserDatum userDatum) + { + context.Update(userDatum); + await context.SaveChangesAsync(); + } + + public async Task> GetFavoriteSongIds(ulong baid) + { + var userDatum = await context.UserData.FindAsync(baid); + userDatum.ThrowIfNull($"User with baid: {baid} not found!"); + + using var stringStream = GZipBytesUtil.GenerateStreamFromString(userDatum.FavoriteSongsArray); + List? result; + try + { + result = await JsonSerializer.DeserializeAsync>(stringStream); + } + catch (JsonException e) + { + logger.LogError(e, "Parse favorite song array json failed! Is the user initialized correctly?"); + result = new List(); + } + result.ThrowIfNull("Song favorite array should never be null!"); + return result; + } + + public async Task UpdateFavoriteSong(ulong baid, uint songId, bool isFavorite) + { + var userDatum = await context.UserData.FindAsync(baid); + userDatum.ThrowIfNull($"User with baid: {baid} not found!"); + + using var stringStream = GZipBytesUtil.GenerateStreamFromString(userDatum.FavoriteSongsArray); + List? favoriteSongIds; + try + { + favoriteSongIds = await JsonSerializer.DeserializeAsync>(stringStream); + } + catch (JsonException e) + { + logger.LogError(e, "Parse favorite song array json failed! Is the user initialized correctly?"); + favoriteSongIds = new List(); + } + favoriteSongIds.ThrowIfNull("Song favorite array should never be null!"); + var favoriteSet = new HashSet(favoriteSongIds); + if (isFavorite) + { + favoriteSet.Add(songId); + } + else + { + favoriteSet.Remove(songId); + } + + using var newFavoriteSongStream = new MemoryStream(); + await JsonSerializer.SerializeAsync(newFavoriteSongStream, favoriteSet); + newFavoriteSongStream.Position = 0; + using var reader = new StreamReader(newFavoriteSongStream); + + userDatum.FavoriteSongsArray = await reader.ReadToEndAsync(); + logger.LogInformation("Favorite songs are: {Favorite}", userDatum.FavoriteSongsArray); + context.Update(userDatum); + await context.SaveChangesAsync(); + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Settings/DataSettings.cs b/TaikoLocalServer/Settings/DataSettings.cs new file mode 100644 index 0000000..619b18e --- /dev/null +++ b/TaikoLocalServer/Settings/DataSettings.cs @@ -0,0 +1,10 @@ +namespace TaikoLocalServer.Settings; + +public class DataSettings +{ + public string DanDataFileName { get; set; } = "dan_data.json"; + + public string EventFolderDataFileName { get; set; } = "event_folder_data.json"; + + public string IntroDataFileName { get; set; } = "intro_data.json"; +} \ No newline at end of file diff --git a/TaikoLocalServer/Settings/ServerSettings.cs b/TaikoLocalServer/Settings/ServerSettings.cs new file mode 100644 index 0000000..3dd9136 --- /dev/null +++ b/TaikoLocalServer/Settings/ServerSettings.cs @@ -0,0 +1,10 @@ +namespace TaikoLocalServer.Settings; + +public class ServerSettings +{ + public string MuchaUrl { get; set; } = string.Empty; + + public string GameUrl { get; set; } = string.Empty; + + public bool EnableMoreSongs { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj new file mode 100644 index 0000000..3d314db --- /dev/null +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -0,0 +1,87 @@ + + + + net6.0 + enable + enable + 0.3.0-alpha + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + diff --git a/TaikoLocalServer/appsettings.json b/TaikoLocalServer/appsettings.json new file mode 100644 index 0000000..4faf77a --- /dev/null +++ b/TaikoLocalServer/appsettings.json @@ -0,0 +1,3 @@ +{ + "AllowedHosts": "*" +} diff --git a/TaikoLocalServer/wwwroot/data/dan_data.json b/TaikoLocalServer/wwwroot/data/dan_data.json new file mode 100644 index 0000000..dae1a65 --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/dan_data.json @@ -0,0 +1,938 @@ +[ + { + "danId":1, + "verupNo":1, + "title":"5kyuu", + "aryOdaiSong":[ + { + "songNo":828, + "level":2, + "isHiddenSongName":false + }, + { + "songNo":187, + "level":2, + "isHiddenSongName":false + }, + { + "songNo":789, + "level":2, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":92, + "goldBorderTotal":95 + }, + { + "odaiType":8, + "borderType":1, + "redBorderTotal":786, + "goldBorderTotal":832 + } + ] + }, + { + "danId":2, + "verupNo":1, + "title":"4kyuu", + "aryOdaiSong":[ + { + "songNo":874, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":411, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":793, + "level":3, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":94, + "goldBorderTotal":97 + }, + { + "odaiType":8, + "borderType":1, + "redBorderTotal":970, + "goldBorderTotal":1023 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":84, + "goldBorderTotal":65 + } + ] + }, + { + "danId":3, + "verupNo":1, + "title":"3kyuu", + "aryOdaiSong":[ + { + "songNo":405, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":728, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":893, + "level":3, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":95, + "goldBorderTotal":99 + }, + { + "odaiType":8, + "borderType":1, + "redBorderTotal":1180, + "goldBorderTotal":1230 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":65, + "goldBorderTotal":43 + } + ] + }, + { + "danId":4, + "verupNo":1, + "title":"2kyuu", + "aryOdaiSong":[ + { + "songNo":140, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":414, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":354, + "level":3, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":96, + "goldBorderTotal":100 + }, + { + "odaiType":8, + "borderType":1, + "redBorderTotal":1555, + "goldBorderTotal":1604 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":55, + "goldBorderTotal":27 + } + ] + }, + { + "danId":5, + "verupNo":1, + "title":"1kyuu", + "aryOdaiSong":[ + { + "songNo":881, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":421, + "level":3, + "isHiddenSongName":false + }, + { + "songNo":641, + "level":3, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":96, + "goldBorderTotal":100 + }, + { + "odaiType":8, + "borderType":1, + "redBorderTotal":2135, + "goldBorderTotal":2183 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":40, + "goldBorderTotal":32 + } + ] + }, + { + "danId":6, + "verupNo":1, + "title":"1dan", + "aryOdaiSong":[ + { + "songNo":809, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":303, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":689, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":97, + "goldBorderTotal":100 + }, + { + "odaiType":5, + "borderType":1, + "redBorderTotal":370, + "goldBorderTotal":520 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":30, + "goldBorderTotal":15 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":43, + "goldBorder_1":54, + "redBorder_2":77, + "goldBorder_2":94, + "redBorder_3":0, + "goldBorder_3":0 + } + ] + }, + { + "danId":7, + "verupNo":1, + "title":"2dan", + "aryOdaiSong":[ + { + "songNo":726, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":861, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":52, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":98, + "goldBorderTotal":100 + }, + { + "odaiType":5, + "borderType":1, + "redBorderTotal":480, + "goldBorderTotal":647 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":25, + "goldBorderTotal":16 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":24, + "goldBorder_1":30, + "redBorder_2":16, + "goldBorder_2":20, + "redBorder_3":16, + "goldBorder_3":21 + } + ] + }, + { + "danId":8, + "verupNo":1, + "title":"3dan", + "aryOdaiSong":[ + { + "songNo":804, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":474, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":141, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":99, + "goldBorderTotal":100 + }, + { + "odaiType":5, + "borderType":1, + "redBorderTotal":590, + "goldBorderTotal":764 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":24, + "goldBorderTotal":12 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":180, + "goldBorder_1":219, + "redBorder_2":63, + "goldBorder_2":75, + "redBorder_3":32, + "goldBorder_3":41 + } + ] + }, + { + "danId":9, + "verupNo":1, + "title":"4dan", + "aryOdaiSong":[ + { + "songNo":523, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":70, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":735, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":99, + "goldBorderTotal":100 + }, + { + "odaiType":5, + "borderType":1, + "redBorderTotal":660, + "goldBorderTotal":842 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":22, + "goldBorderTotal":11 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":121, + "goldBorder_1":141, + "redBorder_2":0, + "goldBorder_2":0, + "redBorder_3":76, + "goldBorder_3":93 + } + ] + }, + { + "danId":10, + "verupNo":1, + "title":"5dan", + "aryOdaiSong":[ + { + "songNo":213, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":428, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":451, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":99, + "goldBorderTotal":100 + }, + { + "odaiType":5, + "borderType":1, + "redBorderTotal":825, + "goldBorderTotal":1007 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":20, + "goldBorderTotal":10 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":33, + "goldBorder_1":40, + "redBorder_2":71, + "goldBorder_2":87, + "redBorder_3":75, + "goldBorder_3":94 + } + ] + }, + { + "danId":11, + "verupNo":1, + "title":"6dan", + "aryOdaiSong":[ + { + "songNo":551, + "level":5, + "isHiddenSongName":false + }, + { + "songNo":270, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":645, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":2, + "borderType":1, + "redBorderTotal":1530, + "goldBorderTotal":1590 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":18, + "goldBorderTotal":9 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":40, + "goldBorder_1":48, + "redBorder_2":15, + "goldBorder_2":18, + "redBorder_3":4, + "goldBorder_3":5 + } + ] + }, + { + "danId":12, + "verupNo":1, + "title":"7dan", + "aryOdaiSong":[ + { + "songNo":805, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":800, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":361, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":2, + "borderType":1, + "redBorderTotal":1790, + "goldBorderTotal":1895 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":16, + "goldBorderTotal":8 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":0, + "goldBorder_1":0, + "redBorder_2":44, + "goldBorder_2":52, + "redBorder_3":33, + "goldBorder_3":37 + } + ] + }, + { + "danId":13, + "verupNo":1, + "title":"8dan", + "aryOdaiSong":[ + { + "songNo":239, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":866, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":431, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":2, + "borderType":1, + "redBorderTotal":1940, + "goldBorderTotal":2020 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":13, + "goldBorderTotal":6 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":18, + "goldBorder_1":20, + "redBorder_2":158, + "goldBorder_2":187, + "redBorder_3":72, + "goldBorder_3":84 + } + ] + }, + { + "danId":14, + "verupNo":1, + "title":"9dan", + "aryOdaiSong":[ + { + "songNo":785, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":780, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":779, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":2, + "borderType":1, + "redBorderTotal":2260, + "goldBorderTotal":2330 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":12, + "goldBorderTotal":6 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":44, + "goldBorder_1":51, + "redBorder_2":207, + "goldBorder_2":243, + "redBorder_3":6, + "goldBorder_3":8 + } + ] + }, + { + "danId":15, + "verupNo":1, + "title":"10dan", + "aryOdaiSong":[ + { + "songNo":759, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":719, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":905, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":3, + "borderType":2, + "redBorder_1":30, + "goldBorder_1":13, + "redBorder_2":30, + "goldBorder_2":13, + "redBorder_3":28, + "goldBorder_3":12 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":7, + "goldBorderTotal":3 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":26, + "goldBorder_1":31, + "redBorder_2":59, + "goldBorder_2":70, + "redBorder_3":53, + "goldBorder_3":61 + } + ] + }, + { + "danId":16, + "verupNo":1, + "title":"11dan", + "aryOdaiSong":[ + { + "songNo":595, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":714, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":961, + "level":4, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":3, + "borderType":1, + "redBorderTotal":50, + "goldBorderTotal":25 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":6, + "goldBorderTotal":3 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":105, + "goldBorder_1":111, + "redBorder_2":32, + "goldBorder_2":34, + "redBorder_3":38, + "goldBorder_3":41 + } + ] + }, + { + "danId":17, + "verupNo":1, + "title":"12dan", + "aryOdaiSong":[ + { + "songNo":859, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":720, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":959, + "level":5, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":3, + "borderType":1, + "redBorderTotal":30, + "goldBorderTotal":15 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":5, + "goldBorderTotal":2 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":4, + "goldBorder_1":5, + "redBorder_2":49, + "goldBorder_2":52, + "redBorder_3":6, + "goldBorder_3":7 + } + ] + }, + { + "danId":18, + "verupNo":1, + "title":"13dan", + "aryOdaiSong":[ + { + "songNo":777, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":716, + "level":5, + "isHiddenSongName":false + }, + { + "songNo":958, + "level":5, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":3, + "borderType":1, + "redBorderTotal":15, + "goldBorderTotal":6 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":4, + "goldBorderTotal":2 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":151, + "goldBorder_1":159, + "redBorder_2":8, + "goldBorder_2":9, + "redBorder_3":34, + "goldBorder_3":36 + } + ] + }, + { + "danId":19, + "verupNo":1, + "title":"14dan", + "aryOdaiSong":[ + { + "songNo":627, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":463, + "level":4, + "isHiddenSongName":false + }, + { + "songNo":960, + "level":5, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 + }, + { + "odaiType":3, + "borderType":1, + "redBorderTotal":8, + "goldBorderTotal":1 + }, + { + "odaiType":4, + "borderType":1, + "redBorderTotal":3, + "goldBorderTotal":1 + }, + { + "odaiType":6, + "borderType":2, + "redBorder_1":13, + "goldBorder_1":14, + "redBorder_2":25, + "goldBorder_2":27, + "redBorder_3":124, + "goldBorder_3":131 + } + ] + } +] \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/event_folder_data.json b/TaikoLocalServer/wwwroot/data/event_folder_data.json new file mode 100644 index 0000000..9e5dd84 --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/event_folder_data.json @@ -0,0 +1,84 @@ +[ + { + "folderId": 1, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 2, + "verupNo": 1, + "priority": 1, + "songNo": [ + 478, 153, 200, 482, 511, 672, 675, 646, 644, 645, 676, 671, 479, + 707, 480, 481, 203, 204, 483, 205, 202, 241, 14, 387, 197, 281, 226, + 484, 543, 512, 709, 35 + ] + }, + { + "folderId": 3, + "verupNo": 1, + "priority": 1, + "songNo": [ + 1485, 1404, 1580, 1730, 1750, 1277, 1478, 1481, 1482, 1484, 1500, + 1890, 2349, 2604, 2640, 1176, 1419, 1596, 1693, 2248, 1049, 1221, + 1222, 1223, 1224, 1493, 1578, 1719, 2650, 1595, 1964, 1469, 1217, + 1314, 1406, 1565, 1745, 2120, 2200, 2324, 2785, 1631, 2301, 2802, + 1490, 2088, 2268, 2309, 2507, 2126, 1630, 2509, 1263, 2495, 2642, + 2745, 1054, 2583, 1271, 1266, 1267, 2923 + ] + }, + { + "folderId": 4, + "verupNo": 1, + "priority": 1, + "songNo": [ + 1361, 1366, 1373, 1379, 1337, 1345, 1357, 1362, 1367, 1368, 1369, + 1374, 1375, 1388, 1390, 1579, 2225, 1354, 1394, 2804, 1340, 1341, + 1370, 1376, 1384, 1359, 1385, 2416, 2756, 1363, 1920, 1353, 1360, + 1381, 1389, 1364, 1391, 1342, 1546, 1931 + ] + }, + { + "folderId": 5, + "verupNo": 1, + "priority": 1, + "songNo": [242, 430, 368, 604, 333] + }, + { + "folderId": 6, + "verupNo": 1, + "priority": 1, + "songNo": [841, 767, 658, 467, 468, 466, 460, 157, 465] + }, + { + "folderId": 7, + "verupNo": 1, + "priority": 1, + "songNo": [733, 732, 44, 790, 894] + }, + { + "folderId": 8, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 12, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 13, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 14, + "verupNo": 1, + "priority": 1, + "songNo": [] + } +] diff --git a/TaikoLocalServer/wwwroot/data/intro_data.json b/TaikoLocalServer/wwwroot/data/intro_data.json new file mode 100644 index 0000000..ac08a5c --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/intro_data.json @@ -0,0 +1,74 @@ +[ + { + "setId":1, + "verupNo":1, + "mainSongNo":895, + "subSongNo":[894,732,44,921] + }, + { + "setId":2, + "verupNo":1, + "mainSongNo":912, + "subSongNo":[827,871,36,227] + }, + { + "setId":3, + "verupNo":1, + "mainSongNo":913, + "subSongNo":[460,916,430,872] + }, + { + "setId":4, + "verupNo":1, + "mainSongNo":842, + "subSongNo":[7,233,256,831] + }, + { + "setId":5, + "verupNo":1, + "mainSongNo":947, + "subSongNo":[926,882,730,695] + }, + { + "setId":6, + "verupNo":1, + "mainSongNo":937, + "subSongNo":[828,925,474,924] + }, + { + "setId":7, + "verupNo":1, + "mainSongNo":956, + "subSongNo":[839,255,285,187] + }, + { + "setId":8, + "verupNo":1, + "mainSongNo":923, + "subSongNo":[729,873,789,893] + }, + { + "setId":9, + "verupNo":1, + "mainSongNo":915, + "subSongNo":[726,811,711,303] + }, + { + "setId":10, + "verupNo":1, + "mainSongNo":885, + "subSongNo":[837,464,801,18] + }, + { + "setId":11, + "verupNo":1, + "mainSongNo":898, + "subSongNo":[47,135,374,792] + }, + { + "setId":12, + "verupNo":1, + "mainSongNo":948, + "subSongNo":[412,538,411,413] + } +] \ No newline at end of file diff --git a/TaikoWebUI/.gitignore b/TaikoWebUI/.gitignore new file mode 100644 index 0000000..eec4522 --- /dev/null +++ b/TaikoWebUI/.gitignore @@ -0,0 +1 @@ +wwwroot/data/* \ No newline at end of file diff --git a/TaikoWebUI/App.razor b/TaikoWebUI/App.razor new file mode 100644 index 0000000..dcdcd36 --- /dev/null +++ b/TaikoWebUI/App.razor @@ -0,0 +1,11 @@ + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
\ No newline at end of file diff --git a/TaikoWebUI/GlobalUsings.cs b/TaikoWebUI/GlobalUsings.cs new file mode 100644 index 0000000..f644645 --- /dev/null +++ b/TaikoWebUI/GlobalUsings.cs @@ -0,0 +1,14 @@ +// Global using directives +global using System.Net.Http; +global using System.Net.Http.Json; +global using Microsoft.AspNetCore.Components; +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; +global using SharedProject.Enums; +global using Throw; \ No newline at end of file diff --git a/TaikoWebUI/Pages/Cards.razor b/TaikoWebUI/Pages/Cards.razor new file mode 100644 index 0000000..b71d5ac --- /dev/null +++ b/TaikoWebUI/Pages/Cards.razor @@ -0,0 +1,88 @@ +@inject HttpClient Client +@inject IDialogService DialogService + +@page "/Cards" + +

Cards

+ + + @if (response is null) + { + @for (uint i = 0; i < 3; i++) + { + + + + + + + + + + + + + + + + } + } + else if (response.Users.Count != 0) + { + @foreach (var user in response.Users) + { + + + + + @user.Baid + + + + + Delete Card + + + + + + Access Code + @user.AccessCode + + + + + Edit Profile + + + High Scores + Dani Dojo + + + + + + } + } + else + { + + + No data. + + + } + \ No newline at end of file diff --git a/TaikoWebUI/Pages/Cards.razor.cs b/TaikoWebUI/Pages/Cards.razor.cs new file mode 100644 index 0000000..0b7eb8f --- /dev/null +++ b/TaikoWebUI/Pages/Cards.razor.cs @@ -0,0 +1,33 @@ +using TaikoWebUI.Pages.Dialogs; + +namespace TaikoWebUI.Pages; + +public partial class Cards +{ + private DashboardResponse? response; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + response = await Client.GetFromJsonAsync("api/Dashboard"); + } + + private async Task DeleteCard(User user) + { + var parameters = new DialogParameters + { + ["user"] = user + }; + + var dialog = DialogService.Show("Delete Card", parameters); + var result = await dialog.Result; + + if (result.Cancelled) + { + return; + } + + response = await Client.GetFromJsonAsync("api/Dashboard"); + } + +} \ No newline at end of file diff --git a/TaikoWebUI/Pages/DaniDojo.razor b/TaikoWebUI/Pages/DaniDojo.razor new file mode 100644 index 0000000..4c7d71c --- /dev/null +++ b/TaikoWebUI/Pages/DaniDojo.razor @@ -0,0 +1,472 @@ +@inject IGameDataService GameDataService +@inject HttpClient Client + +@page "/Cards/{baid:int}/DaniDojo" + + + +

Dani Dojo

+Card: @Baid + + + + + + @for (uint i = 1; i <= 19; i++) + { + var danId = i; + var danData = GameDataService.GetDanDataById(danId); + + + Details + + + + + + Result + + + + + @{ + var danResultState = GetDanResultState(danId); + var danClearStateString = GetDanClearStateString(danResultState); + } + danResultState.ToString() + @danClearStateString + + + + + + + + + + + High Score + + + + @{ + var totalScore = GetTotalScore(danId); + } + + + @totalScore + + + + + + + Totals + + + + @{ + var totalGoods = GetTotalGoodHits(danId); + var totalOks = GetTotalOkHits(danId); + var totalBads = GetTotalBadHits(danId); + var totalDrumroll = GetTotalDrumrollHits(danId); + var totalMaxCombo = GetTotalMaxCombo(danId); + var totalHits = GetTotalHits(danId); + } + + + + Good + @totalGoods + + + OK + @totalOks + + + Bad + @totalBads + + + Drumroll + @totalDrumroll + + + MAX Combo + @totalMaxCombo + + + Total Hits + @totalHits + + + + + + + + + Songs + + + + @for (uint j = 0; j <= 2; j++) + { + var index = (int)j; + var danDataOdaiSong = danData.OdaiSongList[index]; + var stageNumber = j + 1; + var difficulty = (Difficulty)danDataOdaiSong.Level; + + + + + +

@stageNumber

+
+ + + + @difficulty + + + + @GameDataService.GetMusicStarLevel(danDataOdaiSong.SongNo, difficulty) + + + + + @GameDataService.GetMusicNameBySongId(danDataOdaiSong.SongNo) + @GameDataService.GetMusicArtistBySongId(danDataOdaiSong.SongNo) + + + + @if (bestDataMap.ContainsKey(danId)) + { + var danBestData = bestDataMap[danId]; + if (danBestData.DanBestStageDataList.Count > index) + { + var bestStage = danBestData.DanBestStageDataList[index]; + + + + + Good + @bestStage.GoodCount + + + OK + @bestStage.OkCount + + + Bad + @bestStage.BadCount + + + Drumroll + @bestStage.DrumrollCount + + + MAX Combo + @bestStage.ComboCount + + + Total Hits + @bestStage.TotalHitCount + + + + } + } +
+
+
+ } +
+
+
+ + Conditions + + + + + + + + Soul Gauge + + + + + @{ + var redRequirement = GetSoulGauge(danData, false); + var goldRequirement = GetSoulGauge(danData, true); + var barClass = "bar-default"; + var resultText = "Failed"; + } + + Result + @if (bestDataMap.ContainsKey(danId)) + { + var danBestData = bestDataMap[danId]; + + if (danBestData.SoulGaugeTotal >= redRequirement) { + barClass = "bar-pass-red"; + resultText = "Pass"; + } + + if (danBestData.SoulGaugeTotal >= goldRequirement) { + barClass = "bar-pass-gold"; + resultText = "Gold"; + } + + + @(danBestData.SoulGaugeTotal)% + + @resultText + } else { + + 0% + + N/A + } + + + Conditions + + + Red + > @redRequirement% + + + Gold + > @goldRequirement% + + + + + + + + + + + @for (var j = 1; j < danData.OdaiBorderList.Count; j++) + { + var border = danData.OdaiBorderList[j]; + + + + + + @GetDanRequirementTitle(border) + + + + + @{ + var borderType = (DanBorderType)border.BorderType; + } + @if (borderType == DanBorderType.All) + { + + @{ + var redRequirement = border.RedBorderTotal; + var goldRequirement = border.GoldBorderTotal; + var barClass = "bar-default"; + var resultText = "Failed"; + } + + Result + @if (bestDataMap.ContainsKey(danId)) + { + var danBestData = bestDataMap[danId]; + var bestData = GetAllBestFromData((DanConditionType)border.OdaiType, danBestData); + + if ((DanConditionType)border.OdaiType is DanConditionType.BadCount or DanConditionType.OkCount) + { + if (bestData <= redRequirement) + { + barClass = "bar-pass-red"; + resultText = "Pass"; + } + + if (bestData <= goldRequirement) + { + barClass = "bar-pass-gold"; + resultText = "Gold"; + } + + var resultValue = redRequirement - bestData; + if (resultValue < 0) resultValue = 0; + + + @resultValue + + @resultText + } + else + { + if (bestData >= redRequirement) + { + barClass = "bar-pass-red"; + resultText = "Pass"; + } + + if (bestData >= goldRequirement) + { + barClass = "bar-pass-gold"; + resultText = "Gold"; + } + + + @bestData + + @resultText + } + + } + else + { + + 0 + + N/A + } + + @{ + var conditionOperator = GetDanConditionOperator((DanConditionType)border.OdaiType); + } + + Conditions + + + Red + @conditionOperator @redRequirement + + + Gold + @conditionOperator @goldRequirement + + + + + } + else + { + + @for (var k = 0; k < 3; k++) + { + var songNumber = k; + var redRequirement = GetSongBorderCondition(border, songNumber, false); + var goldRequirement = GetSongBorderCondition(border, songNumber, true); + var barClass = "bar-default"; + var resultText = "Failed"; + + + + + + Stage @(songNumber + 1) + + + + Result + @if (bestDataMap.ContainsKey(danId)) + { + var danBestData = bestDataMap[danId]; + var bestData = GetSongBestFromData((DanConditionType)border.OdaiType, danBestData, songNumber); + if ((DanConditionType)border.OdaiType is DanConditionType.BadCount or DanConditionType.OkCount) + { + if (bestData <= redRequirement) + { + barClass = "bar-pass-red"; + resultText = "Pass"; + } + + if (bestData <= goldRequirement) + { + barClass = "bar-pass-gold"; + resultText = "Gold"; + } + var resultValue = redRequirement - bestData; + if (resultValue < 0) resultValue = 0; + + + @resultValue + + @resultText + } + else + { + if (bestData >= redRequirement) + { + barClass = "bar-pass-red"; + resultText = "Pass"; + } + + if (bestData >= goldRequirement) + { + barClass = "bar-pass-gold"; + resultText = "Gold"; + } + + + @bestData + + + @resultText + + } + + } + else + { + + 0 + + + N/A + + } + @{ + var conditionOperator = GetDanConditionOperator((DanConditionType)border.OdaiType); + + + if (redRequirement == 0) { + conditionOperator = ""; + } + } + + Conditions + + + Red + @conditionOperator @redRequirement + + + Gold + @conditionOperator @goldRequirement + + + + + + + } + + } + + + } + + + + + +
+ } +
+
+
+
\ No newline at end of file diff --git a/TaikoWebUI/Pages/DaniDojo.razor.cs b/TaikoWebUI/Pages/DaniDojo.razor.cs new file mode 100644 index 0000000..12a1ee2 --- /dev/null +++ b/TaikoWebUI/Pages/DaniDojo.razor.cs @@ -0,0 +1,229 @@ +namespace TaikoWebUI.Pages; + +public partial class DaniDojo +{ + [Parameter] + public int Baid { get; set; } + + private DanBestDataResponse? response; + + private static Dictionary bestDataMap = new(); + + private readonly List breadcrumbs = new() + { + new BreadcrumbItem("Cards", href: "/Cards"), + }; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + response = await Client.GetFromJsonAsync($"api/DanBestData/{Baid}"); + response.ThrowIfNull(); + response.DanBestDataList.ForEach(data => data.DanBestStageDataList + .Sort((stageData, otherStageData) => stageData.SongNumber.CompareTo(otherStageData.SongNumber))); + bestDataMap = response.DanBestDataList.ToDictionary(data => data.DanId); + + breadcrumbs.Add(new BreadcrumbItem($"Card: {Baid}", href: null, disabled: true)); + breadcrumbs.Add(new BreadcrumbItem("Dani Dojo", href: $"/Cards/{Baid}/DaniDojo", disabled: false)); + } + + private static string GetDanClearStateString(DanClearState danClearState) + { + return danClearState switch + { + DanClearState.NotClear => "Not Cleared", + DanClearState.RedNormalClear => "Red Clear", + DanClearState.RedFullComboClear => "Red Full Combo", + DanClearState.RedPerfectClear => "Red Donderful Combo", + DanClearState.GoldNormalClear => "Gold Clear", + DanClearState.GoldFullComboClear => "Gold Full Combo", + DanClearState.GoldPerfectClear => "Gold Donderful Combo", + _ => "" + }; + } + + private static string GetDanRequirementString(DanConditionType danConditionType) + { + return danConditionType switch + { + DanConditionType.TotalHitCount => "Total Hits", + DanConditionType.GoodCount => "Good Hits", + DanConditionType.OkCount => "OK Hits", + DanConditionType.BadCount => "Bad Hits", + DanConditionType.SoulGauge => "Soul Gauge", + DanConditionType.DrumrollCount => "Drumroll Hits", + DanConditionType.Score => "Score", + DanConditionType.ComboCount => "MAX Combo", + _ => "" + }; + } + + private static string GetDanRequirementTitle(DanData.OdaiBorder data) + { + var danConditionType = (DanConditionType)data.OdaiType; + + return GetDanRequirementString(danConditionType); + } + + private static long GetAllBestFromData(DanConditionType type, DanBestData data) + { + return type switch + { + DanConditionType.SoulGauge => throw new ArgumentException("Soul gauge should not be here"), + DanConditionType.GoodCount => data.DanBestStageDataList.Sum(stageData => stageData.GoodCount), + DanConditionType.OkCount => data.DanBestStageDataList.Sum(stageData => stageData.OkCount), + DanConditionType.BadCount => data.DanBestStageDataList.Sum(stageData => stageData.BadCount), + DanConditionType.ComboCount => data.ComboCountTotal, + DanConditionType.DrumrollCount => data.DanBestStageDataList.Sum(stageData => stageData.DrumrollCount), + DanConditionType.Score => data.DanBestStageDataList.Sum(stageData => stageData.PlayScore), + DanConditionType.TotalHitCount => data.DanBestStageDataList.Sum(stageData => stageData.TotalHitCount), + _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) + }; + } + + private static uint GetSongBestFromData(DanConditionType type, DanBestData data, int songNumber) + { + songNumber.Throw().IfOutOfRange(0, 2); + return type switch + { + DanConditionType.SoulGauge => throw new ArgumentException("Soul gauge should not be here"), + DanConditionType.GoodCount => data.DanBestStageDataList[songNumber].GoodCount, + DanConditionType.OkCount => data.DanBestStageDataList[songNumber].OkCount, + DanConditionType.BadCount => data.DanBestStageDataList[songNumber].BadCount, + DanConditionType.ComboCount => data.DanBestStageDataList[songNumber].ComboCount, + DanConditionType.DrumrollCount => data.DanBestStageDataList[songNumber].DrumrollCount, + DanConditionType.Score => data.DanBestStageDataList[songNumber].PlayScore, + DanConditionType.TotalHitCount => data.DanBestStageDataList[songNumber].TotalHitCount, + _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) + }; + } + + private static uint GetSongBorderCondition(DanData.OdaiBorder data, int songNumber, bool isGold) + { + if (!isGold) + { + return songNumber switch + { + 0 => data.RedBorder1, + 1 => data.RedBorder2, + 2 => data.RedBorder3, + _ => 0 + }; + } + + return songNumber switch + { + 0 => data.GoldBorder1, + 1 => data.GoldBorder2, + 2 => data.GoldBorder3, + _ => 0 + }; + } + + private static string GetDanTitle(string title) + { + return title switch + { + "5kyuu" => "Fifth Kyuu", + "4kyuu" => "Fourth Kyuu", + "3kyuu" => "Third Kyuu", + "2kyuu" => "Second Kyuu", + "1kyuu" => "First Kyuu", + "1dan" => "First Dan", + "2dan" => "Second Dan", + "3dan" => "Third Dan", + "4dan" => "Fourth Dan", + "5dan" => "Fifth Dan", + "6dan" => "Sixth Dan", + "7dan" => "Seventh Dan", + "8dan" => "Eighth Dan", + "9dan" => "Ninth Dan", + "10dan" => "Tenth Dan", + "11dan" => "Kuroto", + "12dan" => "Meijin", + "13dan" => "Chojin", + "14dan" => "Tatsujin", + "15dan" => "Gaiden", + _ => "" + }; + } + + private string GetDanResultIcon(uint danId) + { + string icon; + const string notClearIcon = ""; + + if (!bestDataMap.ContainsKey(danId)) + { + return notClearIcon; + } + + var state = bestDataMap[danId].ClearState; + + icon = state is DanClearState.NotClear ? notClearIcon : $""; + + return icon; + } + + private DanClearState GetDanResultState(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].ClearState : DanClearState.NotClear; + } + + private static uint GetSoulGauge(DanData data, bool isGold) + { + var borders = data.OdaiBorderList; + var soulBorder = + borders.FirstOrDefault(border => (DanConditionType)border.BorderType == DanConditionType.SoulGauge, + new DanData.OdaiBorder()); + + return isGold ? soulBorder.GoldBorderTotal : soulBorder.RedBorderTotal; + } + + private static string GetDanConditionOperator(DanConditionType type) + { + var conditionOperator = ">"; + + if (type is DanConditionType.BadCount or DanConditionType.OkCount) + { + conditionOperator = "<"; + } + + return conditionOperator; + } + + private static long GetTotalScore(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.HighScore) : 0; + } + + private static long GetTotalGoodHits(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.GoodCount) : 0; + } + + private static long GetTotalOkHits(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.OkCount) : 0; + } + + private static long GetTotalBadHits(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.BadCount) : 0; + } + + private static long GetTotalDrumrollHits(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.DrumrollCount) : 0; + } + + private static long GetTotalMaxCombo(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.ComboCount) : 0; + } + + private static long GetTotalHits(uint danId) + { + return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.TotalHitCount) : 0; + } +} \ No newline at end of file diff --git a/TaikoWebUI/Pages/Dashboard.razor b/TaikoWebUI/Pages/Dashboard.razor new file mode 100644 index 0000000..ef5573a --- /dev/null +++ b/TaikoWebUI/Pages/Dashboard.razor @@ -0,0 +1,7 @@ +@page "/" + +

Dashboard

+ + + Welcome to TaikoWebUI! + \ No newline at end of file diff --git a/TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor b/TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor new file mode 100644 index 0000000..95c5c29 --- /dev/null +++ b/TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor @@ -0,0 +1,23 @@ +@inject HttpClient Client +@inject ISnackbar Snackbar + + + + + + Delete card? + + + + + Do you really want to delete the card? + All the related data will also be deleted and this process cannot be undone! + + + + Cancel + + Delete Card + + + \ No newline at end of file diff --git a/TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor.cs b/TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor.cs new file mode 100644 index 0000000..f34ed76 --- /dev/null +++ b/TaikoWebUI/Pages/Dialogs/CardDeleteConfirmDialog.razor.cs @@ -0,0 +1,28 @@ +namespace TaikoWebUI.Pages.Dialogs; + +public partial class CardDeleteConfirmDialog +{ + + [CascadingParameter] + MudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public User User { get; set; } = new(); + + private void Cancel() => MudDialog.Cancel(); + + private async Task DeleteCard() + { + var responseMessage = await Client.DeleteAsync($"api/Cards/{User.AccessCode}"); + + if (!responseMessage.IsSuccessStatusCode) + { + Snackbar.Add("Something went wrong when deleting card!", Severity.Error); + MudDialog.Close(DialogResult.Ok(false)); + return; + } + + Snackbar.Add("Delete success!", Severity.Success); + MudDialog.Close(DialogResult.Ok(true)); + } +} \ No newline at end of file diff --git a/TaikoWebUI/Pages/Dialogs/ChooseTitleDialog.razor b/TaikoWebUI/Pages/Dialogs/ChooseTitleDialog.razor new file mode 100644 index 0000000..b40e7be --- /dev/null +++ b/TaikoWebUI/Pages/Dialogs/ChooseTitleDialog.razor @@ -0,0 +1,105 @@ +@using TaikoWebUI.Shared.Models +@using System.Collections.Immutable +@inject IGameDataService GameDataService + + + + + + + + + + + + + + + + ID + + + + + Title + + + + + @{ + // Disable nullable warnings, which seems to be a false positive + # pragma warning disable CS8602 + } + @context.TitleId + @context.TitleName + @{ + #pragma warning restore CS8602 + } + + + + + + Selected Title: @selectedTitle?.TitleName + + + Cancel + Ok + + + +@code { + + [CascadingParameter] + MudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public UserSetting UserSetting { get; set; } = new(); + + private IEnumerable titles = new List<Title>(); + + private Title? selectedTitle; + + private string searchString = string.Empty; + + protected override void OnInitialized() + { + base.OnInitialized(); + var titleSet = GameDataService.GetTitles(); + titles = titleSet.ToImmutableList().Sort((title, title1) => title.TitleId.CompareTo(title1.TitleId)); + var currentTitle = new Title + { + TitleName = UserSetting.Title + }; + if (titleSet.Contains(currentTitle)) + { + titleSet.TryGetValue(new Title + { + TitleName = UserSetting.Title + }, out selectedTitle); + } + } + + private bool Filter(Title? title) + { + if (title is null) + { + return false; + } + return string.IsNullOrEmpty(searchString) || + title.TitleName.Contains(searchString, StringComparison.InvariantCultureIgnoreCase); + } + + private void Submit() + { + if (selectedTitle is not null) + { + UserSetting.Title = selectedTitle.TitleName; + } + MudDialog.Close(DialogResult.Ok(true)); + } + + private void Cancel() => MudDialog.Cancel(); + +} \ No newline at end of file diff --git a/TaikoWebUI/Pages/HighScores.razor b/TaikoWebUI/Pages/HighScores.razor new file mode 100644 index 0000000..aa54e55 --- /dev/null +++ b/TaikoWebUI/Pages/HighScores.razor @@ -0,0 +1,173 @@ +@inject IGameDataService GameDataService +@inject HttpClient Client + +@page "/Cards/{baid:int}/HighScores" + +<MudBreadcrumbs Items="breadcrumbs" Class="px-0"></MudBreadcrumbs> + +<h1>High Scores</h1> +<MudText Typo="Typo.caption">Card: @Baid</MudText> + +<MudGrid Class="my-8"> + @if (response is null) + { + <MudItem xs="12"> + <MudText Align="Align.Center"> + No data. + </MudText> + </MudItem> + } + else + { + <MudItem xs="12"> + <MudTabs Elevation="0" Border="true" Rounded="true" ApplyEffectsToContainer="true" Outlined="true" Class="mb-10"> + @foreach (var difficulty in Enum.GetValues<Difficulty>()) + { + @if (difficulty is not Difficulty.None) + { + <MudTabPanel Text="@GetDifficultyTitle(difficulty)" + Icon="@GetDifficultyIcon(difficulty)"> + @if (songBestDataMap.ContainsKey(difficulty)) + { + <MudDataGrid Items="@songBestDataMap[difficulty]" RowClick="(DataGridRowClickEventArgs<SongBestData> _) => { return;}" + ColumnResizeMode="ResizeMode.None" RowsPerPage="25" Elevation="0"> + <Columns> + <Column T="SongBestData" Field="@nameof(SongBestData.SongId)" Title="Song" StickyLeft="true"> + <CellTemplate> + <MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center"> + <div style="width:300px"> + <MudText Typo="Typo.body2" Style="font-weight:bold">@context.Item.MusicName</MudText> + <MudText Typo="Typo.caption">@context.Item.MusicArtist</MudText> + </div> + <div> + <MudToggleIconButton Toggled="@context.Item.IsFavorite" + ToggledChanged="@(async () => await OnFavoriteToggled(context.Item))" + Icon="@Icons.Material.Filled.FavoriteBorder" Color="@Color.Secondary" + ToggledIcon="@Icons.Material.Filled.Favorite" ToggledColor="@Color.Secondary" + Size="Size.Small" + ToggledSize="Size.Small" + Title="Add to favorites" ToggledTitle="Remove from favorites"/> + </div> + </MudStack> + </CellTemplate> + </Column> + <Column T="SongBestData" Field="@nameof(SongBestData.SongId)" Title="Level" Sortable="false"> + <CellTemplate> + <MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center"> + <MudIcon Icon="@Icons.Filled.Star" Size="Size.Small" /> + <MudText Typo="Typo.caption" Style="line-height:1;margin-top:2px;margin-right:2px;">@GameDataService.GetMusicStarLevel(@context.Item.SongId, difficulty)</MudText> + </MudStack> + </CellTemplate> + </Column> + <Column T="SongBestData" Field="@nameof(SongBestData.Genre)" Title="Genre" + Sortable="false" Filterable="true"> + <CellTemplate> + <MudChip Style="@GetGenreStyle(context.Item.Genre)" + Size="Size.Small"> + @GetGenreTitle(context.Item.Genre) + </MudChip> + </CellTemplate> + </Column> + <Column T="SongBestData" Field="@nameof(SongBestData.BestScore)" Title="Best Score" /> + <Column T="SongBestData" Field="@nameof(SongBestData.BestCrown)" Title="Best Crown"> + <CellTemplate> + <img src="@($"/images/crown_{context.Item.BestCrown}.png")" alt="@(GetCrownText(context.Item.BestCrown))" title="@(GetCrownText(context.Item.BestCrown))" style="@IconStyle" /> + </CellTemplate> + </Column> + <Column T="SongBestData" Field="@nameof(SongBestData.BestScoreRank)" Title="Best Rank" Sortable="false"> + <CellTemplate> + @if (context.Item.BestScoreRank is not ScoreRank.None) + { + <img src="@($"/images/rank_{context.Item.BestScoreRank}.png")" alt="@(GetRankText(context.Item.BestScoreRank))" title="@(GetRankText(context.Item.BestScoreRank))" style="@IconStyle" /> + } + </CellTemplate> + </Column> + <Column T="SongBestData" Field="@nameof(SongBestData.GoodCount)" Title="Good" Sortable="false" /> + <Column T="SongBestData" Field="@nameof(SongBestData.OkCount)" Title="OK" Sortable="false" /> + <Column T="SongBestData" Field="@nameof(SongBestData.MissCount)" Title="Bad" Sortable="false" /> + <Column T="SongBestData" Field="@nameof(SongBestData.DrumrollCount)" Title="Drumroll" Sortable="false"/> + <Column T="SongBestData" Field="@nameof(SongBestData.ComboCount)" Title="MAX Combo" Sortable="false" /> + <Column T="SongBestData" Field="@nameof(SongBestData.ShowAiData)" Title="AI Battle Data"> + <CellTemplate> + <MudButton Variant="Variant.Outlined" Size="Size.Small" + OnClick="@(() => ToggleShowAiData(context.Item))" + Disabled="@(!IsAiDataPresent(context.Item))"> + @(context.Item.ShowAiData ? "Hide" : "Show") + </MudButton> + </CellTemplate> + </Column> + <Column T="SongBestData" Field="@nameof(SongBestData.LastPlayTime)" Title="Last Played" Hideable="true" /> + <Column T="SongBestData" Field="@nameof(SongBestData.PlayCount)" Title="Total Plays" Hideable="true" /> + <Column T="SongBestData" Field="@nameof(SongBestData.ClearCount)" Title="Total Clears" Hideable="true" /> + <Column T="SongBestData" Field="@nameof(SongBestData.FullComboCount)" Title="Total Full Combos" Hideable="true" /> + <Column T="SongBestData" Field="@nameof(SongBestData.PerfectCount)" Title="Total Donderful Combos" Hideable="true" /> + </Columns> + <ChildRowContent> + @if (context.Item.ShowAiData) + { + <tr> + <td colspan="1" class="pa-3 ai-battle-td"> + <MudText Typo="Typo.body2" Style="font-weight: bold"> + AI Battle Data + </MudText> + </td> + <td colspan="16"> + <MudTable Elevation="0" ReadOnly="true" + Items="@context.Item.AiSectionBestData" Context="aiSectionContext"> + <HeaderContent> + <MudTh>Section No.</MudTh> + <MudTh>Result</MudTh> + <MudTh>Score</MudTh> + <MudTh>Crown</MudTh> + <MudTh>Good</MudTh> + <MudTh>OK</MudTh> + <MudTh>Bad</MudTh> + <MudTh>Drumroll</MudTh> + </HeaderContent> + <RowTemplate> + <MudTd>@(aiSectionContext.SectionIndex + 1)</MudTd> + <MudTd> + @if (@aiSectionContext.IsWin) { + <img src="@($"/images/ai_Win.png")" alt="Win" title="Win" style="@IconStyle" /> + } + else + { + <img src="@($"/images/ai_Lose.png")" alt="Lose" title="Lose" style="@IconStyle" /> + } + </MudTd> + <MudTd>@aiSectionContext.Score</MudTd> + <MudTd> + <img src="@($"/images/ai_crown_{aiSectionContext.Crown}.png")" alt="@(GetCrownText(aiSectionContext.Crown))" title="@(GetCrownText(aiSectionContext.Crown))" style="@IconStyle" /> + </MudTd> + <MudTd>@aiSectionContext.GoodCount</MudTd> + <MudTd>@aiSectionContext.OkCount</MudTd> + <MudTd>@aiSectionContext.MissCount</MudTd> + <MudTd>@aiSectionContext.DrumrollCount</MudTd> + </RowTemplate> + </MudTable> + </td> + </tr> + } + </ChildRowContent> + <PagerContent> + <MudDataGridPager T="SongBestData"/> + </PagerContent> + </MudDataGrid> + } + else + { + <MudGrid> + <MudItem xs="12"> + <MudText Align="Align.Center" Class="my-16"> + No data for selected difficulty. + </MudText> + </MudItem> + </MudGrid> + } + </MudTabPanel> + } + } + </MudTabs> + </MudItem> + } +</MudGrid> \ No newline at end of file diff --git a/TaikoWebUI/Pages/HighScores.razor.cs b/TaikoWebUI/Pages/HighScores.razor.cs new file mode 100644 index 0000000..821d441 --- /dev/null +++ b/TaikoWebUI/Pages/HighScores.razor.cs @@ -0,0 +1,154 @@ +using static MudBlazor.Colors; +using System; + +namespace TaikoWebUI.Pages; + +public partial class HighScores +{ + [Parameter] + public int Baid { get; set; } + + private const string IconStyle = "width:25px; height:25px;"; + + private SongBestResponse? response; + + private Dictionary<Difficulty, List<SongBestData>> songBestDataMap = new(); + + private readonly List<BreadcrumbItem> breadcrumbs = new() + { + new BreadcrumbItem("Cards", href: "/Cards"), + }; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + response = await Client.GetFromJsonAsync<SongBestResponse>($"api/PlayData/{Baid}"); + response.ThrowIfNull(); + + response.SongBestData.ForEach(data => + { + var songId = data.SongId; + data.Genre = GameDataService.GetMusicGenreBySongId(songId); + data.MusicName = GameDataService.GetMusicNameBySongId(songId); + data.MusicArtist = GameDataService.GetMusicArtistBySongId(songId); + }); + + songBestDataMap = response.SongBestData.GroupBy(data => data.Difficulty) + .ToDictionary(data => data.Key, + data => data.ToList()); + foreach (var songBestDataList in songBestDataMap.Values) + { + songBestDataList.Sort((data1, data2) => GameDataService.GetMusicIndexBySongId(data1.SongId) + .CompareTo(GameDataService.GetMusicIndexBySongId(data2.SongId))); + } + + + breadcrumbs.Add(new BreadcrumbItem($"Card: {Baid}", href: null, disabled: true)); + breadcrumbs.Add(new BreadcrumbItem("High Scores", href: $"/Cards/{Baid}/HighScores", disabled: false)); + } + + private async Task OnFavoriteToggled(SongBestData data) + { + var request = new SetFavoriteRequest + { + Baid = (uint)Baid, + IsFavorite = !data.IsFavorite, + SongId = data.SongId + }; + var result = await Client.PostAsJsonAsync("api/FavoriteSongs", request); + if (result.IsSuccessStatusCode) + { + data.IsFavorite = !data.IsFavorite; + } + } + + private static string GetCrownText(CrownType crown) + { + return crown switch + { + CrownType.None => "Fail", + CrownType.Clear => "Clear", + CrownType.Gold => "Full Combo", + CrownType.Dondaful => "Donderful Combo", + _ => "" + }; + } + + private static string GetRankText(ScoreRank rank) + { + return rank switch + { + ScoreRank.White => "Stylish", + ScoreRank.Bronze => "Stylish", + ScoreRank.Silver => "Stylish", + ScoreRank.Gold => "Graceful", + ScoreRank.Sakura => "Graceful", + ScoreRank.Purple => "Graceful", + ScoreRank.Dondaful => "Top Class", + _ => "" + }; + } + + private static string GetDifficultyTitle(Difficulty difficulty) + { + return difficulty switch + { + Difficulty.Easy => "Easy", + Difficulty.Normal => "Normal", + Difficulty.Hard => "Hard", + Difficulty.Oni => "Oni", + Difficulty.UraOni => "Ura Oni", + _ => "" + }; + } + + private static string GetDifficultyIcon(Difficulty difficulty) + { + return $"<image href='/images/difficulty_{difficulty}.png' alt='{difficulty}' width='24' height='24'/>"; + } + + private static string GetGenreTitle(SongGenre genre) + { + return genre switch + { + SongGenre.Pop => "Pop", + SongGenre.Anime => "Anime", + SongGenre.Kids => "Kids", + SongGenre.Vocaloid => "Vocaloid", + SongGenre.GameMusic => "Game Music", + SongGenre.NamcoOriginal => "NAMCO Original", + SongGenre.Variety => "Variety", + SongGenre.Classical => "Classical", + _ => "" + }; + } + + private static string GetGenreStyle(SongGenre genre) + { + return genre switch + { + SongGenre.Pop => "background: #42c0d2; color: #fff", + SongGenre.Anime => "background: #ff90d3; color: #fff", + SongGenre.Kids => "background: #fec000; color: #fff", + SongGenre.Vocaloid => "background: #ddd", + SongGenre.GameMusic => "background: #cc8aea; color: #fff", + SongGenre.NamcoOriginal => "background: #ff7027; color: #fff", + SongGenre.Variety => "background: #1dc83b; color: #fff", + SongGenre.Classical => "background: #bfa356", + _ => "" + }; + } + + private static void ToggleShowAiData(SongBestData data) + { + data.ShowAiData = !data.ShowAiData; + } + + private static bool IsAiDataPresent(SongBestData data) + { + var aiData = data.AiSectionBestData; + + return aiData.Count > 0; + } +} + diff --git a/TaikoWebUI/Pages/Profile.razor b/TaikoWebUI/Pages/Profile.razor new file mode 100644 index 0000000..1373290 --- /dev/null +++ b/TaikoWebUI/Pages/Profile.razor @@ -0,0 +1,214 @@ +@page "/Cards/{baid:int}/Profile" +@inject HttpClient Client +@inject IGameDataService GameDataService +@inject IDialogService DialogService + +<MudBreadcrumbs Items="breadcrumbs" Class="px-0"></MudBreadcrumbs> + +<h1>Profile</h1> +<MudText Typo="Typo.caption">Card: @Baid</MudText> + +@if (response is not null) +{ + <MudGrid Class="my-4 pb-10"> + <MudItem xs="12" md="8"> + <MudPaper Elevation="0" Outlined="true"> + <MudTabs Rounded="true" Border="true" PanelClass="pa-8"> + <MudTabPanel Text="Profile"> + <MudStack Spacing="4"> + <h2>Profile Options</h2> + + <MudTextField @bind-Value="@response.MyDonName" Label="Name"></MudTextField> + + <MudGrid> + <MudItem xs="12" md="8"> + <MudTextField @bind-Value="@response.Title" Label="Title"/> + <MudButton Color="Color.Primary" Class="mt-1" Size="Size.Small" OnClick="@((e)=>OpenChooseTitleDialog())"> + Select a Title + </MudButton> + </MudItem> + <MudItem xs="12" md="4"> + <MudSelect @bind-Value="@response.TitlePlateId" Label="Title Plate"> + @for (uint i = 0; i < 8; i++) + { + var index = i; + <MudSelectItem Value="@i">@TitlePlateStrings[index]</MudSelectItem> + } + </MudSelect> + </MudItem> + </MudGrid> + + <MudSelect @bind-Value="@response.AchievementDisplayDifficulty" + Label="Achievement Panel Difficulty"> + @foreach (var item in Enum.GetValues<Difficulty>()) + { + <MudSelectItem Value="@item"/> + } + </MudSelect> + + <MudSwitch @bind-Checked="@response.IsDisplayAchievement" Label="Display Achievement Panel" Color="Color.Primary"/> + <MudSwitch @bind-Checked="@response.IsDisplayDanOnNamePlate" Label="Display Dan Rank on Name Plate" Color="Color.Primary"/> + </MudStack> + </MudTabPanel> + + <MudTabPanel Text="Costume"> + <MudStack Spacing="4"> + <h2>Costume Options</h2> + <MudGrid> + <MudItem xs="12"> + <MudStack Spacing="4" Class="mb-8"> + <MudSelect @bind-Value="@response.Head" Label="Head"> + @for (var i = 0; i < Constants.COSTUME_HEAD_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetHeadTitle(index); + <MudSelectItem Value="@index">@index - @costumeTitle</MudSelectItem> + } + </MudSelect> + + <MudSelect @bind-Value="@response.Body" Label="Body"> + @for (var i = 0; i < Constants.COSTUME_BODY_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetBodyTitle(index); + <MudSelectItem Value="@index">@index - @costumeTitle</MudSelectItem> + } + </MudSelect> + + <MudSelect @bind-Value="@response.Face" Label="Face"> + @for (var i = 0; i < Constants.COSTUME_FACE_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetFaceTitle(index); + <MudSelectItem Value="@index">@index - @costumeTitle</MudSelectItem> + } + </MudSelect> + + <MudSelect @bind-Value="@response.Kigurumi" Label="Kigurumi"> + @for (var i = 0; i < Constants.COSTUME_KIGURUMI_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetKigurumiTitle(index); + <MudSelectItem Value="@index">@index - @costumeTitle</MudSelectItem> + } + </MudSelect> + + <MudSelect @bind-Value="@response.Puchi" Label="Puchi"> + @for (var i = 0; i < Constants.COSTUME_PUCHI_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetPuchiTitle(index); + <MudSelectItem Value="@index">@index - @costumeTitle</MudSelectItem> + } + </MudSelect> + </MudStack> + + <MudStack Row="true"> + <MudSelect @bind-Value="@response.BodyColor" Label="Body Color"> + @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++) + { + var index = i; + <MudSelectItem Value="@index"> + <div class="color-box" style=@($"background: {CostumeColors[index]}")></div> + @index + </MudSelectItem> + } + </MudSelect> + <MudSelect @bind-Value="@response.FaceColor" Label="Face Color"> + @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++) + { + var index = i; + <MudSelectItem Value="@index"> + <div class="color-box" style=@($"background: {CostumeColors[index]}")></div> + @index + </MudSelectItem> + } + </MudSelect> + <MudSelect @bind-Value="@response.LimbColor" Label="Limb Color"> + @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++) + { + var index = i; + <MudSelectItem Value="@index"> + <div class="color-box" style=@($"background: {CostumeColors[index]}")></div> + @index + </MudSelectItem> + } + </MudSelect> + </MudStack> + </MudItem> + </MudGrid> + </MudStack> + </MudTabPanel> + + <MudTabPanel Text="Song Options"> + <MudStack Spacing="4"> + <h2>Song Options</h2> + <MudGrid> + <MudItem xs="12" md="4"> + <MudStack Spacing="4"> + <MudSwitch @bind-Checked="@response.PlaySetting.IsVanishOn" Label="Vanish" Color="Color.Primary"/> + <MudSwitch @bind-Checked="@response.PlaySetting.IsInverseOn" Label="Inverse" Color="Color.Primary"/> + <MudSwitch @bind-Checked="@response.IsSkipOn" Label="Give Up" Color="Color.Primary"/> + <MudSwitch @bind-Checked="@response.IsVoiceOn" Label="Voice" Color="Color.Primary"/> + </MudStack> + </MudItem> + <MudItem xs="12" md="8"> + <MudStack Spacing="4"> + <MudSelect @bind-Value="@response.PlaySetting.Speed" Label="Speed"> + @for (uint i = 0; i < 15; i++) + { + var index = i; + <MudSelectItem Value="@i">@SpeedStrings[index]</MudSelectItem> + } + </MudSelect> + + <MudSelect @bind-Value="@response.PlaySetting.RandomType" + Label="Random"> + @foreach (var item in Enum.GetValues<RandomType>()) + { + <MudSelectItem Value="@item"/> + } + </MudSelect> + + <MudSelect @bind-Value="@response.ToneId" Label="Tone"> + @for (uint i = 0; i < 19; i++) + { + var index = i; + <MudSelectItem Value="@i">@ToneStrings[index]</MudSelectItem> + } + </MudSelect> + + <MudSlider Class="mb-8" @bind-Value="@response.NotesPosition" Size="Size.Medium" Min="-5" Max="5" Step="1" TickMarks="true" TickMarkLabels="@NotePositionStrings"> + <MudText Typo="Typo.caption">Notes Position</MudText> + </MudSlider> + </MudStack> + </MudItem> + </MudGrid> + </MudStack> + </MudTabPanel> + </MudTabs> + </MudPaper> + </MudItem> + + <MudItem md="4" xs="12" Class="py-4 px-8"> + <MudStack Style="top:100px" Class="sticky"> + <MudButton Disabled="@isSavingOptions" + OnClick="SaveOptions" + Variant="Variant.Filled" + Color="Color.Primary"> + @if (isSavingOptions) + { + <MudProgressCircular Class="ms-n1" Size="Size.Small" Indeterminate="true"/> + <MudText Class="ms-2">Saving...</MudText> + } + else + { + <MudIcon Icon="@Icons.Filled.Save" Class="mx-2"></MudIcon> + <MudText>Save</MudText> + } + </MudButton> + </MudStack> + + </MudItem> + </MudGrid> +} \ No newline at end of file diff --git a/TaikoWebUI/Pages/Profile.razor.cs b/TaikoWebUI/Pages/Profile.razor.cs new file mode 100644 index 0000000..31c2d78 --- /dev/null +++ b/TaikoWebUI/Pages/Profile.razor.cs @@ -0,0 +1,96 @@ +using TaikoWebUI.Pages.Dialogs; + +namespace TaikoWebUI.Pages; + +public partial class Profile +{ + [Parameter] + public int Baid { get; set; } + + private UserSetting? response; + + private bool isSavingOptions; + + private static readonly string[] CostumeColors = + { + "#F84828", "#68C0C0", "#DC1500", "#F8F0E0", "#009687", "#00BF87", + "#00FF9A", "#66FFC2", "#FFFFFF", "#690000", "#FF0000", "#FF6666", + "#FFB3B3", "#00BCC2", "#00F7FF", "#66FAFF", "#B3FDFF", "#E4E4E4", + "#993800", "#FF5E00", "#FF9E78", "#FFCFB3", "#005199", "#0088FF", + "#66B8FF", "#B3DBFF", "#B9B9B9", "#B37700", "#FFAA00", "#FFCC66", + "#FFE2B3", "#000C80", "#0019FF", "#6675FF", "#B3BAFF", "#858585", + "#B39B00", "#FFDD00", "#FFFF00", "#FFFF71", "#2B0080", "#5500FF", + "#9966FF", "#CCB3FF", "#505050", "#38A100", "#78C900", "#B3FF00", + "#DCFF8A", "#610080", "#C400FF", "#DC66FF", "#EDB3FF", "#232323", + "#006600", "#00B800", "#00FF00", "#8AFF9E", "#990059", "#FF0095", + "#FF66BF", "#FFB3DF", "#000000" + }; + + 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 static readonly string[] NotePositionStrings = { "-5", "-4", "-3", "-2", "-1", "0", "+1", "+2", "+3", "+4", "+5" }; + + private static readonly string[] ToneStrings = + { + "Taiko", "Festival", "Dogs & Cats", "Deluxe", + "Drumset", "Tambourine", "Don Wada", "Clapping", + "Conga", "8-Bit", "Heave-ho", "Mecha", + "Bujain", "Rap", "Hosogai", "Akemi", + "Synth Drum", "Shuriken", "Bubble Pop", "Electric Guitar" + }; + + private static readonly string[] TitlePlateStrings = + { + "Wood", "Rainbow", "Gold", "Purple", + "AI 1", "AI 2", "AI 3", "AI 4" + }; + + private readonly List<BreadcrumbItem> breadcrumbs = new() + { + new BreadcrumbItem("Cards", href: "/Cards"), + }; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + isSavingOptions = false; + response = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}"); + + breadcrumbs.Add(new BreadcrumbItem($"Card: {Baid}", href: null, disabled: true)); + breadcrumbs.Add(new BreadcrumbItem("Profile", href: $"/Cards/{Baid}/Profile", disabled: false)); + } + + private async Task SaveOptions() + { + isSavingOptions = true; + await Client.PostAsJsonAsync($"api/UserSettings/{Baid}", response); + isSavingOptions = false; + } + + private async Task OpenChooseTitleDialog() + { + var options = new DialogOptions + { + //CloseButton = false, + CloseOnEscapeKey = false, + DisableBackdropClick = true, + MaxWidth = MaxWidth.Medium, + FullWidth = true + }; + var parameters = new DialogParameters + { + ["UserSetting"] = response + }; + var dialog = DialogService.Show<ChooseTitleDialog>("Player Titles", parameters, options); + var result = await dialog.Result; + if (!result.Cancelled) + { + StateHasChanged(); + } + } +} \ No newline at end of file diff --git a/TaikoWebUI/Program.cs b/TaikoWebUI/Program.cs new file mode 100644 index 0000000..75baef5 --- /dev/null +++ b/TaikoWebUI/Program.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using MudBlazor.Services; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); +builder.RootComponents.Add<App>("#app"); +builder.RootComponents.Add<HeadOutlet>("head::after"); + +builder.Services.AddSingleton(sp => new HttpClient +{ + BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) +}); +builder.Services.AddMudServices(); +builder.Services.AddSingleton<IGameDataService, GameDataService>(); + +var host = builder.Build(); + +var gameDataService = host.Services.GetRequiredService<IGameDataService>(); +await gameDataService.InitializeAsync(builder.HostEnvironment.BaseAddress); + +await host.RunAsync(); \ No newline at end of file diff --git a/TaikoWebUI/Properties/launchSettings.json b/TaikoWebUI/Properties/launchSettings.json new file mode 100644 index 0000000..bb34c40 --- /dev/null +++ b/TaikoWebUI/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:65283", + "sslPort": 44398 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Mudblazor.Template": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/TaikoWebUI/README.md b/TaikoWebUI/README.md new file mode 100644 index 0000000..5e0cfd1 --- /dev/null +++ b/TaikoWebUI/README.md @@ -0,0 +1,5 @@ +# Taiko Web UI + +This is the solution for the front end part. + +The front end is implemented with Blazor Webassembly (also in C#). \ No newline at end of file diff --git a/TaikoWebUI/Services/GameDataService.cs b/TaikoWebUI/Services/GameDataService.cs new file mode 100644 index 0000000..977fe54 --- /dev/null +++ b/TaikoWebUI/Services/GameDataService.cs @@ -0,0 +1,257 @@ +using System.Collections.Immutable; +using System.Net; +using System.Text.Json; +using ICSharpCode.SharpZipLib.GZip; +using Swan.Mapping; +using TaikoWebUI.Shared.Models; + +namespace TaikoWebUI.Services; + +public class GameDataService : IGameDataService +{ + private readonly string[] bodyTitles = new string[Constants.COSTUME_BODY_MAX]; + private readonly HttpClient client; + private readonly string[] faceTitles = new string[Constants.COSTUME_FACE_MAX]; + + private readonly string[] headTitles = new string[Constants.COSTUME_HEAD_MAX]; + private readonly string[] kigurumiMTitles = new string[Constants.COSTUME_KIGURUMI_MAX]; + + private readonly Dictionary<uint, MusicDetail> musicMap = new(); + private readonly string[] puchiTitles = new string[Constants.COSTUME_PUCHI_MAX]; + + private ImmutableDictionary<uint, DanData> danMap = ImmutableDictionary<uint, DanData>.Empty; + + private ImmutableHashSet<Title> titles = ImmutableHashSet<Title>.Empty; + + public GameDataService(HttpClient client) + { + this.client = client; + } + + public async Task InitializeAsync(string dataBaseUrl) + { + dataBaseUrl = dataBaseUrl.TrimEnd('/'); + var musicInfo = await GetData<MusicInfo>(dataBaseUrl, Constants.MUSIC_INFO_BASE_NAME); + var wordList = await GetData<WordList>(dataBaseUrl, Constants.WORD_LIST_BASE_NAME); + var musicOrder = await GetData<MusicOrder>(dataBaseUrl, Constants.MUSIC_ORDER_BASE_NAME); + var danData = await client.GetFromJsonAsync<List<DanData>>($"{dataBaseUrl}/data/dan_data.json"); + + danData.ThrowIfNull(); + danMap = danData.ToImmutableDictionary(data => data.DanId); + + // 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 async Task<T> GetData<T>(string dataBaseUrl, string fileBaseName) where T : notnull + { + T? data; + try + { + data = await client.GetFromJsonAsync<T>($"{dataBaseUrl}/data/{fileBaseName}.json"); + data.ThrowIfNull(); + return data; + } + catch (HttpRequestException e) + { + if (e.StatusCode != HttpStatusCode.NotFound) + { + throw; + } + await using var compressed = await client.GetStreamAsync($"{dataBaseUrl}/data/{fileBaseName}.bin"); + await using var gZipInputStream = new GZipInputStream(compressed); + using var decompressed = new MemoryStream(); + + // Decompress + await gZipInputStream.CopyToAsync(decompressed); + + // Reset stream for reading + decompressed.Position = 0; + data = await JsonSerializer.DeserializeAsync<T>(decompressed); + data.ThrowIfNull(); + return data; + } + } + + public string GetMusicNameBySongId(uint songId) + { + return musicMap.TryGetValue(songId, out var musicDetail) ? musicDetail.SongName : string.Empty; + } + + public string GetMusicArtistBySongId(uint songId) + { + return musicMap.TryGetValue(songId, out var musicDetail) ? musicDetail.ArtistName : string.Empty; + } + + public SongGenre GetMusicGenreBySongId(uint songId) + { + return musicMap.TryGetValue(songId, out var musicDetail) ? musicDetail.Genre : SongGenre.Variety; + } + + public int GetMusicIndexBySongId(uint songId) + { + return musicMap.TryGetValue(songId, out var musicDetail) ? musicDetail.Index : int.MaxValue; + } + + public DanData GetDanDataById(uint danId) + { + return danMap.GetValueOrDefault(danId, new DanData()); + } + + public int GetMusicStarLevel(uint songId, Difficulty difficulty) + { + var success = musicMap.TryGetValue(songId, out var musicDetail); + return difficulty switch + { + Difficulty.None => throw new ArgumentException("Difficulty cannot be none"), + Difficulty.Easy => success ? musicDetail!.StarEasy : 0, + Difficulty.Normal => success ? musicDetail!.StarNormal : 0, + Difficulty.Hard => success ? musicDetail!.StarHard : 0, + Difficulty.Oni => success ? musicDetail!.StarOni : 0, + Difficulty.UraOni => success ? musicDetail!.StarUra : 0, + _ => 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 ImmutableHashSet<Title> GetTitles() + { + return titles; + } + + private void InitializeTitles(ImmutableDictionary<string, WordListEntry> dict) + { + var set = ImmutableHashSet.CreateBuilder<Title>(); + for (var i = 1; i < Constants.PLAYER_TITLE_MAX; i++) + { + var key = $"syougou_{i}"; + + var titleWordlistItem = dict.GetValueOrDefault(key, new WordListEntry()); + + set.Add(new Title{ + TitleName = titleWordlistItem.JapaneseText, + TitleId = i + }); + } + + titles = set.ToImmutable(); + } + + private void InitializePuchiTitles(ImmutableDictionary<string, WordListEntry> 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<string, WordListEntry> 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<string, WordListEntry> 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<string, WordListEntry> 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<string, WordListEntry> 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<string, WordListEntry> dict, + MusicOrder musicOrder) + { + foreach (var music in musicInfo.Items) + { + var songNameKey = $"song_{music.Id}"; + var songArtistKey = $"song_sub_{music.Id}"; + + var musicName = dict.GetValueOrDefault(songNameKey, new WordListEntry()); + var musicArtist = dict.GetValueOrDefault(songArtistKey, new WordListEntry()); + + var musicSongId = music.SongId; + var musicDetail = music.CopyPropertiesToNew<MusicDetail>(); + musicDetail.SongName = musicName.JapaneseText; + musicDetail.ArtistName = musicArtist.JapaneseText; + + musicMap.TryAdd(musicSongId, musicDetail); + } + + for (var index = 0; index < musicOrder.Order.Count; index++) + { + var musicOrderEntry = musicOrder.Order[index]; + var songId = musicOrderEntry.SongId; + if (musicMap.ContainsKey(songId)) + { + musicMap[songId].Index = index; + } + } + } +} \ No newline at end of file diff --git a/TaikoWebUI/Services/IGameDataService.cs b/TaikoWebUI/Services/IGameDataService.cs new file mode 100644 index 0000000..b5a7310 --- /dev/null +++ b/TaikoWebUI/Services/IGameDataService.cs @@ -0,0 +1,29 @@ +using System.Collections.Immutable; +using TaikoWebUI.Shared.Models; + +namespace TaikoWebUI.Services; + +public interface IGameDataService +{ + public Task InitializeAsync(string dataBaseUrl); + + public string GetMusicNameBySongId(uint songId); + + public string GetMusicArtistBySongId(uint songId); + + public SongGenre GetMusicGenreBySongId(uint songId); + + public int GetMusicIndexBySongId(uint songId); + + 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 ImmutableHashSet<Title> 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..c795ffe --- /dev/null +++ b/TaikoWebUI/Shared/Constants.cs @@ -0,0 +1,16 @@ +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; + + public const string MUSIC_INFO_BASE_NAME = "musicinfo"; + public const string WORD_LIST_BASE_NAME = "wordlist"; + public const string MUSIC_ORDER_BASE_NAME = "music_order"; +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/MainLayout.razor b/TaikoWebUI/Shared/MainLayout.razor new file mode 100644 index 0000000..1f74ac1 --- /dev/null +++ b/TaikoWebUI/Shared/MainLayout.razor @@ -0,0 +1,36 @@ +@inherits LayoutComponentBase + +<MudThemeProvider/> +<MudDialogProvider/> +<MudSnackbarProvider/> + +<MudLayout> + <MudAppBar Elevation="0"> + <MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" OnClick="@((e) => DrawerToggle())"/> + </MudAppBar> + <MudDrawer @bind-Open="_drawerOpen" Elevation="1"> + <MudDrawerHeader> + <MudText Typo="Typo.h6">TaikoWebUI</MudText> + </MudDrawerHeader> + <NavMenu/> + </MudDrawer> + <MudMainContent> + <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="my-8"> + @Body + + <MudScrollToTop> + <MudFab Color="Color.Secondary" Icon="@Icons.Filled.ArrowCircleUp" /> + </MudScrollToTop> + </MudContainer> + </MudMainContent> +</MudLayout> + +@code { + bool _drawerOpen = true; + + void DrawerToggle() + { + _drawerOpen = !_drawerOpen; + } + +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/MusicDetail.cs b/TaikoWebUI/Shared/Models/MusicDetail.cs new file mode 100644 index 0000000..688a102 --- /dev/null +++ b/TaikoWebUI/Shared/Models/MusicDetail.cs @@ -0,0 +1,24 @@ +namespace TaikoWebUI.Shared.Models; + +public class MusicDetail +{ + public uint SongId { get; set; } + + public int Index { get; set; } + + public string SongName { get; set; } = string.Empty; + + public string ArtistName { get; set; } = string.Empty; + + public SongGenre Genre { get; set; } + + public int StarEasy { get; set; } + + public int StarNormal { get; set; } + + public int StarHard { get; set; } + + public int StarOni { get; set; } + + public int StarUra { get; set; } +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/MusicInfo.cs b/TaikoWebUI/Shared/Models/MusicInfo.cs new file mode 100644 index 0000000..3cedc11 --- /dev/null +++ b/TaikoWebUI/Shared/Models/MusicInfo.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoWebUI.Shared.Models; + +public class MusicInfo +{ + [JsonPropertyName("items")] + public List<MusicInfoEntry> Items { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/MusicInfoEntry.cs b/TaikoWebUI/Shared/Models/MusicInfoEntry.cs new file mode 100644 index 0000000..65f096d --- /dev/null +++ b/TaikoWebUI/Shared/Models/MusicInfoEntry.cs @@ -0,0 +1,30 @@ +using System.Text.Json.Serialization; + +namespace TaikoWebUI.Shared.Models; + +public class MusicInfoEntry +{ + [JsonPropertyName("id")] + public string Id { get; set; } = string.Empty; + + [JsonPropertyName("uniqueId")] + public uint SongId { get; set; } + + [JsonPropertyName("genreNo")] + public SongGenre Genre { get; set; } + + [JsonPropertyName("starEasy")] + public int StarEasy { get; set; } + + [JsonPropertyName("starNormal")] + public int StarNormal { get; set; } + + [JsonPropertyName("starHard")] + public int StarHard { get; set; } + + [JsonPropertyName("starMania")] + public int StarOni { get; set; } + + [JsonPropertyName("starUra")] + public int StarUra { get; set; } +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/MusicOrder.cs b/TaikoWebUI/Shared/Models/MusicOrder.cs new file mode 100644 index 0000000..1a8016c --- /dev/null +++ b/TaikoWebUI/Shared/Models/MusicOrder.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoWebUI.Shared.Models; + +public class MusicOrder +{ + [JsonPropertyName("items")] + public List<MusicOrderEntry> Order { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/MusicOrderEntry.cs b/TaikoWebUI/Shared/Models/MusicOrderEntry.cs new file mode 100644 index 0000000..0c3098a --- /dev/null +++ b/TaikoWebUI/Shared/Models/MusicOrderEntry.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoWebUI.Shared.Models; + +public class MusicOrderEntry +{ + [JsonPropertyName("uniqueId")] + public uint SongId { get; set; } +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/Title.cs b/TaikoWebUI/Shared/Models/Title.cs new file mode 100644 index 0000000..d6f68be --- /dev/null +++ b/TaikoWebUI/Shared/Models/Title.cs @@ -0,0 +1,23 @@ +namespace TaikoWebUI.Shared.Models; + +public class Title +{ + public int TitleId { get; set; } + + public string TitleName { get; init; } = string.Empty; + + public override bool Equals(object? obj) + { + if (obj is Title title) + { + return title.TitleName.Equals(TitleName); + } + + return false; + } + + public override int GetHashCode() + { + return TitleName.GetHashCode(); + } +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/WordList.cs b/TaikoWebUI/Shared/Models/WordList.cs new file mode 100644 index 0000000..ce837a9 --- /dev/null +++ b/TaikoWebUI/Shared/Models/WordList.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoWebUI.Shared.Models; + +public class WordList +{ + [JsonPropertyName("items")] + public List<WordListEntry> WordListEntries { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/Models/WordListEntry.cs b/TaikoWebUI/Shared/Models/WordListEntry.cs new file mode 100644 index 0000000..3fe7324 --- /dev/null +++ b/TaikoWebUI/Shared/Models/WordListEntry.cs @@ -0,0 +1,21 @@ +using System.Text.Json.Serialization; + +namespace TaikoWebUI.Shared.Models; + +public class WordListEntry +{ + [JsonPropertyName("key")] + public string Key { get; set; } = string.Empty; + + [JsonPropertyName("japaneseText")] + public string JapaneseText { get; set; } = string.Empty; + + [JsonPropertyName("englishUsText")] + public string EnglishUsText { get; set; } = string.Empty; + + [JsonPropertyName("chineseTText")] + public string ChineseTText { get; set; } = string.Empty; + + [JsonPropertyName("koreanText")] + public string KoreanText { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/TaikoWebUI/Shared/NavMenu.razor b/TaikoWebUI/Shared/NavMenu.razor new file mode 100644 index 0000000..47eff76 --- /dev/null +++ b/TaikoWebUI/Shared/NavMenu.razor @@ -0,0 +1,4 @@ +<MudNavMenu> + <MudNavLink Href="/" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Dashboard">Dashboard</MudNavLink> + <MudNavLink Href="/Cards" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.CreditCard">Cards</MudNavLink> +</MudNavMenu> \ No newline at end of file diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj new file mode 100644 index 0000000..b39c692 --- /dev/null +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -0,0 +1,51 @@ +<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> + + <PropertyGroup> + <TargetFramework>net6.0</TargetFramework> + <Nullable>enable</Nullable> + <ImplicitUsings>enable</ImplicitUsings> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Autocomplete.Clients" Version="1.1.0" /> + <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.9" /> + <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.9" PrivateAssets="all" /> + <PackageReference Include="MudBlazor" Version="6.0.15" /> + <PackageReference Include="SharpZipLib" Version="1.4.0" /> + <PackageReference Include="Swan.Core" Version="6.0.2-beta.90" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\SharedProject\SharedProject.csproj" /> + </ItemGroup> + + <ItemGroup> + <Content Update="wwwroot\data\musicinfo.bin"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Update="wwwroot\data\music_order.bin"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Update="wwwroot\data\wordlist.bin"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Update="wwwroot\data\music_attribute.bin"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Update="wwwroot\data\music_order.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Update="wwwroot\data\musicinfo.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Update="wwwroot\data\wordlist.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + </ItemGroup> + + <ItemGroup> + <Folder Include="wwwroot\data" /> + </ItemGroup> + + +</Project> \ No newline at end of file diff --git a/TaikoWebUI/TaikoWebUI.sln b/TaikoWebUI/TaikoWebUI.sln new file mode 100644 index 0000000..db9a9e0 --- /dev/null +++ b/TaikoWebUI/TaikoWebUI.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31717.71 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaikoWebUI", "TaikoWebUI.csproj", "{9A018EAA-0916-4719-B866-0AE17E279AD4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9A018EAA-0916-4719-B866-0AE17E279AD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A018EAA-0916-4719-B866-0AE17E279AD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A018EAA-0916-4719-B866-0AE17E279AD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A018EAA-0916-4719-B866-0AE17E279AD4}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8B394E62-3C53-4284-A4FA-21AD0FA9AEB8} + EndGlobalSection +EndGlobal \ No newline at end of file diff --git a/TaikoWebUI/_Imports.razor b/TaikoWebUI/_Imports.razor new file mode 100644 index 0000000..8814563 --- /dev/null +++ b/TaikoWebUI/_Imports.razor @@ -0,0 +1,17 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using MudBlazor +@using TaikoWebUI +@using TaikoWebUI.Shared +@using TaikoWebUI.Services +@using SharedProject.Models.Responses +@using SharedProject.Models +@using SharedProject.Models.Requests +@using SharedProject.Enums +@using Throw \ No newline at end of file diff --git a/TaikoWebUI/wwwroot/favicon.ico b/TaikoWebUI/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..12392236657563eb8cc764f235e66d568b3a0fbb GIT binary patch literal 15086 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 LZwKAW7$pA(W0EVf literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/ai_Lose.png b/TaikoWebUI/wwwroot/images/ai_Lose.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e4c0f52bc95a39d1b9f2c34e1243f3f5573a41 GIT binary patch literal 16298 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�o+=oG)^o1oO_{E8KfaJXsl_L}L|?wZ e+(l2lAdlu1&>{?AT>ZV9UO`4xx?0LC^nU<g8+S4Q literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/ai_Win.png b/TaikoWebUI/wwwroot/images/ai_Win.png new file mode 100644 index 0000000000000000000000000000000000000000..70bdad117a0ca58f72a816c9e1d06d7eb1a6875e GIT binary patch literal 15885 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%0D<qyLDk+gUu8)y+yhe$J|HmSOBV*+Zb43t) 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 bzhPMT2$2zzdkg*Duq`L8BvmD0^7VfJMs*I& literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/ai_crown_Clear.png b/TaikoWebUI/wwwroot/images/ai_crown_Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..76ff8cabdccace4003e233e29e9d6df2bacacb6a GIT binary patch literal 4582 zcmcIoc|25Y-=DFDC?#2<F;uu4W5yUWlQl!g79uJfGY69~GiFANeMxDtltM&gX-`G= z5K$sj6ctHXl0mki&@<ZJ=ktD^=YH>h-t#%vIoEa0_xk?6zvcY?ILGa6cS(vXh(jO{ zNlOc&1OKkKGFFN3uUFnYH|O8P7#6N92t?}P%7C8xOG*&}5pJe9?PKq=u_ln{{#pQ; z?geTE`!o1x2t?l~m;sRdKsL+^^r6rU;1gA~a2SPb0C&-~(Y9fjg1!`s5GLptV(UZ- z@gw2Ma3e#QelUSg;199^Sg=2p#v%k8z<=-(`16&=NI2{VgzaYlH(4<V+h=1BGo>>@ zn4T62LDJUNhUww8@FWrmLk73Q(AsD;Qd<X!!XQv60vby|;bFfHINuzT>`ibWn*TD! zUm3uC*=z;@i3|z~(hAbiqBDJvC_EmI)J7xGXapaDU~y<{AQ(Yoss3glf-Dk~!eCSA zG}sCw;6)E)8^HNefBN9h_(Mx${fZMmV#r{CfkbI(ulV#EXk+vDP=EhFXcpV-FyG2A zz5kJz<-}otNC%Kb4`h-+v%?^bt@_&-ne=BbBalh`;VGGf1gW4uAI9PfL;W$u@TIfq zEMNM6@#D|yKi)71rc4lE)0s|mI`wy^?0>Vs&^lT=Fm)FSjZ6<>X{;#vwE-joY|sF{ zk~M@j9)Z?zLSYFyI06QT(8dt7wSPiw_=P|Q*uXyn)5#QX&Od?L*bppfEH*$RftExA zIA4?&g+eCiVbC~!Jz)@_H$X<9wE0>9FC2)#dSSdk9Y7lo;B|iJ;_oNYNr5ZjTiO4! zZpm~KpW{!22q2D(!GUNHfkTt<2)qskK;ZD+ID{@1@X`alP*{?#?r%0bCWZg$0MvhH zT~S5mGm>;kSPWTL4*}=`Xaot5(OY2z5ZX90nS{c5VF5h=4kMEY-gKrvz^@aEKi~r* z88ja_?0?jl(y4T&4V}!7xz0*8^V#`cSWsB})Ny`&AC6$auNjpB`%!cRfV5KU25{0! zl0h>3*JH|mh~7Wb`I9!t7vz)vP4a)jSaff85WoaYeE5<6KZ^_b-^8<k!+$URpC$hP zQTng2l6(Q056JJFNcf5~$dwlJGbzabov$D7{;eJThVy&e%Jffn<uCs9XOPCHX7anQ zKyH{C1R~L3Ni=ctjpk->PC0jNsEg!<OQ<JCrJJxtfRS`f_3~&%wSJkaccfs?^2rdf zGqM|xINR(wo4PLA*<K)*vNhnm7h%A2x6OfgPx(059)`Vaw6yo>Q|AUh#JbiDW-SLy zgirVBy=%=u2U^-OS?><^xsKy`7g!UaR>b)`G1CWiI?hc-zK^&vnJ25YSPQ#!c9bD) z_K>@-^57>#g8i~Uj<vs7Rp|wPmG(+k&4T(;xkc4zN#hiaghDFBTyPjVoEenWR<d}{ znAmp6B(oB6y+dL2%A&Bkke2pIX~O>M3xUNL1;Jpcbnx3F>kOInvM*gO_h*GQqd0YY z`el*{id$drt?w17mP*b{d(_a9dO9<0V>%B!sMOw;)shw%m>TU`x1&xv$Cc>tE;Y@T z`=<8T-E*xAN3T*K;Y=2X-6%dKDwV%qZD(c0c_+sdVgt~usBNt5dS~a?k3*UzDHVz% zf-?~Pw;pNBuhwY^-VzQ0S8d*7Wj0p)DO<=MM_v^^Jq_(Hrzx>coCL?`zfcd9Nk!Fg zI5JZ5UV9R-vlYgV#Z%*sq2y;+uSun*@6S3cMVr+r!=O~*8VvVb9jw8+b6ZYX1#P?L z6ysdc0gZ$&IR065!_BM|UlP(zD{1O?KbkuD-o|kPRXyu$HMmb@sju`PpGYr<_f*w< zmC<SeZv|l2rGuPKnKgXT0v-1Ica!wTXZ4ysU^=^mhvsuc*P8fE5c+jY|599&BnQw- zb_%%TD0zoT;;~V+(AcvMwC~Y^8k$<pvBxAo)YXI^3Iz+OMK^>-2649M<E_`9&N5z& zBL{Hb-Ot>8Osaq$VVHK1mGE^eF9|}PoPEW5wk1uS*j)|8UJNUi))ZJR*r)4%G)bXx za!;O<3813e)pg^qzfv+r4@I>^mqooFnLoeNFSS)}Fj@NIc(!40Z{T8i_uYFn?xinZ zwd9@LDA7+y{6I)#Z7NqN@4Qh8VRlLCS@g_t9ZJKi^ly`oC-{w<+8H6hH>H+6rT)w= z8@&Zm-==<V*cu!}4ay7Jo%Uqzs7Oy=2Q0#UyoTrgiZ{NaZr1m*jPTC$-k;=dJ{2er znDHGlnmz@WuvXW|{kZ(izxcAlH94jDjc?j0tl^O9mQ=0T>=u`sQv>ZKkCdnLvJQ=E zc;^Q9AK%vb@Tz08$aEUQQ7^GHA|6#|Jd>T^21FSv2WN7>aW9!EUpl{j>*Ku}5A^qi ze&aGnKUzY(pJrYTn@CeH$QGaprxSv-!fmLbp<FkwT}dJ33ZtXJO9g3=k<5$jozBo> z0=1%rg6xT|lgAwkA#0Nw)6s`-9O$Vkd#e{wU51NLj=p1TS7Is-W{`slIxjJB+ut+x z&239*wj-f9qdh)m8e6P1pl=77Q+l5?94nZb1kU5aL%a!tbB~(?JZ{`zd-PVkK=j_- z!m4gEOr!O{{es4lH)83j%6L3BdTz)z17+G*RFua1{26?kZ>bznmsRW;9j0)yd6|r+ zEbO(qDQpf&gFMqY!J5_8jh?GHSXDhNI^6CPW@+geHZ|5W^Z42O;X$xv(X?G4vMix1 z$w<mL>B6Rn*^epE>CGMv^|8~#p<KaGo`~;5(w#Yn>#VT`d9ffDOEJ7bXbAWI-o1;Q zKK(Tdu@bVA{V~Fj)s+L{O&R)A{o}pMo2CREOEc<^Wnu#uJQ{?it~u~TTJ?3m;67X^ zR@89eq2KV#So1;0Lh`JzNWF1>0s}sk9qx{zyUXQ7nm`9Lv8dAW?o3|0u3x$i=kCKq zCBYdhWW+MZ+wjW~J)ftn_JuukR3Kt<8@=tshCaAW#E8nh`GsMF-SJ90n#MxM-#>jR zJdpkA1!u4~Xz%x!7)a7lp1}}GSndA99-K_5$TuOm&g(8nXBQ_%<845BDmVPAkZhg@ zpd#UNEB~Tpv4hCF)UtP}TUbNg;U)6H&-(p^5;Y5Cp*m)23*A$LxtUFgUC}O-xJ_5D z0?V!EH#K*!t4iF=%Qou06YC+np{EhA0WT)zE6i_-=Va*YS{>S&F31>oDCTW@L0$1> z5pV5~q}*EA;r!B6`NqagS8vXKwSDxVx+JXP`{OBONmF8Ol5YHCbiYvD?v}Kw%i;2^ zr!y41Pbt1K*EZrxetyMzcSJ1vr5X8N`~~8+b(XMml+@H*N$0xY?M?fO?hmOn>kUE1 z(85uC@@jW?DPuFr)z73cvsSANX8qYb_|!JlQ%+}73!#Q#69#<R;o(mW+e<ikmv#=^ zN#8(Ch_6m+OY}09Am@9)2Q&w{FC+_P7VZyjaPfHhGC>h~OGsHaP^@lr%kKHRHGSd5 z)o&-7v4Y#4xwRY-_k`AE4i4UOO;4s*uf8I*e2B7t{!*92VJKZr!I_0fZrp#uLg#B( z7sN@UpffwkXilx>Hr?a<Odm#%o?o%B=32p)LN~W7>WICUKLlj1y&*8*YojZ0nUX*X zC^>E`Tz~n)7Y5&(4~mge^P+?gzNVqPwk#`+f&;I5x52kXeb2G`A~pj$Di)UrVCBuP zg*}eSp~%HUKbw67rpN9JP<3J&Pch;x+=$P8lU@o@h1^@}c)LoP{KA)%xptCB5rqy3 z5Sd-Qzoc#8Kvwu|Z^nz8WnUjf9!kfHEbb?6RmdHvlPH{Xb|RjUpI<+;<YOJaHeF&Y zzY8jPF9pFx#v~41Uwxr3b;P<Hn-Lo|r^S1kkgN2lC_2vfW|zPtl$!)2=bn#Jw~43W zWHRTG_>gPNJ1;bb#|do>VvC+8dUS?CR==D6@+g13*z-iw+G_o>(n_}u7iNrMq-!xQ zq2?p>{sTp`k8G>}{EV|zT!+LYn(!$>E|*FzmxV?48z)^g*t-|I+0fHB8^ab%vr?k8 zZRTBBst%0S+Dzy)npiybRc10y<1+E1lPG49@nqHBUDrJ!rm!n`BcyMx!ZW7mt)U&? zoM9s+lwfYIsrzu_!omsXH{)wMNdnBR>IH2rFDGJ&qNMDeHR{`E2!69-n>>x&uB1|f z+lb|B^z)BN1q7HtIZedXiz4@*W07A=U%g+(4fj%ApDqZ+zI+klj7urfkGV6r)YWwW z<7qr!xu3SjaI2PqYHID4Q{@ZZ7F&C2gNh<O?&Xk}ug}&Y0)6T$MvTSlYOZOTCq8?1 zlr&x*OY#UeQ@e(&K9HhahS3#XoBuYE-q>Jk|18&Dy<<G04bN|P*EA!i1=%-R6RYk+ zQ%+ROw^DhDN`3S7UDu($w!V&Z+fTxQjv5ZPb`!GZMoVgCRmN~fcB<4TnySgbWyIgl ze_ag3D3l{sPkQFW9kwnmUXsRfhvq(u8f(tpEc#N5+NT_r3|AG}H`2O&!{quM6L%lP z21NPdT4()_vo*rHJEG#XgD3lMBVDT2Ds3#zezK!7ptO0SoqBP0U)Adj^R$L-N4>v$ z(n57RvJRi^Jnt&f<WCD4>3=|fJfJ7KdpgyVCgH{^73#O%`Ji1TU1ibhxf-o%+7_}- zzO5m!S4!zb{91Gy{A^<`(YjWtOsXKX{9M<vuyFeIna>?%6c0OA4W@8avb5^16IKPV zO-C8&BNfBX&sYx}X&_bxs%BZod>$Z3+2X9>r|WDA7|=o75mo8u$AxHUOErZ?vADGb z7MEYBtrOdMdKFIUQ>yHx)2me0!_U~*u#?Om1k?psRBEZ3C*1X^0Y=^o(tMu^AECOi ztgepx`Us4K(HiUH;5B&!V{`+nR4vBU{>pwm1-p9}-4CA>x~VbxqJuMh(e7>q{_#c& zb6U^l@WSG-9nL6j1QuIwLyY8p;RUfhx(8wY^6oLqozAhc=)l5bT`F0pA~$<_h6=js z`jo6UyI3^Uu|P`v^v!U|;hgd2LrIWhs8=D*EG5ovlgrq-=~D)kNAB8vw}k;uT*#IW z2(MWxt-JKyl9czL(GwHU?zeZPFTTtny_XqEQug5S_LP@geRJXAj-}?I8_OrV;*z;Z qd0I<;6IDkyA91eHSiBPV4QZf|_D0B?n!NHS#?s7|cx$I;%)bDsVa)vi literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/ai_crown_Dondaful.png b/TaikoWebUI/wwwroot/images/ai_crown_Dondaful.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3ab465aabf448f2c22cffdb007460ce345351d GIT binary patch literal 4577 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/ai_crown_Gold.png b/TaikoWebUI/wwwroot/images/ai_crown_Gold.png new file mode 100644 index 0000000000000000000000000000000000000000..babea41d3de7c9861f955a3572d37661cfb060ad GIT binary patch literal 4630 zcmcIoc{r49-=47y5wavvnFeJWGt3NT>>);xY>6ym76!AJ1tZI-q|K5-At@%y6MBk> zZ1s?(LLq||MMAbzw$wY?zW4Z!_kF(SpYJ}7>%Oo1zRv6XoxkP!{c)dkcCwR_P?i7y z08&_c8yCUTXl;mt1oxuBC%XlYb#(iKOaMUoueAY8*O68M07To!Zk{Yp$GsRljiQGm z&;p2hkrcWB4FH&0MAC8i5F!g4Knx^P%^)+i4G=JyU<NsWa)dk5t%*To`zQv{HOk2i z9~FW}6Cf7mVADv9fPg||;lPoUP%0A>X$JYuixJG%KEoj3?+{jq8N_PMAlTE<8Ej2s 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/ai_crown_None.png b/TaikoWebUI/wwwroot/images/ai_crown_None.png new file mode 100644 index 0000000000000000000000000000000000000000..915f186ffbc4eef7fc88978acb0dc827e178fdd1 GIT binary patch literal 3577 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 X6%E;Tsm&kgKh9Wd0{u#TKFIhtwv&=A literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/crown_Clear.png b/TaikoWebUI/wwwroot/images/crown_Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..26530d00285cdd52b56390748eebb3a5ff0ba8bd GIT binary patch literal 7739 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/crown_Dondaful.png b/TaikoWebUI/wwwroot/images/crown_Dondaful.png new file mode 100644 index 0000000000000000000000000000000000000000..b419bce65f334f85e306278cd299fe8c8b7c6c65 GIT binary patch literal 9571 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 Te1boJgHlt{R;+t$9r3>a>w_fB literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/crown_Gold.png b/TaikoWebUI/wwwroot/images/crown_Gold.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce1918d11f729ba8e347aa512ddfcb13b623188 GIT binary patch literal 8994 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 I%RPDaAFJk382|tP literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/crown_None.png b/TaikoWebUI/wwwroot/images/crown_None.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2950e8b6d18ee7241fe761939c6fec53794ff9 GIT binary patch literal 6865 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/dani_GoldFullComboClear.png b/TaikoWebUI/wwwroot/images/dani_GoldFullComboClear.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4eaa08032ff11a737c3cb9c7c4285515895758 GIT binary patch literal 64624 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 Tkq7nD00000NkvXXu0mjfy;dOt literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/dani_GoldNormalClear.png b/TaikoWebUI/wwwroot/images/dani_GoldNormalClear.png new file mode 100644 index 0000000000000000000000000000000000000000..63959cdc635acdf07b9b2ccf323d342def926052 GIT binary patch literal 59821 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 THqQ1800000NkvXXu0mjfmOYd7 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/dani_GoldPerfectClear.png b/TaikoWebUI/wwwroot/images/dani_GoldPerfectClear.png new file mode 100644 index 0000000000000000000000000000000000000000..86f319e50ccadd8da61734c274866c184f8a6323 GIT binary patch literal 63372 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 KMNUMnLSTZTq}UAr literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/dani_NotClear.png b/TaikoWebUI/wwwroot/images/dani_NotClear.png new file mode 100644 index 0000000000000000000000000000000000000000..2de8e779b94ec0e819280b859d31078e8e64141b GIT binary patch literal 11505 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 Snfr4n+1lJ5+F<IH_<sNgntAB} literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/dani_RedFullComboClear.png b/TaikoWebUI/wwwroot/images/dani_RedFullComboClear.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f5f67dda7ef3c985f1c83a1495e349a1497893 GIT binary patch literal 66372 zcmcG#byQr<wlCVaOK^903-0a^+`WND8V_#4f(Mu2PH@)%L4&(H1h?Q0ufMbR+3$`w z?z`{&^LmWcy?XVmS<~uQRkLPCs;kPOArm13001-vd1(y*0E!lJK_kLLp0rN<dW3u+ zIm_$20RZUz|6EWh%;>}b0NgN0OV3?TMOo0&$&t<6%E<!A=H=)Np#}hi#k`!&E$xBs z6c#`m5LkrjqNAIN0%RpZrTbBZL&aGNXbY0}aRqAnsA^gI*jox%QHhCC2zv=a7&rpm z%_+Pb9l&maULsWg#a9q=|IcG~DvJLiakm$tlK7`X3OyBd3MnU7AO#;AC#xj~2L}b8 z0GoiNr6rFQkcEPagNuuugPWa`hn164kc(H4Q-I>%FDgiPu2$B98q%`=?hNuxgv!?4 z-C2;G-P6;P&6AtW$<>CPQ$Rp~or8;=i;ERP!RqD>b~pE81-nuIHwS5;o24tr*&XBr zruc`WxrLL5y9gCT)PL#V==>kHV7GtU31TsJFLP&hPBxBzboy^X6_x)psiWh6sNLLU zK0|u>x4i#b#%@~P&OmkzpqrD2t0hq8GZ5@f{okEgS^lT3vxlq0e`#uE$qsY?Izq_Y zAcArJrz>Y$CwC_|Tc`gQJ^u6af3$HHlyU`{yF0mRIXOA}x2M$qn+pXOHybwvgDwbc z<>cwc_>V;YZUB@vcL$14{o^%O4gpq9E-g-o%lHL3d09Dl1UWeVMXCY`1S@lQ^ZyyK zlNHF?`+q{Jq9UjOc5^oeTLKlNMW`S`v4KEVg4UcLt*p&CtXcW_tjt+0fIL=^H(oAQ zE+8i#kkgXWii_9kzvP0nmv*xB_{V(zwEtJ!S~*!lc>Kpgf*&n-&3Vl~a<H0n2w1an zTk-I+n)C7TunKVT@^El+Sa6#23;Z`XHCGU1=$JeFuU!9;$_m1fpPSp-(wc{l)xt`E zla<Gs2f~8a+?v%=0BC8&0W{|^=i#TKu(A}ic5-zzhr|iU(cA{e?hLk}qWHh1k#cfy za#eA%g4mq<pJ;|~hiD-Wa)Y?e``_b36X^2qI|mTOe+8YOx#d5xE<$DbkCTBA?f>-{ z^uMv*|4hz*wfD3ILYV#^oc}K}Hz#X%PjgqGgbl>f|DVCd{{JStoB8Mev*`ab$N&E* z`oGO;X=@I)0YZ?Io$4QD*#Ci;e>sKy|LL#)`t5&#qyHv{VB9~q|3O#Cm;c~15Da1M z3PIlim;ea$zfvklOK5pzoo0Lbkqj&kbvG=k&8(L%rTStM5c4@?*!3(Ggl<SlG9ZZ* zCGo*xZQ#fU@x^MPhKH(4a)*WzK(~HUNnjpWl5bw?a6i`d+z_+A2Rqe_@Um`S+ElGB zFN1`hR}Z}RGY&rZ$>vUXB{j$2pF9`i=1vE~o}E}d#fTP89&)eL(1@PHLkI*jfiG1s zvH(QNP#3b5@6g4`zCqSXGtj$ELQ}1LzyR4?lPA<<QR*a;!A%8mKsr(~%x%!(!}laq z^%eU>4LU~!LXyteBb-R-9o$`a&MEjx=neQ@@m>>}+{n;e14!F9Uq)DEIHI7CPezlW z@pU54lI&2U!K{OuVg8-(+<<4;X`8&8O{rUk=?by|w0Zq%|CNK_v4my-EfyO<=Nlv0 z$`QBv6YO-UKUaY4<1n&h14HG-W8-9qQJz()H4Z;3fJ`dVpAJbB`%#qh29z6<`zaG1 zKo2zpRXWR8d|m2KmJF?^qnIate9@D{@R|%}9C~>sl=nydhxYwU3n2?83zg*h!-73R zu-db*9kfmXe;K{fZztW#K-uR6(X*tZ?gV8D!HAovCAn9U_gV4bm0S+RPbP?YqA<mi zhut}nJ=#4e3<<pfzvCYsT2J0<pDoGA0S&>NL9?#>4`Y8HqzcuZ@z2Gwt)bJPORtdB zwbTS#V@4G5`w)Ehe&?G2WKplV{Jivk1W>{bkr}{~sp(u7nNQFpA!RPy*ZN0jEFa2G zd6*bs>9lza7wFDiXkUDuTETn%=BuMc4?NBbKoLfFPe2>YJ<7eq_J>z2PVmoq`k{A* z5*E}DbOG4C*UW$$U{z5Hyg8AD=eKPf{ByY%Lvjx6=U`77O2bC<n&KIC?CoXXKUEG% zn1rPqb-JD9&606srzPgStFJCjOQ{fCsuQ9kP74DqPbtl|pI5%A7j-|&llD;ekQR-j zo(A1yc(q{M5Hh65lEX2~LoGt(A~4;%Een{=VB2VE@Xd^FWBbPlQ1mpGYYzfPg=meo zoP(^LMSJtbrTK9<6xOMJmw9TAn1pI+D^fn8OX@$4n-Hwm0xViZCKCBpz24V9Z+N$a zq?tICf{gDYs;;?4P2pcK)15lNQGvPBCQ~+fT15Wod2>NC_}Q9yUH-I$$o#hHWLC%h zT$~`uAZ(i=7q!{7jJEapK{)c?u>4_9-;FD$4R%SB6_Pou|9tEjKv$gk42DiGmdH3* zIMuKqCnJq4Auh-(nV!b8d@ERI(d#tiWwS4J@qUhgQ>3ec2|#!mp0UvEd`8WBlFtp+ z-~|=6n4v<;9{jdc<v9spd6s77r6dl;T!cZ>SlJwTy*9EYA=`@C4N(^3k$>&4zkwTv zL1%9roj2`l7IFmqk%o#>E_%<Tph=Rp;50FvP8sR4Hw^U@J5=#3L9{6f$qJCB6^)ky zpjLZu7qFSNZ3al~J0CUYFFGs=2^Nf*c1EO`ZVYH%f1a&p)TkAqRqr~OkAW@~gK^=) zhZcn?#e$3?4Xp?+VPQgkEX2FZ03-*gvkrrBXy%hQ=9AE@FpJ0g@5Tw*^zP&M_UYd4 zLA&v&>YvWFB30>InIx{iR76z{oi_%n7qITSFV{Psf@3dduu|RzuT+tyS}U`ieLIus z?mTjeO`e|0wQnjuNBx5NIk(`$Z)NdK{I^u!*xS*X&j;MNoJa(fllJuIxz9OXb{!5z z8(n;7%(5yB#SbEbZN{4KgyOh)@7C(b`8RxN2|r;1YD}q6!anshVipr*Bl}^%DLy-{ zorL@HUmjAJc9)SCMtD!HA?NWp1v=j&jMs<{E4IgKI@28<N7Y&yrtc{k>OFxadD$># z>&rW|WVmiMB}2c+ipZX;PsywwatWhnxCHw8CZ=4t8z5_@iP@f8j5f<xU%4%q^0mi& z=o?M{SZFX8%Vv4i5AY})`AxMR2X%B^;vv%6=!JkWzW%E>ZFNb_s(I6>?wL4a)qsom zk`Oo*NX-Bjd{KDApD*lvhroba;7@jM->uch$o(bD%N?%0nvvrw4sZ|PsmaGyyesS8 zKTb!I^$9iZ=+J9?fJv=d8~@I{qWAV0fBOz+DB)O*;n3nLl*>ikm~dVjJQ&MZ`YtX8 zKpUDbQ~pe<o(dPAU^Zf|!JWL<>#ARLeMF=(p55qh2yZr=XbkAQ8e!uFpYFewRCn%@ zBDdS}SBIBtN)`kt$~V;k7@!WrTU%T#+23Cd(BGa8byBO2f9uLHS~+bR_F$+Rxf1{n zZZh=JBHq4>Ga~vCKj4j+s#88mf0>Dq8g2VismLZWtF9sRvPB$vPFmJV6~Z&Vlf$qq zMYSPeZ_juA_KL1D-hmiF?XY1y@h2p!(o5`@QVp1PEoZCsh>|Xr-DWKK<6JCL;kKT3 zNwq-bxcID39qrP@+0Ty-XeyXkyx)2y2EXCV6Uu<>&P#w&e6gdwEXFHLhP-z(tt>Iw zk`nksq?)vG{Edm~?qenEbD$>(ts_D-SRe&;&pzFr-;l}fbFejLn3U!hCy)uTEl z-Bkq+yWx`KV8{UQY3c8MCK_yQUB6z9{oaa@s~;@T5YYH=X7&(*Y`zKtq&09UW4k54 z$j>|sYBYnFWvR9;dx8Mi^ynp(V<G#OhB~uY4tm`w+kMP4O+upzKdHHp(9M$_ze#=B zC`PY!7K8`&x`K(szJrKBb6Ba}y{S51D?djEm8`Ve>#|?`oE?Ecn|`fxgoDw7B7au- zL^-jsYM;yeSmv@?mhXbNCE}@Ild@m>Yg+8ua}VBftC5S^=hDy1Cpd8BFs;N7v?C34 zJ)-s-?@5Q<P|0AKNPGYMc+%vO*!#;{l!~^)F{Y*`T1m_@giZMY(BVSb_|<euJCsJy zsm{pRoZON;KG!QTDd<@q#a!Fu`)B$6#6acj6Jv_PAFRDIe))u1--eAdjJ_es_kPw} z{^2LYXBD@3r}C<EkaG0K!{!Kl>#btZYt@`EZKW=pQ=b}uJ3uQimrdb6h*`M_lLosu zy+v0EU&fPORX;bMqA+Bjf#JKLSfGWAppLt9-jXC3VaFtv-%l&}?-GJF`abNfIeW*Z zdlylfr>ce53&P1p)=m?Rj#doeFvyRlvSQN|L9zAH(ITEGr75rCLLHJKvLbQ8&pZU7 ztVXQiENWP!^90z3msx*_MN%eulo<9Af6Gr5cr(C||IW3f3#;wJPh#`dOUj~Gt1Wu< zurN20j|ss7Hqk&;)-+?T&?h9^=4ZzW&++w_<9K54n+qYt7WzB9WMu<bBlJe1gR`>W z=NjCjH%*A#!jmTF1-V?nFIil`0s`UIRLeL4VI`o&Of-9!D*xI<6z)Z>*X7CcjEVQ{ zK}G9n7SpG|TD3^A{9POhiMaWO9A!({S@3V1?a*6;wHaTSEFR0Qle0WeY9QYsXrS6z zo~tz#2T?%$0f(NBgaVb>X`I6r2mbJoj-Xh%F1GzT7`u6MDF7dahM4}V$^o#YgA3=) z?Y%1&4#jg=?f{IfGaG)1@c6j!k(&Ra(x9)hHykZ|M;J2f?lv9G?)<+aMLZXI))(p# z0LPttXulF<Kh~`2-sd7JQYLfm7D0R0i#npA$+=Aklzv5F;}20UOD7ZNV>NjpdVd&l zgFuR5eVt43t;U8+*Pk)P06#~uaMbetBX{vbH{=*AXn7)vLY87&zGSVy;$N5Yq$Gn` z^M$gGysE=~`biy>Z3tE!(3Ivu+1l}}om<W!Iwfp~?1*W<pa?I%(xHvog-Bsp<Dadm zicU?}Ma3U3*c0i;%W<O>DYX20GR%BpPtu&5J?kUr(8{*X+{<31RTFJXIoQAWbKdR1 zgQ6Pgx#;gvRz`fJ)*{C@icmzehIeqc>GZAPVlz{X(d1NwTj<6qS$=UOuny^0AQgiM zdX^!Ln%#n_$GnW+eTQyzd;5pyrVlDAtZTj(n}1H1F{Y-cY28=rZ|Y`8THl-VQHhI! zxnZ>rf&#PJZU2e21$-u;ies0b!c^ssE)SZb4?fLj3D*v2>LeZ<3M4*T+^wr%9WdZq zHn%)cg_U)tj4)3y9Zd2SRKjb`aHPWMEC*B{EKdF#GIP2F9Y+Sh+_<0X{TP%tf}|RG z^9ujly>aki_9t=ceOK&E?X=`9kIPP_U6=PfhiaB~_JkAJ;IVP5$S*W8`_zW_c3k2V zWW_w3?X)D`E;QnhThoTzb1}5!bLnMr+-%s}TkOZ#TySAmz>a7HB9m<3%dY9e`o-JW zO4A8sLS+JXQuTArc5V>?@{=g|H6yLc7j6@GzK+$jH+E_5k6L$XWoijh1X<D3@Jcnp zB|1ipx}+;zvN>yoG(cy~Q^eGCTXXZPGLEPWv|h5Mo6$Jz7%P&5IGBxi7#qx7CoIcl zl*>;ZbSW6jgyF`pkXXZ~SrHm0682bq8GDiGXgkTld;BBjStO{*H#3RR#r-9^n}fq& zZ3fJ_G5m4UKJnTV{kwuc6m3J2XCceG#Bd=V;j0*N)?1P|2yX<52<K?As%3+sru%JW z?lA&Qai7HJybWI<;E#wcx_Qtv(x6AktOArK3z{Ss$cS&>BFeYk6?Yvu)MryWuPB3J zN5hBw0@E2Cz*;sleo|sGVlJc>8%~<cvX-b!M5r>*rmdT-<Y@&*ht^bNTS~JWWX<~< zn(MRb@DHB^I(nO!__<-&8>>50)*QyfWpQguCHnX028@T3&1Qh&z+(5{coiS%?*aTd z$zHtXiKRQP_dSk9zZwPJrkis#hG2vIXRMKBqcPh?AlHk{Oet>iY3>r!7MfX+3-}^! z=0hm-SjM%I%XwSrO*vP`A&?LAGe4K;UYLaH1(&;sYR}S^A{QF(LU(zMKTiWHYkq&D zEsFF;!~;UcVs^?FAzZbAGyL$*OI21v3}b?dflg&3|8It=iZ{Ctg;mx<YYZ~UNG#|c zh`Tk7)m<58R+S@2Xhrj?3VNrRS5-Z@pWKyBjthCj7h#!E(m;E{+~OlRyJMUPMOqbh z8YP_sm8P5HFc=P7e4b9JB^I6F<lGArA!Q?v@&VWh>wEWAC&SiP3`46{>Kd-jDc_~Y z74)W<#^s>-zgJ>$Z<^vqiwto23i=I#ILLo{QR2ToJ-s|Rxq%k@lh45eZ8Q$1lH=Cf z4qp;S_qZlVsj^#ouv#{%dU|jMDn}f#KtB_$qi{cXsJVZ1?@rm^Kbh<K0DaH#caD)% z``9v58aYzl1*J%!7$*V`ei=malcIfi%PNb(A3I>cUjYNzO8B_o$P@`-i>tQJPg-aF zQ`T4t2TW}x9Xf3W>{4q{@}V^#z6~<eRgZnB(9{XHtftrZ0CeWh$YHAmYkzl}T<>!E ze&C@{9@FbOpQsdOcsOXITaLl1uzmnPct>XmIbjHtE%_3_cgYi_!)BNuz7-ydK_$x; zEEzHbgJ)3Kg{g>$;wJRddFXPJ6RkAp$#hMBO{fCvNTPu&Kl?2}-(1_W5GjjikNOX; zx7-C?1hXL+K!T2tSps}!X`uUERwq{l;E3d>xf4Gao$82+!C&Qre?edpS4_zmMw6F1 z#iA>vZWrGy#M!FvD`;@}@;A6pGSa`d;!V)uyOCy1a2u2^QJ$4a%a_k%fI=GmW~JUi z&f8@gakbKng;PeC8M^Ad`N@o+Wb$<Rl>u&#Dv&Wo_tUG7_o69pF_F;864QC7Baa8Q z|IrKHw@iq-X{PtV4i{q#4LFz8q^(Fz->{`J(DZaA-z@)8{9I~yU1#KQG23%va9-Cm zxq*U_w!Qkh8I5Hf|Fo@ErBPcZtrC%blif#RKJa+E%~YO2I4a@qbWRWD3@-HCNhSRZ z^4!Vjp<P~d4D<+?2x>HS@#a8EkrIBK42qAFW7^FRs)v4L?VHL6o~aU#+gl>)k#=<Q z8F|#RMp!{OAEYf%Xqu&5>G{zvRURZN;N<{+gLR5WW*pp%lB|}{4y~VKd1m7j266al zRWSM9SNdB}jj;tLo~gQ)b=JqUhm9&6b;Q&K1d2&|v;fJ<b`EQOXncGPTLTMPE4QZP zBalmxVQXwBt9KhV&F>lJaq>X(@wvdQ9q9o@@sX6e%Kj-HszgnQAr^i?J&&B*nq;Ct zM$M{d*+V)~`irw3A%^JN!|dAURq~}yZ{J)Z_x=yJB>p!%ar^~2D=Pt7+F<}hSf;<v z^Gv$lZBG?@je~P3i7S7ScZBji*xdO_d{2%s_T;3zMKYRsQ`2NG6hfp=NxwS5Cx5|X z1;jBq-)IJg)xizmU})lPeHNk=Vvqr7p2n26A<q^F(T+$M+*@gT9cX<0u4SvZlCr8d zDBhB_Dz0E4!3erxPk?9C#NujWWX-|L2F~<|X@)jCt7}*@{3iEvU|tNk@E1f~pWX^4 z3%D%&<hR|JIR-vF_7=IlSoeEeJwf!OJ&iiIxY$eT(T&|a)9V(`cy<&`xd9;*UqFeK zii`1rjYg*On+QQV>c?lXQ|s$}y<s(1edHT#-@o&zmvw3!rdy&P>_ktR|NbTc8-g1u zDKRqo3JVPdcnM(7EZGCllTw|SO@<)HC|}(~^hB!jjyp7kQBNskzyxu@$XABzVIQ7t z9o86S^4le|YRF#1;Ok&p9s5+~kxIZ_d}Rj55y(@|d~16)&5Q!W_-W)7Eu){{;jA8K z9m15-P|oHIw_}0u*DFhK;iroFg<#yJX8=|(=_D>(B90@y2t_@1YW6XPZ#9uZ=Nnme z{(aMw-Up5z1>jK1nIq7eE%<2fn0R6Mv8K^7UxUB28|EG56uw=-P5Cb)0-f9?ORhW@ z`AY65W+wsi9on?4AsPJa@5Qs6xGTutd@{HXD64<o$u2LXW)eKZDnf?F_ED*++3p~# z*H3ULrfnt#Q7mOK_%NSGI#tsjYMA5HTkj`L_1j2U{U#(|q{Uk?O$CogLwQH$E|T9f z#0~E!7h=<ib;;8Wjke8m4w)CfPANb|#6Uat(0wD8IEP-Ynh6``Y?}!R#r+mj9AF+U z+Yq7HK$gm5-fg|t+BkN@BHjQ74Hp;IFRKB|s>j@B&lQOdWZRPm^;QWpNN8Z?BR4Bt zdMoX$Npb)DY!Y!;#sjVoB4UiKBSCY%PMHz?4pQ&=MSC#!)mH0D(Q@R{nDN?)#hL1_ z+KdUjawuEfbguFfkE`PT*!L(dm>}WTrP^&Y2oNOJd5&w@eh+eAbqxH&*WFf8bLu8h ze-dLoA)GiF_=buu?2NOw7XXiXD5tMa7|@L$(HA`1)xx>}{qsU1qs?P-%Sc&>?pleR zh1or?m1aB_uUnZksZTgw|D10m1<8#5&`_eez+JI~GyzV%vcjG*sP>KbS3hj2k(q@U zD#i5aRziG?C)?h;{G^-SzzPX6*qn_j{QxP)=NKm7{ka&G%xEGQA=zz4L8`0<qX?fw znRC4UC(UZTVQd9>TE^H@6Wep`r@+VVWBL^Ci>?sqcOu+MiA4_{7%^+H#w2^Nk<%AN z%KC{#>$#Ha?4n!c+~brsHD-pkPs9XHyfgJrE_ciH*ZtV{L^ek@g(rgT=)QN2mp8MM zZUeZRueGZv6!!MdZhI;CTrN9$@EFy&zs!O%GZnx50%Y!gLsvTG0Uji)kG>Or=1s*F zsL-?6B&KIs>o}D`%aG}xrTVr8{bW7WQp(yjKF>2A2~8s2n$k+gk`>F-^V|Is6?Az4 zaT<7koR7E8-qW*P)NL0WwMOFWE=blFlM!KU!nW_WTKzTc(+ma7@)K_~Ya(upa#&01 zR<R8E-)=tky@9lr;wVzi&MeD#vYy3iLdn-;^|w3PTL<TQz|zY=mC^OjkM*FRD-0ya z{N8?d1lB4TKeiR<G_LRC1XdsKCi(7esh4A1O<J=WSv8X#JdtvdpLo6`KDOmVxNg7; zJaO7gu(!Qjp~P~3j2utlWrQR5tBs?M7iKNqdi%!sad<-TghurJaaM+d!0h2K<=mW> zhK>&1I+%}+qd10L<({&f)<JW~TwkCby!0_x5gWvY6tl@G4~F$G#2Q6a`=)_t3EVK+ z@Jv`KV_su2&df^uC7@tK^v&4<tgByJ8@a32Zc}6IJ*P&h!tlrDR3c;`of8JKsUM|G zIyv0j%*|LuS0oIwf;x-AZIu>OSqZSW?&2q2JlhX+3W)9&UCNs73eR|LeQSr2?i&jj zkYF6zXm$4e!rXP;mGxX>T)ql^eRHmUKi)!BhfaTYB|h+X%trMr5@jpSL^TS9E+NCA z@Mj7>nuS-So4k;e!9XH9(tllQcBE};Dj}moQ@r%bYHn5ycs*Hu*?fN;4p@zlA#^&L zE5{y4>wfW;jVGJ<yDe4r19><q%2nBHq!uyl15DOwkCpdwXbzHAiC0MkW!;CwaSFa- z;yh4M!J-{eubrjUmqf(GoJn|o^Pq&r!<bNzbVkWQG<SA+F|>YW5xv*t-i^}xNCmlk z&|vWiVnoL@5341N8^fQpTTMAm`+e9?x_m+5;UP$24&o_X(Y0Ti>qb(WZk%A~%(;=i zA@Npkj=yhouECbhUE8NG$FBwm$|{S{r2ilki6BU`>|^V3?B4v1*1}VYRsE#F+TcW% zDiC-}6YF&EJg!1)wYw^!-p-$fkuIuD2a_wS?wXgpy2^4y_?j;4Ej*gmZKl9!<!?-n z7d^ePq2m9FM9cb&VEjeu3wlWe&ixc#TIXzvnRbM#VW(9b1$7~&BxDT&g`FObPD*2M z_k$yN_-KyBzyYb<Bc$5HK1y58B1dV8PvTSsPM*uI%$dc9nRT3&G8CGY6<{DX1z#AB zKeef&c#aC-;-^3HUJz|&TJ^Rz5@7TrJm|Iff{E_gu>b1FVsL{_&QsBSV))q_&E0q% zKx7?jGgGv^^W{2@N(;DPei(SA?_lVdsO+M*<e0K!7p6?N)S91d7&y&fvpJjiV|5Q} zXQT#oH<dh=62~1FlK5JCR_uFHC2|#QYN(_cJ)@>Za)8e+Dx9j`^T1C~;kF$|Gi2JS z!`rn!i%+U4#3VUM?579`BWT5irfW>aw43=g{q0fHH{rmy>zalc>_}J<kq@aX`b=tq zN6`yP0z=!LyM9JOV}%<MN^IQM;U?ML7hf-1#$DQYjGS?KZ60rLcOS1H#s<uq{it9@ zf@gN-&uTSVz&9>vE=*6IPE6L7XAC0qAoIsAP)g}t`4b)rSZyZA8g#b%m=_B>B#s&0 z7IX^TM%;9a_o>HnFUFYwU;{@Jake)1QU8|`ftj^|tKm4zX@zx02^Kkz)9&Lz+ST)> zn2g&sFIFT=2ibAy!Y5PHA%O!DMr$%Yp508@c-EH3YJ;=n%B(~eFhRpHjo0g~%FE=v z?&ZE=6%7_L?6GW`%K<rEH2kbmnSu`#H?*<tj*;A#U3M=+-fFE5_+$Fi%fA;V((8y$ z;dMY?n?$F#vas$qYKIF~N@N&QD4jfUCPg0@U~cEMKgkV<6N$t0nE8`6fF5teZ$UqI zcgZsTx1t(NqBIrf{+RbyzD=W?iWi)WAXuyAyNnDewqM(n^t!0`QAhKtbswqpH<PX{ zld+SV!Rrd1o){qri#yJ?twwA-Dt$*h_fz^NI@{_6xabt%Lw~GqYcM}2CGR&WyJQ)g ztAc2hne7@FFj@zLeChayn9jc<{$|bVMsX$m%{xN}qm##}yW>CsM4)D-$QXUrr^+3N zrLYIG`)lc>a5}C88~L6ct+~&Jk%;(zA>jMmT85g^;9<y|ARkk;Y5+1?>4(8!+41ZS z3`Qfq!;BmpXsrvu)VE9F2LT#)zSsQ)`VeyP^CO`WY7FYKk^X888PV^eQnokDT4?6S z5N?bl6|z(oE70)zIe3!HMN3h9IzhpB>BCdq>72Jz$E>>hgRS}e>vd032PmBkC*-ME zOx`4ZFawR!fLB(pt>n)GG})H=mT3`CPyXWeQQA#87f;;|U=3qh8f2WPuxR4TxI0Li zo=|ck7%822eonSOkv-ILQC(*;!B8_o>-F-jeyk#uL|+sTYL>kDOGawl!ly~I@?5e0 zV<KbSp8ZKU+IL1~=A>U{VUVG|>p~1j>5Eg~M;)jSTI#@jgF9UP{Q$6|B2Fgh>oLa2 zfp<pzw3TdxGVCc)4cmtB)e1TeSFe(SN*OTC639vc#6971SBK{Z1}FZ^8G9-kZ#26p zGbm9bpL{$ZW$p@mh1;3aq>uhYZ7<{7x(X=gS4wOC`>@u68e}(c;t}<!P<hm@LLeTj z(D1Gu(O48ujK7tL5`jp$m9lsTm}>3Jrhlu;c0tho`ic5wS={PN@_bfLo+j}RX~$Tp zF+)r`tQ28UCk%QrY)qKvHm-BA>jzBM?@zGGDLt1AW?cG`^29m;7H8?AM|nJ0xZhv# zdl-~_B-Eddb=j@^zbfOIFt%a4fBt-3Dz-j!cP3Po#yuj$vh^pC^8B=-<RKL%S(#|h z(|He(?*plcqY9MFuRC5oCo{<IZ4I2}%+KQ|O3s!xyTopTKv&4W4ST@xm#nJmFp{+> zXxMx^ISV29LfTmkW(Yu=Lz^by7i|804zz?Mz@l_t?M}MXMpZGMm=aR|B?FR-PDCF8 zMh>@SSR*voyDjl5thUt>vS1Kt{kl2YZM}-Z9%$+EZci6%(m8Cmx;?Ivrg9-l1OEv| z*!+{<{d1t%@oX-(`a`}tA!v(}5lvbLtYB@lc<G&QZXM`yJPb2%g=^jnj%KJnN??^P z6hs@+0g7@6$uIAW&BxzstZrsQm&oOSu<6N2Dd3a`Uu}3{1)R&G=?~I6EgYa{Q5Y^+ z$)N)a4wHUp{($a^T=7FJt`P;)+D>Cz494_vbJ1WS`S=!|Zmf?y9+;|F?nZTnk?Nl9 zgn{r>85eb$Nchd2CTE3q{D3m?w$V11fA2c>T3rxaM;IIWA)j2I9Z01j&<iTZlw@QC zG>}Q+s5UW{QKlF34nR`|zdoV~bE8!=6`UquIsHiC*X*1{oko6E)M2>R(u_JO+1D{J z=tZph0*A6t@-&CH0J2l8X{`!yN?NL~qHc;E>{?Wx<;qQ~rvC8*S~;t%OQ=v5JtYKw z0TWr<dC7dYys8Sv!$WH3QS(Blmw{b2Ji!W@Lej<tL+xc(d;itGE$g}8kkFC;K5N*> zV?Lq4e1SmgMNqTUilKdce0nA^HQ!Cq><OxSJK|z^HDErO>G>~+lJjDExSV4@6Fkdj zz5KEKBs$IAc^`N&yOEKc9~6R5MnZi|pUg;_1k}EGqhD?PgYf+bh84OC=2YS+J+TNE zl-tV6m@BQ`PKH}LUcYZZ#4tY}yR~5GG<MWK4qI&8argIe(o_>Oc~F;M&qYhd`mD|1 z8+p10`+8Iy4VqFrqD}Q2Fc_<cv2?7UD<F~oVT%)$nD?th$P+eV^6u@EwmMYLwlf2{ zSXdU2ZjqTIQRLWj2RPMIRD%yyJXp+W!0SFWw>B{Y6atQhlM$trh|vC7s<WXtUtiQk zX4oUb5c)WlDQmorIY=t3F*lF4-H(j{gJtV8rU&2&V%&Ql!SrZE+;+x@7k(1F-{{ce zWi!rYYN)ObCx6)@a5+jtr~C<xFQ?yaXf#{|7=>kaqpml&ax%i(M@eJhe)WkK4@+vh zSF>8+)TRx=>bdgl$nbva;95(dfm5~=0fCitW$W+72+vVC6t>8F)YN<CK&Wx7_5JiA zq6&HLxFd=kY(q^2dG04wd{GrOT?|e%SlG#*&)3G;10UtACj-jNf>AJ757L=tzt+kt z)&FALEw)3Y@87O*ABOgn4|;pGPv>>S;<i!6heV~t?{843gj|^MLuoVI0whGLrL*5A zTq8f@&3KC6=*xGdW}G|gIi&DpW+si9wnEM-T1FpHT7WVsO`6)jhvv%r0El6JG0o1L zzsxfD-4o+mEv=ZwZ7ONN%k>eghK3+VHMckwmG8?<_VEC{PA{23FPuEBQk${#vCt4X z=aJzEmmQ?rtvO0_$3SWQTEnt(5Nr3-t>okH!coKs-)SC|n+wyysur@zVpAfy75gB# zpjsDY#%^7~qaG-iiH_P&6Q+$q^IfZf8bkM8ndOQMu!?!^T0?;#736e05p{aH_>X+o znI=e9ra{9blR`ny!Nz4Oopc<GZ8zAGxv=V)NNYh?b=mP(&DUexYCHJdt&tYf@|Ah+ zoBn~jsfKUr9Pcqq^w$_o7eCmiGL^SRyvmD`cg|xutNlB4_kW``r`48}$dY(yiInCB z2t%fL4MQRE)U=A9t^wU@{Mo8U?t;$zB$BhzWV#Fxn@YaW%6Ar}KC<TBWM6dkIR(5+ zm|)tb3nV{1ZI5LNXoO0d9G9XiM!JFOv+eW8jy>3Q))PwFxUWl3({bdhjk=USf4=*> z=B9Lbdb+)SzrYzN5&n?E8L;q{>m?~dpT(cipeh!#-G{oX&+1T7^YPaH&ba0(DOYrK zBHPYz?BNpT;mpaJYd4*e7d-5fK3IuYHzH};WhZbik`5oO)Wz{lY(0P?Aa`1I-P#Ov zP=tj<w0YhPNTS0NaRwv}J#mR6ZS7n*?gy8iy^d0yT)(0-C2JDEDVLzl(!-~VvZ=ck z@Xo!V!YTUC5JFk>f2DlcWA}6(<COb@hKH1Hs6->qzxFFfq^i=O$so&fLpzKgzsI7~ zs(Z?F0x3veNzmI{t^N=F#l5e<%U>V1&c7@IUe2s3DH2RfBS>LipeYEnjPe)1KPDc) zF)pKB%H(wiS2F^SSoyjqYXa{@*F}&<UR2|RN>VN3Ne7D*U<A(j-2yYy#^!mSohrE2 zfDVTq#S<QDvK?ceS9Dj#Qs~C77GJW-syxQWD-F7`4)7|!#l~JtEj?6wGag(M3w>tL zHT6fP&vnQ2@PL`Yzo})l;k(~_7vx*Jffn-ooFq?U)i?HG?J)vddi_wblA@$6Vy>f- zn2Mz6G`c9XTeLQk-SoNHJESt#=og9`eYE<NLbzH<5zU_RgdG$cE%WAy#UTD7*10?b z>FldVLBJPsi;NQ4v{y5fz<`;J!Ol4}BbZKUpIjr13}$z7W`B}AEd)P&pqrMRkVY#e zGTg(FS~oo;#WY$T?Y${sSwl=QE&@iu>+Fr?+lbocE4O{Mk3-@ZsR3Fa3mw4rDEVUX zupF&?r)S3y^+Ki3@nVr9;Y?Xsfuh1eRyQ_A3Yt6^*wcVdQ!T}29B#0)NrWF>q<rIP zUkENCHlvK8bwkjTphXj;BghbKKU>V+at{JOoXe&pp(%p7RFEnIDGlxSD9*BBD!)e` zO!(&vM4Rr;<EPc`WOo+CIHZ5fft*b$8~uHxMuI!tDQ6t$Z+m~+TYI^Nt1oXu3#zC| zAFFCn#>)SO`{1iSCX;;E%z#zS(!rWX<DUIYwqgOD1d9ll-O1ruUzTgjQXpS$CVtF2 zG5iocF>>#demT&{aKE5wDZMWKTp*V?8c_R_y=N}!ilvqePT7U4N<mELi9rH{=ls!* z<7ovQ$r%El&hy&%A5h^PPdiu}^6TYk5^1npe0-=}Cv$WHZYw(4p3f27QgU0~z8?#} zT-Z9<EsIfGmTy@p<Tkb@d3HQi>M94jLZ<WvYtnJ=gKVmBG-62xoV?1hh{=P#liQ*m zg;^3tG1cWQD?*M}7<m@>SAP@+{j<2rtv~g}hJcZy-L?ZAz}9EOMTQ<)KU9*n+-U?< zZVf-ZV3q_5AV+5N4LoLJql4Ak3qGN+7X@I5L?og9N_j$^uh-dWr7<?}&5bkq{S{SB z^x9<N5+&@#$oWmH`g!8A0PHSCJs*?k2<AN6X*TVgIP3N^4)6OUNy+DSE-ahn+gwh6 zqHwUdyLK6Yfe2@8^aO`HEv=x-gd7E>eDoBeiYFqVpiE|(gQUnC?WFy!9yRybff<sw z_z7E<yJfR&DjOBWbyB2zee|tip>F3j@iaY=!Ty3-9WXCLlp*%n?1@4AXtYco)wh@% zy7l-+^dFB!<CGa<1xD8|8rFayngn^}ySuxqKS`5+D@@l_+}xCMk1+(ye{Jt6vowJ9 zaQzYJMqk>1j-li=tjmCjA{Hbr0#pv*2<(LLH4W$IQz$M>hSGw9EQlD}_s>PEXM?*g zNGfhcI_IvuziD3m<+~7`h+vXu3YP1ELPzIu4Yv6^Y^Hu7Y5+OU1*BN$?zG^Pv+T6V zp2%`A#^Udm0X*9A<TpyGvI^pfbWUpitKZaaYYAr0ciAr|rtE)D8&LFHog*u2$kiCM zB#hTN;smTa3HYkx@}-^$_aL=?t88Sxev}P1la{x~D&9KR=sQpE0-t!sh$IGiv5j5k zRmL6H{`TSTt<k6CpS9V<|5-3Z$Mq=8){{V@i8fgoAnkVCm*XSpp-lS1s4l5UM11f3 z(#BjwI3tAP8YQEqY;pAqC?l?5aqg7$+OlrsmUKK+R3}=uqj2K$4Z1knH!;iWF<c{P z_=RZ$;U&Rg;C|>h`lt`Om^-*3xFM(>>v&iML=?CGbW$@;9M)fyt}?iA3ww4(%ERZh zbz<7Bz-D;&+4PxFO7&NFX=-FSlpL8*F-ex@apqY~7_Y3ms#l>BuLr*0zQ5f?G9xzs zStE7^7Z5sMUEr6Q_z!<~#e+Yt0->wf`)tUJgT)RuQrFQ&uT64Zkb~Uv3gTbq>s2%R zJ9|>E>1bp|qvjDR<~#kDB)+E~lyih9ntu>kp0C;H)o$TF{-#zdU7HM*#GP9tcksd{ zQ0}WN50%_&gyf$7q@P?ZEOJz+n!Jk*MTP6{N9TaD9{Q6;+b#!bA^4H4{=07yEUIVZ z|9I#QAEIdwS#Ak!`bIFbkur7PJW7<0Qf1)8G7Iv*ofd=4kOjTBFCz;AG~j6FxVodb zOR2ed|I+m=9ea+ygA*IbH_&?Kb8B`c$T4_xq@Hf|>jZmU@LMp?nOX<NpSsq+)<5w& zrc?Y>JGbP-UCK>j4mDWljyVOsiUw;?`W99a7t@gGTH;3!d>ycGSZxk@KKE6AyGm<N zsuBw+fhW1jM+)FvnWEi;A*7rcb?|O0CHaU#>1AOUBiAyphrQ~`)_pPWMhK};xt<V8 z$>1&>HRBNH(39}+pk+%_@)Bn2Gy&E*LTd#$&m5jD4~yKtg>1f_Px5?h!r^{<sa055 zR4d5ewk=W3rkN1A4~>a-I}rU<7%$2U0cFaQ!KZRd24>G_d{aN6lguW+pm2Q;2Ipg^ zjx`B>lD&}%ykYtr2U&y(5qm_p^Gf^?CGkw|qhm$q!)bQT*WZc(F4q!V>f6#ZNzi7H zQX!JSyBX9^=V3$iQBNVG_2QtD2?AUoI@5?1axx&UyGUUounIfKuv-(dSC$bw-Mo3M z@o;$ovdTQ$tHbhREQu4PEAO&A5Cnk&RjN;7sT<R7i(<%YI?nA9*hw@7(YQ!USrg=E zR#%m1u(mIU4lWDHUp1OrF4ogtSMtfu`59*CWj}qWihrW3h$}5OJm5Q_x=L{5tO(u{ z6-iTP_#Hzi=M1Tc`EA|@uW3w*Wl|Gyb>%8drmIMq6Q^XeD5Q@@Zn@@vPyGU^$sQ>w zNqwE^`kBX~`n2YzX1!2(wDSc;l^RC_wCzmaU?Vp8^InwgduFp<!~Id=5{Er(%bP=Z zS+3xeyuxHL#A^Fj%=o{ZeX}5CRartO18p{QdQNhKyH`J)eo~uwSH;qz#C?+p^l`S? zY{{^%Hq8D}11^eh$;n`l#GPPKJ^EGp`FcN!E#SV-{bt=+E)it&ll?pIkND+mF*26w zH$R~4YdboI2<iUL#ewdNp;{>BXmRqUbOzEXr=Y{fq<49c>3tU|3X3db%}=;1+$@}Y z^&s-sLqV7O^>_LbHL*tZ1snoGVh11(QDH@eQs?C$G9<5V@Aa_VjU6j{)`IIF3Gd63 zBUlt;AMTaR_f3-a4^(mGsP{-6w0Mf4^9mrX)hAsp=C8elif7`2*94@@YT7pDqkX1+ z>tF3UYn6twvNCbS!?UxGU+{m&#Gd{@>Alj`n<1TBRNEomY&Du&xWl(!;F(?_dRsbM z-SEAD*&jFTIcwP*?zrHcURhxqj2D9>mHQqC7ge!lOVuz}o6pVHpB$&;FpXP8$Fh8N zYAxmXX5)#dIyY{71;7rtx~4kJsciPUKktRSULwcc8;1rWhYVYpjSm`=o*ItVRWHvj zYVd|g^oR2d28tKd(A5ohF|SS3nSoW?u<s@$c=%cRA&XT|M;zN7t5|-oL*JLWnAy}s zR9VlxM2O^6uOf%u*Hvlgygfh|^eQ!&O?Z>g8om9TCcNO-l%fYbNmMM!Lk4o?pVpj% zlnmgpc2kh4_>qnodXx~BOk7qr*RR802!ZU7QUTRS{ADY_EF9UX->~g$Ag2q=i|$R9 zuGceix9jol{3=$54YQg}Rl>8!ef4-RuYz1o(bcyI(IpCC$ud8^FIk5F@wA!U?_Z0u zUj3g^RF}UeSDuelcrqQ)MoSk!7705UHh8t*b$A{$P`lhTPwe@*iDoEv$va(B*norf z{wGth1Sh{;u1|)mxe$k0+1q>Nt}G%j@po_dI%TKxUC^GlpL|;A>W-^NW=9)Zbh{j& zkJ3~V(P(UH9=X?XI(B=ERceXu*sr7@aOU)I6)R#(XzxF`cfL$R#}V?pt9N(=r*;xr zZ*+UQy?GagEgr}mD+EvVm*-X#cT}a-tUo{<<mxB^r{FZy1Lfgf?bdcSQC34SB^@>i zEpHKi`fbM$-F}*a%j0w{i%%W@xput-ZoZfi@Rm*areXQFhax{nbIfo~mWEEhw&;8G zBnd?)SrZ3k=t{Wz)0pC08^_q)y1?$p^5!HXLwrhAk$;E0D0~gHFN`AP7ASdDCFzL= zNeQ9Q{StCoFHI%Ef>+qk5Y1}X3`vZ=YMTT+dhqbIoX#t8eB9b%-+kFRrUZ9pra1oo z(e>ARLYV4VBXTe1%07#4YCJ4t9renV<xC!HI(j1`EfmvXqcde7I_+z*k}guqYAhyG zKjhC{u<=8z?H#^TJh5KF=AnU9HQ7l!S!~!%O|Jux9lHX}jOWBnU!FY8U{s2|_g3)1 zpH6S3DGx?fu~&u(G0)70nXsWq$5n%27*+38;z*kG`&0PG<HR!(7q6<aA6HZ{J*cHw z!pbpXt%}0$z19m&?rw`&bVSzZkR)Mg8>FuBOie|6_k~&KlbAqH*|uoUWPXI#@+{Fo z)n2wdqyFrgl3ZE{c6^n(iMYqdk|d1k?Uule{u$49NEVmV-!5#&gg&{!(lcw&v)$HF zZKjiR<dI&R$W&^NOxBhtSExPfImeC~Ydl^2@kt2D3$B7vhbUQ;E3UjI4+l%K6F>q~ zVh3SCW}%&u?_I3>6F&`=a|3KYad62rc^N@z&|u{^HDyEQ#N<)-ZdEpe8@t?NHIH7# zR#39;3oy$x=4wy<ZlBqa{a1Njb-B2|HruaH+N#wx*O3NJijB;3y;)XpX$uP+>_2bX zAxn&b-h=DNkr9eWX^s9}mn>EKIz45^zrY`lj2-Mk^79ZWjw{%8y24C`yV3sa=2aQq zb2x2a1w5~|0d~?Y2i-1ZxCbCfNYpyEzId<cyK2+TUm+M(v^cKOAk7NRqus%9Ncpt} zi;oMvVT(-q^?}FDg)Sv}1$huATc|T9P%#iV<bLLA2M=4GiwRist2U=_Vp&z072G4d zz6F|xqanHe{spzSXmpJUj=x-NGmMm`MM-s6U!9~aQBh}3m@S3x|FXEU+|E7dJN^Nt zapc!_U(6*w@>3bH2^(1;Z+8V53f!m96wLC(PEh6F`g8f!xuD8LhnhMuJRtjPBmY~O zmwi654`OeZ9*}I9#&pz-548eS0u5etoxLveq{uy0n$eX9<fMCZri72_k(U4G;BX=K zXg}y<^-hKo+&8QqrsxxfdP$oO-8qD8KmSl&<r>$h*bl?u8#Ckbt}en5jOW|Xn{b<C z#q0RoG%_-RDT(+YekgJ%Nn?>#<5*Jd@$G}a=(Uds4-W~esz{Rri|HG>Vaqu~z8pEJ z3>7CHi{7xYrx*%_s@NGvb!UOZ+=5QjNBicfl@+++sJ>~M>zwr-`<jcbM$L#)VHNZr z9?q9x)B|6_gqGT?(gG(pDeoF(AJ>pzH18M4HDpwpA}-cyvwp$AD3jIPY3BsYP~-%F ziG@6w2X0SBdr8E8k~h81BZC<JP##7{dPlE9rMI+ZAKgN6+Lhtg$XSj&xN;tRf~$o% zfy>{njo@Qvlop5DwwY0OuC4MxO7WSs8}jYFnc2tM?8b*w3N(3gL5>tb?;k;rJ%5Dn z_w+~w!YZoU%gSOuSe@C>n5Un}71~7xUhe2V&exn<3?~-T^719|s94s@Ilt>+%!a7; z)LSm#L1}*-oA|R{UWdPx?71q(2uR70<Mljwu`^EY;IoQU4O1Le63tEPL$5eMG3AfV zm(p&%{P6=bSRBrz2ESYEY(rWgZ`4us@0rv4SE2LPQg%Ani#+Adb%yWFBVElu<sS)g zkW<`V?<XM9o-DUV4E7VB=sIcZN~M>g#E2KW6PV_(XXu~VS@~#cN@26vpa?L!P2qfb zS^z!#1o81N`aRPMJWpO+J(v>px0S}j=7IeAX01gi`_7K_7t|_uAeluhWCk;=UfQ_s zEpLI%uL}6ctzO%|3T0klKWeqCH^mWy4Xbr(<+T1@70N}eynz^{7v~!?|F+3gt}dz2 zXw0d23OPefeKCkUq2hk%iLletXDYoxHM`ABz0V)d^x*N_d=1=r-h9s__-N;)5VmTZ z$7n3aZokNT9qaV+E%*K99s;$j_v11Qhd3|p$q{mcPXzm%XK~2RtO7IAUBYcMN`Q*2 zt+_PUP=h8RU{JJE%ne28*7^kMPt9Bj#svAPnfiplS9?)N8BW5qtuib$t~AvLsssW_ z+nYPtzmJ{i(OepeJgf~rl2irbE_a8b@J+m?f7mn4k%`s9<8FHp+lejkYMuV&w~Jd@ zM_wxb^Tsp*O7YtnriFzLxZEW-rcf1etk>)E6ESRQPBAi}NraqVYz#q8fsW*gj9apN zt{A4*NUZ0DI`rH9Aj#vp97w(mzD5^nv78<aU#QvB?Sz!smj81tftI1Hc5&|0@M}Lz zd^MceNt{V9sf((kdI><1zrPhm(qcmD*oWpv!(o%Lk>8#3_AP&Uz@eFm<Jv%btZ`$w zW##4)vuI%EfS0BlW$}c<(9OX_gn>LwltmOmv5-j=bRI*IpMT(?g%M-kjoX$|b7L09 z*@TeOUQ72YW1$=dJ18;Tf(X%~jz2*@*|{})fB$yPYq!epKuB!Rf_T>EX$6zrZOA8s z(ABz;KS^n1@%!nGKXhqVlzZ4nU6D8Gm+$~K7yoSCqwMy(^`d{uojPBxzIR?v5CJ~v z6Bc!J(0??Fl<qA+#Mf86blDx8nsScO>v}oU=ojF#BRi-3IgpQV8@3VrWZ)#}81l8S zmFc<j%q`H+up^zXCc*nUmCOH$z-86Z6ldBtOV>nyw)6^*WvM@oR76?Ku9hSCU~G1X z+fF*DH0Ld-**OL-ns4-ak|?`9;P_IiKRnjh=sk%K&FqKS+*g1}jV6oNr)4}=<N1*X zPKiNM0%^nu0<9C9p=!j~ie%Hj3wH!co8aA@h6t3<XzJ2CYz*PHIC&n0>k{xMO>C<b zN-6PcXd+2BO>KQy4|NWwPnS~`J;4mv!EDJHLGyW7qS9teybldQ2fsIL6I@IgaK257 zy(2<Oy5|R=bB2_Q%R%<Z%5;$fiTxHXpHG(toC4hF@7J#7O`j7ahC+?jeDk6|Y^<rS zIHXz*$mMG}Go_~DPf73ZSp-?P7}dt!@2n#Q)HkQ4-JN>yWXD`#2$rd4`QHsIf9K6O zK34ouAq5M)mz<JP%nSAX+$U_CA3eDueK%grl$W=fg$W(1rcnI%8jc+#v&T_Z;}vKI zP*>VV-}re<-ZQUDK3UZgAi=|1z1w*mpu+EfF{<_O_QVL|wVmN6&2T8Om~wd2BURCQ zGhzd<dZm2z+9ofJRG)&0gx$U)7|MN(aWL4NKvBzKJEpJj_dW1`6cD)2JpmxXtyTKI zx-*3Up()lrSpG3r`|T{}gWq#sL)cffDW(M&3$SHfTzd$2@4$V2+UVsb5b1>WHR{SZ z5F0I^g`>r22xMglFT$mr$#_dsjysb2uzMw<j2*fm{wOk1A@!psw|_T&lT|i`KvHyM zj*#~2P*VBx>Z*`l3plCuej~!`v@URZdRkkt!>!=Pwq}t0q?1H<Z_Ma#J-hWvD_RPD zHiaf1P$wlSGs)jK>U@)|u$PkGM%*AF=k|~5T<&aWPmX$K7vt?;qSd4qkW}(B?_iYw zyrNHeyr3PCO_oamp?J~{Cfw4Av(F0gLm{hYT<wYHG0-I_R+hUXlD7(TR)Lv~AL~A{ zC4$mVD980PsMgiZ@?1_e-(^uNb|A%ZF@!@TzcUVA47wg>jx{dQ0K0>CyZO(PxJg6t z^2V(vIee{8Cu%=P-!#LodbxEYzp07DIs1l!xX+UTPOP1fzsH#Lo_!c3hb&l{8JVx7 zO40XYZP-*(Jo{Lq_ugMG(V&iEC*vmtlHAltVR{;q-k6AWnN)2TZnj^Zx39yJXxdZZ z>(RdZl#6Xc83-Z!5`45p{|l&{;CG@Y4c(HeyPKfzLQ3u~WM(<g$3cdJEWsiM%0BhE z8c$$O0t%+dAh=;{ye?h%$;7uR;k(mY)x*X;*!*awB~n(2sOa=FKU_D--X1%`6Ty-8 zU{D5YYK8)w$yHaB*23t$Q@qP^$4}udYPQX@1%a*=#?H*&vQv_4vt6z7obu2bJ>oTk zM=(Z4{7Wjzl5X+f7EdNE3p~e_#uNxxM{aC<t*oxbX|JALC6<`wSp(xsGVJO^NGWY6 zE}m?^Tu)*`a^ntBu8+rV1zr92pH@i)KUo-IfTmexiE7(FnVzbeaoaT^x-yR_{a-Ad zWl$Vlw}pWuXo3^mg1ZNIcZcBa!QF#};5N9syA1BG!QC0$32tA%w{F$+AFB8<-KWpl zd#`7$IW}nSNR}k_j<RGYwRpdx`-Uff`GhY|vDszgj^gjVXB(aE`U{6$iD7k75m&_4 zR%+b)j=#z7#IUCqh3mZ{C}i=Z|HRd4 o&)+Y?bIQN_(SnFxM40I|^z%+<S0$9; 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 Xtys|c;etuC00000NkvXXu0mjfg&Y|M literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/dani_RedNormalClear.png b/TaikoWebUI/wwwroot/images/dani_RedNormalClear.png new file mode 100644 index 0000000000000000000000000000000000000000..a27420637e9ac6c758d47c8e9a6d09c4ba67810a GIT binary patch literal 61721 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/dani_RedPerfectClear.png b/TaikoWebUI/wwwroot/images/dani_RedPerfectClear.png new file mode 100644 index 0000000000000000000000000000000000000000..aa14cb76a4952a2a29fd25aa6a03fcb5c837ce4a GIT binary patch literal 65404 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 IM6N<$f&hlGoB#j- literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/difficulty_Easy.png b/TaikoWebUI/wwwroot/images/difficulty_Easy.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e5a85cfdfe448a31d224ef77cbc807f914cd52 GIT binary patch literal 7588 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 OsKy2s`cHM;uKyows8&V* literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/difficulty_Hard.png b/TaikoWebUI/wwwroot/images/difficulty_Hard.png new file mode 100644 index 0000000000000000000000000000000000000000..5a52d9191f0601f1e31df930874bc7ad7bec2228 GIT binary patch literal 9091 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 Pn~av)ebpLen@9fvNYIeK literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/difficulty_Normal.png b/TaikoWebUI/wwwroot/images/difficulty_Normal.png new file mode 100644 index 0000000000000000000000000000000000000000..1acacc63f083f44772679f0a8073058bf1768678 GIT binary patch literal 7722 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 JRCT=l{{TU*vYr3{ literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/difficulty_Oni.png b/TaikoWebUI/wwwroot/images/difficulty_Oni.png new file mode 100644 index 0000000000000000000000000000000000000000..d25ae53061609861b3dbff430aed0bbefb50a1a8 GIT binary patch literal 9648 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/difficulty_UraOni.png b/TaikoWebUI/wwwroot/images/difficulty_UraOni.png new file mode 100644 index 0000000000000000000000000000000000000000..00df9d7320d63fe46f0aa4eeceaaf02a837ac136 GIT binary patch literal 9564 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 R-v0kdU0Fw|Lcu!XKLER$Xf*%; literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/rank_Bronze.png b/TaikoWebUI/wwwroot/images/rank_Bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca2d55df810fae74ff97f7e074997e171ba040e GIT binary patch literal 15663 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/rank_Dondaful.png b/TaikoWebUI/wwwroot/images/rank_Dondaful.png new file mode 100644 index 0000000000000000000000000000000000000000..b43316d368306f068c81d87ba189416c4a0796e3 GIT binary patch literal 17384 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 JPDHLkV1htS5>NmD literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/rank_Gold.png b/TaikoWebUI/wwwroot/images/rank_Gold.png new file mode 100644 index 0000000000000000000000000000000000000000..7e36cf06fd396b9069b1b348b561090f6936ff0b GIT binary patch literal 16726 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 UXe8GC^Unv0vT8E5Qf9&b7XScP&;S4c literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/rank_Purple.png b/TaikoWebUI/wwwroot/images/rank_Purple.png new file mode 100644 index 0000000000000000000000000000000000000000..821ffd12c05196986b41939315ce94c4fb70070f GIT binary patch literal 20518 zcmcG#byOtJwl0Xf6z&d<yL;j8H11C0P`JA_?(Wh+<Bhw!ySsKn;|{~`-gC~pHS5ir z`_I%`S(%Z!<BM-g?#PIYj8s;XLPo$x00RR<mXQ`${oI@Vv%$f9{yXlasDJL@9i_Eh zz`zhO{@K96GP7~Pz@SI1)wMuc3i5oW4t7k&W)3FiOdfWQpVDAp0>U1S#-=vrAW{=^ zOKW>U^2_#aa#CwEL2^w_1r`NIF>@<xX)kAUH7`YVQ!g7+UNdrGAyNSkzE1!<bC5Bq zhn=mx3!jG|`G4W^eIEaFnwgyRzeGSbg5)CqG)StYpiC;};A~FH&BV%R%EH1z%FWBf zYierBVP?)i%ErRR#>~Rb%*w&Y%F4&a#mCA^`mZ1PXLHVG7JRDWlK*P#vm{7v1p+zp zF*CcnyED17GdVb0GPCmX@-nlqF|)BTeo8R9c-n)EJs9m>DE^HgZti00Z0!iLcCaV? z2hrHX!4)J({z>(}b+B{%53Ie*zwGpBF=h{AM`l(gmVb2mx1fT;|5?<|?myBlAPKk6 zR{q8Je+%rQ?&)aGtZMG!;OcB@F5zZw52E;YV`irRsq5(KZ2MoDnwc`2+nU>bin)9e zWBpH4j#dsJ2Nx@c{}(;}bNN5oIP!@(n;U~1oYfs1Z2#>k<$t4)vavI<lhSBf+nYJK zyU_l_=wB7g#f?Gcg5>{rjgf_uk&R8Am5YyqhmZZU$ic_L^53EgpMhXz3^M+o2|Jis zTX_CYL=_bHWb9o)#`dP>GU9^dpQM<qt<Cs&%(+-NP1t!DIZb%j8Cfkjco=z1%~=_Z zSvgEuOgY(k&3SnLi`Qp;aR*b^f6Vt!{r`?zGY8X8jQ?1OkBgU!g@ujPf{}yUjFZvS zgu|H8*u<Qh(Uk2oWKB5O&3MdA|Ba^PZ2fub7~B4@sQ<7s`$RM~<Kbd8<>F*C<KW?9 zWaH)dBxJ#9%*e}Y!OddA#?8yZYe7zGX3A&b;B06787J0u#+K&Hj`o)1r2jV?F$Y@* zX9WkdPn)y<6V0FKpIS&;yL`IN^I!Lenz_@zj%=+-|10SDj7|TEbwP5|f1GS?M*gqU z*8dyp{m*#*H>|sr`6uZA!TJ9!=Hg%hayNE17qR@b^#5mYG5^1jcQJPRKU4poIsX4g z>i;sUsg<$4rTJ&(WG4Sd8Rmad%zrzD`Tyy!|GM_Sq@#a}f9AM<4*!!~KMViK&*t`@ z(9WOPH#5tv9}G+uQbt@v-6MPR%{?1y@$E5AczR-^DF-^Wgqf%qfh&rX>$kpX4eJ-l zqR6_e>)1>ShRDt#bb7ZcG-WiAc!RX2T0~oB_lFC+`KgCEc9%<iEsjzCyzR@Iw=R!~ zeS?dsY+e_G&g^Bl_ikvDJf+o1-p#jrf8>Zu;X{AHcYhmjjy9%7|3`lpmo6LL?L(pE z$8Cuz&W~l%(+?=oM&GVuCaBHV4?{d=_d4V@a&fP2WN_OaaK4V|d;1|)Fu`LT?&F(} z%fH*e2-0!*O~ytbBaq428E3D($8Z3BM_|V^pBSzPds`|1d;%H;7M&)f1-Q^Ig;5Ks z1z81i@3GvnbvM<`TJ}+7^vYblsp%6?IEU6l<6uj$az^B8MtftZ4Ml?28Q2X;jYy^; zM|%mT;jzyj0ACzn-edjI*WnJ~0Kr@U2<8rx(D?pl*vt5V@~BP%0Rt%vvn9g#+_fiO z2)O1qVu)Ik3lJccPW5(fUBvM&>49)S(u5-m1+eZA8}TR~<s_lX!}5Xuu+C(lrAv59 z@WF$ZDh3p`^V)$=!NPzY0uvqtVDtwsKInT4I}G8-)=r7xH;J+W=mXz@sQI`NVBnZ0 zKH}#zb+>HVOwJE@=W0gSGs6Uxc>oh4(%`^+pWWWHgQb%7gL>4ZG48xK@%Q)p?$LeA z+>T41wSYW`e&q;SNwUGb@sH_U;m#k-UZn_RLW!!_;2}X|o^vW?jswXQr1{aQOW4@V zAF@o^T{I5{=#O9?xK#7L`bLRZSlEB1b~G-1Vlz2&_1p0Ws?UZtJQqCnDMJCnV8e2> zH{h{?*E~<t%OA8*J8L^F@zTApH`~Y6!kYuto9n)Em5`6nwQ$mfNP!&Mb<cS~_w#3e zd2aZ&sPuCcL>lDH__RFFU$3{Vp{f@Ns$6obO{1yPf{$&4te}Z5^{qgi33wWWOK?mN zQ-fTWT<_PqeKXxZ+lOloAEa^FLVG~MhRfaelRcXfZ96&3wB*sBszXiE)*3Rc_I@z} zpt;)()+UHy$RZWOw79)Be@)OKK8q04h>qJff9|`(7QkVKl!dqjz=MbjWmOH*R%?w~ z@<5bQ5{?Z55|b(H?>L$A-aST#mY$mIFS({$;3r%0Ao0M2&d?=06Qgzn=wR|*<Og;< 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 Y12Y?Cke~UldjJ3c07*qoM6N<$g6fhSvH$=8 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/rank_Sakura.png b/TaikoWebUI/wwwroot/images/rank_Sakura.png new file mode 100644 index 0000000000000000000000000000000000000000..565a72246a04e00fbd0761669a85171d47971a5e GIT binary patch literal 18797 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 IM6N<$f@gtc=l}o! literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/rank_Silver.png b/TaikoWebUI/wwwroot/images/rank_Silver.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b977a8f930d9c0b363fdab7d39c165c5e81a86 GIT binary patch literal 16477 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 aFv<<z>tXlJQvdk_03|s!*&6B3U;ZzyTNfDs literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/images/rank_White.png b/TaikoWebUI/wwwroot/images/rank_White.png new file mode 100644 index 0000000000000000000000000000000000000000..587b8d87fe7c350501006955fea4a0e4ee449c38 GIT binary patch literal 11114 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 literal 0 HcmV?d00001 diff --git a/TaikoWebUI/wwwroot/index.html b/TaikoWebUI/wwwroot/index.html new file mode 100644 index 0000000..17a13c8 --- /dev/null +++ b/TaikoWebUI/wwwroot/index.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> + <title>TaikoWebUI + + + + + + + +
Loading...
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + \ No newline at end of file diff --git a/TaikoWebUI/wwwroot/style.overrides.css b/TaikoWebUI/wwwroot/style.overrides.css new file mode 100644 index 0000000..e1a5915 --- /dev/null +++ b/TaikoWebUI/wwwroot/style.overrides.css @@ -0,0 +1,51 @@ +.dani-results .mud-progress-linear { + height: 25px !important; +} + +.mud-progress-linear.bar-pass-gold .mud-progress-linear-bars .mud-progress-linear-bar { + background: linear-gradient( 90deg, rgb(255,83,147) 0%, rgb(255,248,6) 15%, rgb(255,248,6) 20%, rgb(122,255,79) 30%, rgb(122,244,255) 45%, rgb(149,104,255) 70%, rgb(255,98,244) 90%, rgb(255,98,244) 95%, rgb(255,83,147) 100% ); +} + +.mud-progress-linear.bar-pass-red .mud-progress-linear-bars .mud-progress-linear-bar { + background-color: #ff584d; +} + +.mud-progress-linear.bar-default .mud-progress-linear-bars .mud-progress-linear-bar { + background-color: lightgrey; +} + +.mud-progress-linear.bar-pass-gold .mud-typography, +.mud-progress-linear.bar-pass-red .mud-typography { + font-weight: bold; + color: #333; +} + +.color-box { + width: 16px; + height: 16px; + border-radius: 9999px; + display: inline-block; + margin-right: 10px; + border: 1px solid black; + position: relative; + top: 2px; +} + +.columns-panel { + column-count: 2; +} + +.ai-battle-td { + position: sticky; + left: 0; + top: 0; + z-index: 99; + background: #FAFAFA; + display: none; +} + +@media only screen and (min-width: 600px) { + .ai-battle-td { + display: revert; + } +} \ No newline at end of file From b23c387a29cf234d58417fa171b0907aee18cd0b Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 10 Sep 2023 02:41:04 +0800 Subject: [PATCH 02/49] Test --- .../Game/GetGenericMasterController.cs | 32 ++++++++ .../Game/InitialDataCheckController.cs | 75 ++++++++++++++++++- TaikoLocalServer/Program.cs | 11 +++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs diff --git a/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs new file mode 100644 index 0000000..1207a14 --- /dev/null +++ b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs @@ -0,0 +1,32 @@ +using Microsoft.Extensions.Options; +using TaikoLocalServer.Settings; + +namespace TaikoLocalServer.Controllers.Game; + +[ApiController] +[Route("/v12r00_cn/chassis/getgenericmaster.php")] +public class GetGenericMasterController : BaseController +{ + private readonly IGameDataService gameDataService; + + private readonly ServerSettings settings; + + [HttpPost] + [Produces("application/protobuf")] + public IActionResult GetGenericMaster([FromBody] GetGenericMasterRequest request) + { + Logger.LogInformation("GetGenericMasterRequest: {Request}", request.Stringify()); + + var response = new GetGenericMasterResponse() + { + Result = 1, + VerupNo = 2, + // EnableIdBit = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + EnableIdBit = new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} + }; + + + return Ok(response); + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index bdd2cc1..06d468b 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -31,14 +31,87 @@ public class InitialDataCheckController : BaseController(); + var response = new InitialdatacheckResponse { Result = 1, DefaultSongFlg = enabledArray, AchievementSongBit = enabledArray, UraReleaseBit = uraReleaseBit, - SongIntroductionEndDatetime = DateTime.Now.AddYears(10).ToString(Constants.DATE_TIME_FORMAT) + SongIntroductionEndDatetime = DateTime.Now.AddYears(10).ToString(Constants.DATE_TIME_FORMAT), + // AryAiEventDatas = + // { + // new InitialdatacheckResponse.AiEventData + // { + // AiEventId = 18, + // TokenId = 4 + // } + // }, + AryVerupNoData1s = + { + + new InitialdatacheckResponse.VerupNoData1 + { + MasterType = 1, + VerupNo = 0 + }, + new InitialdatacheckResponse.VerupNoData1 + { + MasterType = 2, + VerupNo = 0 + }, + new InitialdatacheckResponse.VerupNoData1 + { + MasterType = 3, + VerupNo = 0 + }, + new InitialdatacheckResponse.VerupNoData1 + { + MasterType = 4, + VerupNo = 0 + }, + new InitialdatacheckResponse.VerupNoData1 + { + MasterType = 5, + VerupNo = 0 + } + }, + // AryVerupNoData1s = + // { + // new InitialdatacheckResponse.VerupNoData2 + // { + // MasterType = 3, + // AryInformationDatas = + // { + // new InitialdatacheckResponse.VerupNoData2.InformationData + // { + // InfoId = 1, + // VerupNo = 2 + // } + // } + // } + // } }; + + var danData = new List(); + for (var danId = Constants.MIN_DAN_ID; danId <= Constants.MAX_DAN_ID; danId++) + danData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData + { + InfoId = (uint)danId, + VerupNo = 1 + }); + for (uint i = 0; i < 11; i++) + { + var verUp2 = new InitialdatacheckResponse.VerupNoData2 + { + MasterType = i, + }; + verUp2.AryInformationDatas.AddRange(danData); + response.AryVerupNoData2s.Add(verUp2); + } + response.AryChassisFunctionIds = new uint[] { 3 }; + return Ok(response); } diff --git a/TaikoLocalServer/Program.cs b/TaikoLocalServer/Program.cs index 059505e..beefe30 100644 --- a/TaikoLocalServer/Program.cs +++ b/TaikoLocalServer/Program.cs @@ -125,6 +125,17 @@ try applicationBuilder => applicationBuilder.UseAllNetRequestMiddleware()); app.Run(); + + app.Use(async (context, next) => + { + await next(); + + if (context.Response.StatusCode >= 400) + { + Log.Error("Unknown request from: {RemoteIpAddress} {Method} {Path} {StatusCode}", + context.Connection.RemoteIpAddress, context.Request.Method, context.Request.Path, context.Response.StatusCode); + } + }); } catch (Exception ex) { From 505283a0034950ba2b9f54fbd49097985b209227 Mon Sep 17 00:00:00 2001 From: asesidaa <1061472754@qq.com> Date: Sun, 10 Sep 2023 14:11:37 +0800 Subject: [PATCH 03/49] Update initial data check for dan data --- .../Game/GetGenericMasterController.cs | 9 +-- .../Game/InitialDataCheckController.cs | 70 ++++--------------- .../Properties/launchSettings.json | 4 +- TaikoLocalServer/TaikoLocalServer.csproj | 9 +++ 4 files changed, 27 insertions(+), 65 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs index 1207a14..bd051be 100644 --- a/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs +++ b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs @@ -7,22 +7,17 @@ namespace TaikoLocalServer.Controllers.Game; [Route("/v12r00_cn/chassis/getgenericmaster.php")] public class GetGenericMasterController : BaseController { - private readonly IGameDataService gameDataService; - - private readonly ServerSettings settings; - [HttpPost] [Produces("application/protobuf")] public IActionResult GetGenericMaster([FromBody] GetGenericMasterRequest request) { Logger.LogInformation("GetGenericMasterRequest: {Request}", request.Stringify()); - var response = new GetGenericMasterResponse() + var response = new GetGenericMasterResponse { Result = 1, VerupNo = 2, - // EnableIdBit = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } - EnableIdBit = new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} + EnableIdBit = Enumerable.Repeat((byte)1, 20).ToArray(), }; diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index 06d468b..dd9e031 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -31,7 +31,13 @@ public class InitialDataCheckController : BaseController(); + var verupNo1 = new uint[] { 2, 3, 4, 5, 6, 7, 8, 13, 15, 24, 25, 26, 27, 28, 29, 30, 31 }; + var aryVerUp = verupNo1.Select(i => new InitialdatacheckResponse.VerupNoData1 + { + MasterType = i, + VerupNo = 1 + }) + .ToList(); var response = new InitialdatacheckResponse { @@ -40,68 +46,20 @@ public class InitialDataCheckController : BaseController(); - for (var danId = Constants.MIN_DAN_ID; danId <= Constants.MAX_DAN_ID; danId++) + for (var danId = Constants.MIN_DAN_ID; danId <= 1; danId++) + { danData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { InfoId = (uint)danId, VerupNo = 1 }); - for (uint i = 0; i < 11; i++) + } + var verupNo2 = new uint[] { 11, 101, 102, 103, 105 }; + foreach (var i in verupNo2) { var verUp2 = new InitialdatacheckResponse.VerupNoData2 { @@ -110,7 +68,7 @@ public class InitialDataCheckController : BaseController PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + From b880ac96632dad3c2916289adba5c729f4ba1646 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Mon, 11 Sep 2023 23:07:13 +0800 Subject: [PATCH 04/49] Implemented shop, adjusted initialDataCheck --- SharedProject/Models/ShopFolderData.cs | 10 +++ .../Common/Utils/FlagCalculator.cs | 18 +++++ .../Game/GetGenericMasterController.cs | 2 +- .../Game/GetShopFolderController.cs | 21 ++++-- .../Game/InitialDataCheckController.cs | 18 ++--- TaikoLocalServer/Services/GameDataService.cs | 66 +++++++++++++++++++ .../Services/Interfaces/IGameDataService.cs | 6 ++ TaikoLocalServer/Settings/DataSettings.cs | 6 ++ .../wwwroot/data/locked_songs_data.json | 4 ++ .../wwwroot/data/shop_folder_data.json | 6 ++ TaikoLocalServer/wwwroot/data/token_data.json | 4 ++ 11 files changed, 145 insertions(+), 16 deletions(-) create mode 100644 SharedProject/Models/ShopFolderData.cs create mode 100644 TaikoLocalServer/wwwroot/data/locked_songs_data.json create mode 100644 TaikoLocalServer/wwwroot/data/shop_folder_data.json create mode 100644 TaikoLocalServer/wwwroot/data/token_data.json diff --git a/SharedProject/Models/ShopFolderData.cs b/SharedProject/Models/ShopFolderData.cs new file mode 100644 index 0000000..fc0f884 --- /dev/null +++ b/SharedProject/Models/ShopFolderData.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Serialization; + +namespace SharedProject.Models; + +public class ShopFolderData +{ + [JsonPropertyName("songNo")] public uint SongNo { get; set; } + + [JsonPropertyName("price")] public uint Price { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/FlagCalculator.cs b/TaikoLocalServer/Common/Utils/FlagCalculator.cs index 643070f..40bf14d 100644 --- a/TaikoLocalServer/Common/Utils/FlagCalculator.cs +++ b/TaikoLocalServer/Common/Utils/FlagCalculator.cs @@ -126,4 +126,22 @@ public static class FlagCalculator return result; } + + public static byte[] GetBitArrayTrue(int bitArraySize) + { + var result = new byte[(bitArraySize / 8) + 1]; + var bitSet = new BitArray(bitArraySize, true); + bitSet.CopyTo(result, 0); + + return result; + } + + public static byte[] GetBitArrayFalse(int bitArraySize) + { + var result = new byte[(bitArraySize / 8) + 1]; + var bitSet = new BitArray(bitArraySize, false); + bitSet.CopyTo(result, 0); + + return result; + } } \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs index bd051be..daede73 100644 --- a/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs +++ b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs @@ -17,7 +17,7 @@ public class GetGenericMasterController : BaseController { + private readonly IGameDataService gameDataService; + + public GetShopFolderController(IGameDataService gameDataService) + { + this.gameDataService = gameDataService; + } + [HttpPost] [Produces("application/protobuf")] public IActionResult GetShopFolder([FromBody] GetShopFolderRequest request) { Logger.LogInformation("GetShopFolder request : {Request}", request.Stringify()); + gameDataService.GetTokenDataDictionary().TryGetValue("shopTokenId", out var shopTokenId); + + var shopFolderDictionary = gameDataService.GetShopFolderDictionary(); + var response = new GetShopFolderResponse { Result = 1, - TokenId = 1, + TokenId = shopTokenId, VerupNo = 2 }; - - response.AryShopFolderDatas.Add(new GetShopFolderResponse.ShopFolderData - { - Price = 1, - SongNo = 2 - }); + + foreach (var shopFolder in shopFolderDictionary) response.AryShopFolderDatas.Add(shopFolder.Value); return Ok(response); } diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index dd9e031..74a3977 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -24,14 +24,16 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 { MasterType = i, @@ -50,7 +52,7 @@ public class InitialDataCheckController : BaseController(); - for (var danId = Constants.MIN_DAN_ID; danId <= 1; danId++) + for (var danId = Constants.MIN_DAN_ID; danId <= 18; danId++) { danData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { @@ -58,7 +60,7 @@ public class InitialDataCheckController : BaseController folderDictionary = ImmutableDictionary.Empty; + + private ImmutableDictionary shopFolderDictionary = + ImmutableDictionary.Empty; private List musics = new(); private List musicsWithUra = new(); + + private List lockedSongsList = new(); + + private Dictionary tokenDataDictionary = new(); private readonly DataSettings settings; @@ -72,6 +79,21 @@ public class GameDataService : IGameDataService { return folderDictionary; } + + public ImmutableDictionary GetShopFolderDictionary() + { + return shopFolderDictionary; + } + + public Dictionary GetTokenDataDictionary() + { + return tokenDataDictionary; + } + + public List GetLockedSongsList() + { + return lockedSongsList; + } public async Task InitializeAsync() { @@ -83,6 +105,9 @@ public class GameDataService : IGameDataService var danDataPath = Path.Combine(dataPath, settings.DanDataFileName); var songIntroDataPath = Path.Combine(dataPath, settings.IntroDataFileName); var eventFolderDataPath = Path.Combine(dataPath, settings.EventFolderDataFileName); + var shopFolderDataPath = Path.Combine(dataPath, settings.ShopFolderDataFileName); + var tokenDataPath = Path.Combine(dataPath, settings.TokenDataFileName); + var lockedSongsDataPath = Path.Combine(dataPath, settings.LockedSongsDataFileName); if (File.Exists(compressedMusicInfoPath)) { @@ -97,12 +122,18 @@ public class GameDataService : IGameDataService await using var danDataFile = File.OpenRead(danDataPath); await using var songIntroDataFile = File.OpenRead(songIntroDataPath); await using var eventFolderDataFile = File.OpenRead(eventFolderDataPath); + await using var shopFolderDataFile = File.OpenRead(shopFolderDataPath); + await using var tokenDataFile = File.OpenRead(tokenDataPath); + await using var lockedSongsDataFile = File.OpenRead(lockedSongsDataPath); var infoesData = await JsonSerializer.DeserializeAsync(musicInfoFile); var attributesData = await JsonSerializer.DeserializeAsync(musicAttributeFile); var danData = await JsonSerializer.DeserializeAsync>(danDataFile); var introData = await JsonSerializer.DeserializeAsync>(songIntroDataFile); var eventFolderData = await JsonSerializer.DeserializeAsync>(eventFolderDataFile); + var shopFolderData = await JsonSerializer.DeserializeAsync>(shopFolderDataFile); + var tokenData = await JsonSerializer.DeserializeAsync>(tokenDataFile); + var lockedSongsData = await JsonSerializer.DeserializeAsync>(lockedSongsDataFile); InitializeMusicInfoes(infoesData); @@ -113,6 +144,12 @@ public class GameDataService : IGameDataService InitializeIntroData(introData); InitializeEventFolderData(eventFolderData); + + InitializeShopFolderData(shopFolderData); + + InitializeTokenData(tokenData); + + InitializeLockedSongsData(lockedSongsData); } private static void TryDecompressMusicInfo() @@ -179,7 +216,25 @@ public class GameDataService : IGameDataService .ToList(); musics.Sort(); } + + private void InitializeShopFolderData(List? shopFolderData) + { + shopFolderData.ThrowIfNull("Shouldn't happen!"); + shopFolderDictionary = shopFolderData.ToImmutableDictionary(data => data.SongNo, ToResponseShopFolderData); + } + private void InitializeTokenData(Dictionary? tokenData) + { + tokenData.ThrowIfNull("Shouldn't happen!"); + tokenDataDictionary = tokenData; + } + + private void InitializeLockedSongsData(Dictionary? lockedSongsData) + { + lockedSongsData.ThrowIfNull("Shouldn't happen!"); + lockedSongsList = lockedSongsData["songNo"].ToList(); + } + private static GetDanOdaiResponse.OdaiData ToResponseOdaiData(DanData data) { var responseOdaiData = new GetDanOdaiResponse.OdaiData @@ -223,4 +278,15 @@ public class GameDataService : IGameDataService return responseEventFolderData; } + + private static GetShopFolderResponse.ShopFolderData ToResponseShopFolderData(ShopFolderData data) + { + var responseShopFolderData = new GetShopFolderResponse.ShopFolderData + { + SongNo = data.SongNo, + Price = data.Price + }; + + return responseShopFolderData; + } } \ No newline at end of file diff --git a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs index 0e5ac80..dfa0d9f 100644 --- a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs +++ b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs @@ -19,5 +19,11 @@ public interface IGameDataService public ImmutableDictionary GetSongIntroDictionary(); public ImmutableDictionary GetFolderDictionary(); + + public ImmutableDictionary GetShopFolderDictionary(); + + public Dictionary GetTokenDataDictionary(); + + public List GetLockedSongsList(); } diff --git a/TaikoLocalServer/Settings/DataSettings.cs b/TaikoLocalServer/Settings/DataSettings.cs index 619b18e..9f76838 100644 --- a/TaikoLocalServer/Settings/DataSettings.cs +++ b/TaikoLocalServer/Settings/DataSettings.cs @@ -7,4 +7,10 @@ public class DataSettings public string EventFolderDataFileName { get; set; } = "event_folder_data.json"; public string IntroDataFileName { get; set; } = "intro_data.json"; + + public string ShopFolderDataFileName { get; set; } = "shop_folder_data.json"; + + public string TokenDataFileName { get; set; } = "token_data.json"; + + public string LockedSongsDataFileName { get; set; } = "locked_songs_data.json"; } \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/locked_songs_data.json b/TaikoLocalServer/wwwroot/data/locked_songs_data.json new file mode 100644 index 0000000..86598ab --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/locked_songs_data.json @@ -0,0 +1,4 @@ +{ + "songNo": [ + ] +} \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/shop_folder_data.json b/TaikoLocalServer/wwwroot/data/shop_folder_data.json new file mode 100644 index 0000000..a3c468e --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/shop_folder_data.json @@ -0,0 +1,6 @@ +[ + { + "songNo": 2, + "price": 0 + } +] \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/token_data.json b/TaikoLocalServer/wwwroot/data/token_data.json new file mode 100644 index 0000000..a590dbb --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/token_data.json @@ -0,0 +1,4 @@ +{ + "shopTokenId": 4, + "kaTokenId": 1000 +} \ No newline at end of file From aa6499866f8b70f59b7c08a18c251dd5ef1acb3f Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Wed, 13 Sep 2023 12:24:48 +0900 Subject: [PATCH 05/49] Add ary_movie_info handle --- SharedProject/Models/MovieData.cs | 12 +++++ .../Game/InitialDataCheckController.cs | 20 ++++--- TaikoLocalServer/Services/GameDataService.cs | 52 +++++++++++++++---- .../Services/Interfaces/IGameDataService.cs | 8 +-- TaikoLocalServer/Settings/DataSettings.cs | 16 +++--- TaikoLocalServer/TaikoLocalServer.csproj | 12 +++++ TaikoLocalServer/wwwroot/data/movie_data.json | 6 +++ 7 files changed, 98 insertions(+), 28 deletions(-) create mode 100644 SharedProject/Models/MovieData.cs create mode 100644 TaikoLocalServer/wwwroot/data/movie_data.json diff --git a/SharedProject/Models/MovieData.cs b/SharedProject/Models/MovieData.cs new file mode 100644 index 0000000..7a3a2b5 --- /dev/null +++ b/SharedProject/Models/MovieData.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace SharedProject.Models; + +public class MovieData +{ + [JsonPropertyName("movie_id")] + public uint MovieId { get; set; } + + [JsonPropertyName("enable_days")] + public uint EnableDays { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index 74a3977..a83aab8 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -24,7 +24,7 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 - { - MasterType = i, - VerupNo = 1 - }) + { + MasterType = i, + VerupNo = 1 + }) .ToList(); var response = new InitialdatacheckResponse @@ -49,8 +51,11 @@ public class InitialDataCheckController : BaseController(); for (var danId = Constants.MIN_DAN_ID; danId <= 18; danId++) { @@ -60,6 +65,7 @@ public class InitialDataCheckController : BaseController introDataDictionary = ImmutableDictionary.Empty; + private ImmutableDictionary movieDataDictionary = + ImmutableDictionary.Empty; + private ImmutableDictionary musicAttributes = ImmutableDictionary.Empty; private ImmutableDictionary folderDictionary = ImmutableDictionary.Empty; - + private ImmutableDictionary shopFolderDictionary = ImmutableDictionary.Empty; private List musics = new(); private List musicsWithUra = new(); - + private List lockedSongsList = new(); private Dictionary tokenDataDictionary = new(); @@ -75,16 +78,21 @@ public class GameDataService : IGameDataService return introDataDictionary; } + public ImmutableDictionary GetMovieDataDictionary() + { + return movieDataDictionary; + } + public ImmutableDictionary GetFolderDictionary() { return folderDictionary; } - + public ImmutableDictionary GetShopFolderDictionary() { return shopFolderDictionary; } - + public Dictionary GetTokenDataDictionary() { return tokenDataDictionary; @@ -104,6 +112,7 @@ public class GameDataService : IGameDataService var compressedMusicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME); var danDataPath = Path.Combine(dataPath, settings.DanDataFileName); var songIntroDataPath = Path.Combine(dataPath, settings.IntroDataFileName); + var movieDataPath = Path.Combine(dataPath, settings.MovieDataFileName); var eventFolderDataPath = Path.Combine(dataPath, settings.EventFolderDataFileName); var shopFolderDataPath = Path.Combine(dataPath, settings.ShopFolderDataFileName); var tokenDataPath = Path.Combine(dataPath, settings.TokenDataFileName); @@ -121,6 +130,7 @@ public class GameDataService : IGameDataService await using var musicAttributeFile = File.OpenRead(musicAttributePath); await using var danDataFile = File.OpenRead(danDataPath); await using var songIntroDataFile = File.OpenRead(songIntroDataPath); + await using var movieDataFile = File.OpenRead(movieDataPath); await using var eventFolderDataFile = File.OpenRead(eventFolderDataPath); await using var shopFolderDataFile = File.OpenRead(shopFolderDataPath); await using var tokenDataFile = File.OpenRead(tokenDataPath); @@ -130,6 +140,7 @@ public class GameDataService : IGameDataService var attributesData = await JsonSerializer.DeserializeAsync(musicAttributeFile); var danData = await JsonSerializer.DeserializeAsync>(danDataFile); var introData = await JsonSerializer.DeserializeAsync>(songIntroDataFile); + var movieData = await JsonSerializer.DeserializeAsync>(movieDataFile); var eventFolderData = await JsonSerializer.DeserializeAsync>(eventFolderDataFile); var shopFolderData = await JsonSerializer.DeserializeAsync>(shopFolderDataFile); var tokenData = await JsonSerializer.DeserializeAsync>(tokenDataFile); @@ -143,10 +154,12 @@ public class GameDataService : IGameDataService InitializeIntroData(introData); + InitializeMovieData(movieData); + InitializeEventFolderData(eventFolderData); - + InitializeShopFolderData(shopFolderData); - + InitializeTokenData(tokenData); InitializeLockedSongsData(lockedSongsData); @@ -182,6 +195,12 @@ public class GameDataService : IGameDataService introDataDictionary = introData.ToImmutableDictionary(data => data.SetId, ToResponseIntroData); } + private void InitializeMovieData(List? movieData) + { + movieData.ThrowIfNull("Shouldn't happen!"); + movieDataDictionary = movieData.ToImmutableDictionary(data => data.MovieId, ToResponseMovieData); + } + private void InitializeDanData(List? danData) { danData.ThrowIfNull("Shouldn't happen!"); @@ -216,7 +235,7 @@ public class GameDataService : IGameDataService .ToList(); musics.Sort(); } - + private void InitializeShopFolderData(List? shopFolderData) { shopFolderData.ThrowIfNull("Shouldn't happen!"); @@ -234,7 +253,7 @@ public class GameDataService : IGameDataService lockedSongsData.ThrowIfNull("Shouldn't happen!"); lockedSongsList = lockedSongsData["songNo"].ToList(); } - + private static GetDanOdaiResponse.OdaiData ToResponseOdaiData(DanData data) { var responseOdaiData = new GetDanOdaiResponse.OdaiData @@ -255,7 +274,7 @@ public class GameDataService : IGameDataService private static GetSongIntroductionResponse.SongIntroductionData ToResponseIntroData(SongIntroductionData data) { - var responseOdaiData = new GetSongIntroductionResponse.SongIntroductionData + var responseIntroData = new GetSongIntroductionResponse.SongIntroductionData { SetId = data.SetId, VerupNo = data.VerupNo, @@ -263,7 +282,18 @@ public class GameDataService : IGameDataService SubSongNoes = data.SubSongNo }; - return responseOdaiData; + return responseIntroData; + } + + private static InitialdatacheckResponse.MovieData ToResponseMovieData(MovieData data) + { + var responseMovieData = new InitialdatacheckResponse.MovieData + { + MovieId = data.MovieId, + EnableDays = data.EnableDays + }; + + return responseMovieData; } private static GetfolderResponse.EventfolderData ToResponseEventFolderData(EventFolderData data) @@ -278,7 +308,7 @@ public class GameDataService : IGameDataService return responseEventFolderData; } - + private static GetShopFolderResponse.ShopFolderData ToResponseShopFolderData(ShopFolderData data) { var responseShopFolderData = new GetShopFolderResponse.ShopFolderData diff --git a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs index dfa0d9f..5c97fd5 100644 --- a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs +++ b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs @@ -18,12 +18,14 @@ public interface IGameDataService public ImmutableDictionary GetSongIntroDictionary(); + public ImmutableDictionary GetMovieDataDictionary(); + public ImmutableDictionary GetFolderDictionary(); - + public ImmutableDictionary GetShopFolderDictionary(); - + public Dictionary GetTokenDataDictionary(); - + public List GetLockedSongsList(); } diff --git a/TaikoLocalServer/Settings/DataSettings.cs b/TaikoLocalServer/Settings/DataSettings.cs index 9f76838..c6d4976 100644 --- a/TaikoLocalServer/Settings/DataSettings.cs +++ b/TaikoLocalServer/Settings/DataSettings.cs @@ -2,15 +2,17 @@ public class DataSettings { - public string DanDataFileName { get; set; } = "dan_data.json"; + public string DanDataFileName { get; set; } = "dan_data.json"; - public string EventFolderDataFileName { get; set; } = "event_folder_data.json"; + public string EventFolderDataFileName { get; set; } = "event_folder_data.json"; - public string IntroDataFileName { get; set; } = "intro_data.json"; - - public string ShopFolderDataFileName { get; set; } = "shop_folder_data.json"; + public string IntroDataFileName { get; set; } = "intro_data.json"; - public string TokenDataFileName { get; set; } = "token_data.json"; + public string MovieDataFileName { get; set; } = "movie_data.json"; - public string LockedSongsDataFileName { get; set; } = "locked_songs_data.json"; + public string ShopFolderDataFileName { get; set; } = "shop_folder_data.json"; + + public string TokenDataFileName { get; set; } = "token_data.json"; + + public string LockedSongsDataFileName { get; set; } = "locked_songs_data.json"; } \ No newline at end of file diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index b82b844..e666b02 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -58,12 +58,24 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/TaikoLocalServer/wwwroot/data/movie_data.json b/TaikoLocalServer/wwwroot/data/movie_data.json new file mode 100644 index 0000000..f26aa0b --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/movie_data.json @@ -0,0 +1,6 @@ +[ + { + "movie_id": 0, + "enable_days": 0 + } +] \ No newline at end of file From 372c972ea7668410277afb9b617ded8005565760 Mon Sep 17 00:00:00 2001 From: asesidaa <1061472754@qq.com> Date: Fri, 15 Sep 2023 02:35:52 +0800 Subject: [PATCH 06/49] Update a bit --- TaikoLocalServer/Configurations/Kestrel.json | 9 ------ .../Controllers/Game/BaidController.cs | 1 + .../Game/InitialDataCheckController.cs | 32 +++++++------------ .../Controllers/Game/MyDonEntryController.cs | 1 + TaikoLocalServer/Program.cs | 17 +++++----- TaikoLocalServer/TaikoLocalServer.csproj | 8 ++--- 6 files changed, 26 insertions(+), 42 deletions(-) diff --git a/TaikoLocalServer/Configurations/Kestrel.json b/TaikoLocalServer/Configurations/Kestrel.json index 1254ce2..dea2b88 100644 --- a/TaikoLocalServer/Configurations/Kestrel.json +++ b/TaikoLocalServer/Configurations/Kestrel.json @@ -4,17 +4,8 @@ "BaseServer": { "Url": "http://0.0.0.0:5000" }, - "AmAuthServer": { - "Url": "http://0.0.0.0:80" - }, - "MuchaServer": { - "Url": "https://0.0.0.0:10122" - }, "GameServer1": { "Url": "https://0.0.0.0:57402" - }, - "GameServer2": { - "Url": "https://0.0.0.0:54431" } }, "Certificates": { diff --git a/TaikoLocalServer/Controllers/Game/BaidController.cs b/TaikoLocalServer/Controllers/Game/BaidController.cs index 33a81d6..e411c66 100644 --- a/TaikoLocalServer/Controllers/Game/BaidController.cs +++ b/TaikoLocalServer/Controllers/Game/BaidController.cs @@ -118,6 +118,7 @@ public class BaidController : BaseController PlayerType = 0, Baid = baid, MydonName = userData.MyDonName, + MydonNameLanguage = 4, Title = userData.Title, TitleplateId = userData.TitlePlateId, ColorFace = userData.ColorFace, diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index a83aab8..8c16e1a 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -24,23 +24,19 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 - { - MasterType = i, - VerupNo = 1 - }) + { + MasterType = i, + VerupNo = 1 + }) .ToList(); var response = new InitialdatacheckResponse @@ -51,11 +47,8 @@ public class InitialDataCheckController : BaseController(); for (var danId = Constants.MIN_DAN_ID; danId <= 18; danId++) { @@ -65,8 +58,7 @@ public class InitialDataCheckController : BaseController Result = 1, Baid = newId, MydonName = request.MydonName, + MydonNameLanguage = 4 }; return Ok(response); diff --git a/TaikoLocalServer/Program.cs b/TaikoLocalServer/Program.cs index beefe30..6254ead 100644 --- a/TaikoLocalServer/Program.cs +++ b/TaikoLocalServer/Program.cs @@ -117,15 +117,6 @@ try app.UseHttpLogging(); - app.MapControllers(); - app.MapFallbackToFile("index.html"); - - app.UseWhen( - context => context.Request.Path.StartsWithSegments("/sys/servlet/PowerOn", StringComparison.InvariantCulture), - applicationBuilder => applicationBuilder.UseAllNetRequestMiddleware()); - - app.Run(); - app.Use(async (context, next) => { await next(); @@ -136,6 +127,14 @@ try context.Connection.RemoteIpAddress, context.Request.Method, context.Request.Path, context.Response.StatusCode); } }); + app.MapControllers(); + app.MapFallbackToFile("index.html"); + + app.UseWhen( + context => context.Request.Path.StartsWithSegments("/sys/servlet/PowerOn", StringComparison.InvariantCulture), + applicationBuilder => applicationBuilder.UseAllNetRequestMiddleware()); + + app.Run(); } catch (Exception ex) { diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index e666b02..e35fee8 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -64,10 +64,10 @@ PreserveNewest - + PreserveNewest - + PreserveNewest @@ -76,7 +76,7 @@ PreserveNewest - + PreserveNewest @@ -91,7 +91,7 @@ PreserveNewest - + PreserveNewest From 872f7ca93a079b8afe0113e439245c705d1cea68 Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Fri, 15 Sep 2023 14:51:56 +0900 Subject: [PATCH 07/49] Update GetGenericMasterController.cs --- .../Controllers/Game/GetGenericMasterController.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs index daede73..283979d 100644 --- a/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs +++ b/TaikoLocalServer/Controllers/Game/GetGenericMasterController.cs @@ -1,7 +1,4 @@ -using Microsoft.Extensions.Options; -using TaikoLocalServer.Settings; - -namespace TaikoLocalServer.Controllers.Game; +namespace TaikoLocalServer.Controllers.Game; [ApiController] [Route("/v12r00_cn/chassis/getgenericmaster.php")] @@ -17,7 +14,7 @@ public class GetGenericMasterController : BaseController Date: Sat, 16 Sep 2023 00:28:37 +0800 Subject: [PATCH 08/49] Reimplemented getSongIntroduction and getFolder in InitialDataCheck --- TaikoLocalServer/Common/Utils/JsonHelper.cs | 1 + .../Game/InitialDataCheckController.cs | 46 +++++++++++++++---- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/TaikoLocalServer/Common/Utils/JsonHelper.cs b/TaikoLocalServer/Common/Utils/JsonHelper.cs index 49549d7..83c87fb 100644 --- a/TaikoLocalServer/Common/Utils/JsonHelper.cs +++ b/TaikoLocalServer/Common/Utils/JsonHelper.cs @@ -10,6 +10,7 @@ public static class JsonHelper var costumeData = new List { 0, 0, 0, 0, 0 }; try { + // logger.LogInformation(userData.CostumeData); costumeData = JsonSerializer.Deserialize>(userData.CostumeData); } catch (JsonException e) diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index 8c16e1a..431b016 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -31,7 +31,7 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 { MasterType = i, @@ -58,18 +58,46 @@ public class InitialDataCheckController : BaseController(); + foreach (var folderId in Constants.EVENT_FOLDER_IDS) + { + eventFolderData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { - MasterType = i, - }; - verUp2.AryInformationDatas.AddRange(danData); - response.AryVerupNoData2s.Add(verUp2); + InfoId = (uint)folderId, + VerupNo = 1 + }); } - response.AryChassisFunctionIds = new uint[] {1,2,3}; + var verUp2Type102 = new InitialdatacheckResponse.VerupNoData2 + { + MasterType = 102, + }; + verUp2Type102.AryInformationDatas.AddRange(eventFolderData); + response.AryVerupNoData2s.Add(verUp2Type102); + var songIntroData = new List(); + var verUp2Type105 = new InitialdatacheckResponse.VerupNoData2 + { + MasterType = 105, + }; + for (var setId = 1; setId <= gameDataService.GetSongIntroDictionary().Count; setId++) + { + songIntroData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData + { + InfoId = (uint)setId, + VerupNo = 1 + }); + } + verUp2Type105.AryInformationDatas.AddRange(songIntroData); + response.AryVerupNoData2s.Add(verUp2Type105); + + response.AryChassisFunctionIds = new uint[] {1,2,3}; return Ok(response); } From 1cb593651fc768ade6e38b7c16046583b6348ef3 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sat, 16 Sep 2023 00:37:42 +0800 Subject: [PATCH 09/49] Fix wrong master type for getFolder --- .../Controllers/Game/InitialDataCheckController.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index 431b016..fae2907 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -74,12 +74,12 @@ public class InitialDataCheckController : BaseController(); var verUp2Type105 = new InitialdatacheckResponse.VerupNoData2 From 7eee09d32d04910f3b53bd61332036c24c3812cf Mon Sep 17 00:00:00 2001 From: asesidaa <1061472754@qq.com> Date: Sat, 16 Sep 2023 00:49:05 +0800 Subject: [PATCH 10/49] Update to .net 8, bump dependencies, fix weird max issue --- .../Game/InitialDataCheckController.cs | 2 +- TaikoLocalServer/Program.cs | 22 ++++--------- TaikoLocalServer/Services/CardService.cs | 2 +- TaikoLocalServer/TaikoLocalServer.csproj | 33 ++++++++++--------- 4 files changed, 25 insertions(+), 34 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index fae2907..bdc1f96 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -50,7 +50,7 @@ public class InitialDataCheckController : BaseController(); - for (var danId = Constants.MIN_DAN_ID; danId <= 18; danId++) + for (var danId = Constants.MIN_DAN_ID; danId <= Constants.MAX_DAN_ID; danId++) { danData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { diff --git a/TaikoLocalServer/Program.cs b/TaikoLocalServer/Program.cs index 6254ead..093f083 100644 --- a/TaikoLocalServer/Program.cs +++ b/TaikoLocalServer/Program.cs @@ -23,22 +23,12 @@ try { var builder = WebApplication.CreateBuilder(args); - builder.Host.ConfigureAppConfiguration((hostingContext, config) => - { - const string configurationsDirectory = "Configurations"; - config.AddJsonFile($"{configurationsDirectory}/Kestrel.json", optional: true, reloadOnChange: false); - config.AddJsonFile($"{configurationsDirectory}/Logging.json", optional: false, reloadOnChange: false); - config.AddJsonFile($"{configurationsDirectory}/Database.json", optional: false, reloadOnChange: false); - config.AddJsonFile($"{configurationsDirectory}/ServerSettings.json", optional: false, reloadOnChange: false); - config.AddJsonFile($"{configurationsDirectory}/DataSettings.json", optional: true, reloadOnChange: false); - }); - - // Manually enable tls 1.0 - builder.WebHost.UseKestrel(kestrelOptions => - { - kestrelOptions.ConfigureHttpsDefaults(options => - options.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13); - }); + const string configurationsDirectory = "Configurations"; + builder.Configuration.AddJsonFile($"{configurationsDirectory}/Kestrel.json", optional: true, reloadOnChange: false); + builder.Configuration.AddJsonFile($"{configurationsDirectory}/Logging.json", optional: false, reloadOnChange: false); + builder.Configuration.AddJsonFile($"{configurationsDirectory}/Database.json", optional: false, reloadOnChange: false); + builder.Configuration.AddJsonFile($"{configurationsDirectory}/ServerSettings.json", optional: false, reloadOnChange: false); + builder.Configuration.AddJsonFile($"{configurationsDirectory}/DataSettings.json", optional: true, reloadOnChange: false); builder.Host.UseSerilog((context, configuration) => { diff --git a/TaikoLocalServer/Services/CardService.cs b/TaikoLocalServer/Services/CardService.cs index 11d36c1..cfb4426 100644 --- a/TaikoLocalServer/Services/CardService.cs +++ b/TaikoLocalServer/Services/CardService.cs @@ -21,7 +21,7 @@ public class CardService : ICardService public ulong GetNextBaid() { - return context.Cards.Any() ? context.Cards.Max(card => card.Baid) + 1 : 1; + return context.Cards.Any() ? context.Cards.ToList().Max(card => card.Baid) + 1 : 1; } public async Task> GetUsersFromCards() diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index e35fee8..bb0da36 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -1,10 +1,11 @@  - net6.0 + net8.0 enable enable - 0.3.0-alpha + 0.4.0-alpha + 12 @@ -12,23 +13,23 @@ - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - + + + + + + + + + + From e8b26e9352d4a6bfe538e0d2568a33f04f7cd99d Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Sat, 16 Sep 2023 02:27:44 +0900 Subject: [PATCH 11/49] Correct initial value of UserDatum.CostumeData --- GameDatabase/Entities/UserDatum.cs | 56 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/GameDatabase/Entities/UserDatum.cs b/GameDatabase/Entities/UserDatum.cs index 3609272..4b4d741 100644 --- a/GameDatabase/Entities/UserDatum.cs +++ b/GameDatabase/Entities/UserDatum.cs @@ -2,33 +2,33 @@ namespace GameDatabase.Entities { - public partial class UserDatum - { - public ulong Baid { get; set; } - public string MyDonName { get; set; } = string.Empty; - public string Title { get; set; } = string.Empty; - public uint TitlePlateId { get; set; } - public string FavoriteSongsArray { get; set; } = "[]"; - public string ToneFlgArray { get; set; } = "[]"; - public string TitleFlgArray { get; set; } = "[]"; - public string CostumeFlgArray { get; set; } = "[[],[],[],[],[]]"; - public string GenericInfoFlgArray { get; set; } = "[]"; - public short OptionSetting { get; set; } - public int NotesPosition { get; set; } - public bool IsVoiceOn { get; set; } - public bool IsSkipOn { get; set; } - public uint SelectedToneId { get; set; } - public DateTime LastPlayDatetime { get; set; } - public uint LastPlayMode { get; set; } - public uint ColorBody { get; set; } - public uint ColorFace { get; set; } - public uint ColorLimb { get; set; } - public string CostumeData { get; set; } = "[[],[],[],[],[]]"; - public bool DisplayDan { get; set; } - public bool DisplayAchievement { get; set; } - public Difficulty AchievementDisplayDifficulty { get; set; } + public partial class UserDatum + { + public ulong Baid { get; set; } + public string MyDonName { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public uint TitlePlateId { get; set; } + public string FavoriteSongsArray { get; set; } = "[]"; + public string ToneFlgArray { get; set; } = "[]"; + public string TitleFlgArray { get; set; } = "[]"; + public string CostumeFlgArray { get; set; } = "[[],[],[],[],[]]"; + public string GenericInfoFlgArray { get; set; } = "[]"; + public short OptionSetting { get; set; } + public int NotesPosition { get; set; } + public bool IsVoiceOn { get; set; } + public bool IsSkipOn { get; set; } + public uint SelectedToneId { get; set; } + public DateTime LastPlayDatetime { get; set; } + public uint LastPlayMode { get; set; } + public uint ColorBody { get; set; } + public uint ColorFace { get; set; } + public uint ColorLimb { get; set; } + public string CostumeData { get; set; } = "[]"; + public bool DisplayDan { get; set; } + public bool DisplayAchievement { get; set; } + public Difficulty AchievementDisplayDifficulty { get; set; } - public int AiWinCount { get; set; } - public virtual Card? Ba { get; set; } - } + public int AiWinCount { get; set; } + public virtual Card? Ba { get; set; } + } } \ No newline at end of file From 05071be3ca48854a2441c9104b72a6defbcf5fea Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sat, 16 Sep 2023 13:17:36 +0800 Subject: [PATCH 12/49] Change C# lang version to 11, disable configurationBindingGenerator --- GameDatabase/GameDatabase.csproj | 2 +- LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj | 2 +- SharedProject/SharedProject.csproj | 2 +- TaikoLocalServer/TaikoLocalServer.csproj | 3 ++- TaikoWebUI/TaikoWebUI.csproj | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/GameDatabase/GameDatabase.csproj b/GameDatabase/GameDatabase.csproj index 79420dd..7030e6a 100644 --- a/GameDatabase/GameDatabase.csproj +++ b/GameDatabase/GameDatabase.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable enable diff --git a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj index ce03ddd..41b84d1 100644 --- a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj +++ b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net8.0 enable enable 1.0.0-beta1 diff --git a/SharedProject/SharedProject.csproj b/SharedProject/SharedProject.csproj index f6af8be..4841f53 100644 --- a/SharedProject/SharedProject.csproj +++ b/SharedProject/SharedProject.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable enable diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index bb0da36..cc7dcb1 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -5,7 +5,8 @@ enable enable 0.4.0-alpha - 12 + 11 + false diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj index b39c692..a7e3096 100644 --- a/TaikoWebUI/TaikoWebUI.csproj +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable enable From 8a4fee9b048bed6f5ce5d00df6a974871b7cd920 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 00:40:07 +0800 Subject: [PATCH 13/49] Reimplemented getTokenCount and songPurchase --- GameDatabase/Entities/UserDatum.cs | 3 +- GameDatabase/GameDatabase.csproj | 2 +- ...ndUnlockedSongIdListToUserdata.Designer.cs | 443 ++++++++++++++++++ ...ountDictAndUnlockedSongIdListToUserdata.cs | 40 ++ .../Migrations/TaikoDbContextModelSnapshot.cs | 74 +-- .../LocalSaveModScoreMigrator.csproj | 2 +- SharedProject/SharedProject.csproj | 2 +- .../Game/GetTokenCountController.cs | 55 ++- .../Game/SongPurchaseController.cs | 60 ++- .../Controllers/Game/UserDataController.cs | 7 +- TaikoWebUI/TaikoWebUI.csproj | 2 +- 11 files changed, 642 insertions(+), 48 deletions(-) create mode 100644 GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.Designer.cs create mode 100644 GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.cs diff --git a/GameDatabase/Entities/UserDatum.cs b/GameDatabase/Entities/UserDatum.cs index 4b4d741..f9a81c0 100644 --- a/GameDatabase/Entities/UserDatum.cs +++ b/GameDatabase/Entities/UserDatum.cs @@ -27,8 +27,9 @@ namespace GameDatabase.Entities public bool DisplayDan { get; set; } public bool DisplayAchievement { get; set; } public Difficulty AchievementDisplayDifficulty { get; set; } - public int AiWinCount { get; set; } + public string TokenCountDict { get; set; } = "{}"; + public string UnlockedSongIdList { get; set; } = "[]"; public virtual Card? Ba { get; set; } } } \ No newline at end of file diff --git a/GameDatabase/GameDatabase.csproj b/GameDatabase/GameDatabase.csproj index 7030e6a..79420dd 100644 --- a/GameDatabase/GameDatabase.csproj +++ b/GameDatabase/GameDatabase.csproj @@ -1,7 +1,7 @@ - net8.0 + net6.0 enable enable diff --git a/GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.Designer.cs b/GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.Designer.cs new file mode 100644 index 0000000..767f34d --- /dev/null +++ b/GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.Designer.cs @@ -0,0 +1,443 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata")] + partial class AddTokenCountDictAndUnlockedSongIdListToUserdata + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-rc.1.22426.7"); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("AiWinCount") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("TokenCountDict") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedSongIdList") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.cs b/GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.cs new file mode 100644 index 0000000..816aee1 --- /dev/null +++ b/GameDatabase/Migrations/20230916161613_AddTokenCountDictAndUnlockedSongIdListToUserdata.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddTokenCountDictAndUnlockedSongIdListToUserdata : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "TokenCountDict", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "UnlockedSongIdList", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: ""); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "TokenCountDict", + table: "UserData"); + + migrationBuilder.DropColumn( + name: "UnlockedSongIdList", + table: "UserData"); + } + } +} diff --git a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs index d3fa35d..0c04119 100644 --- a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs +++ b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs @@ -15,11 +15,11 @@ namespace TaikoLocalServer.Migrations protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "7.0.0-preview.7.22376.2"); + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-rc.1.22426.7"); - modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => { - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.Property("SongId") @@ -36,9 +36,9 @@ namespace TaikoLocalServer.Migrations b.ToTable("AiScoreData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => { - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.Property("SongId") @@ -76,12 +76,12 @@ namespace TaikoLocalServer.Migrations b.ToTable("AiSectionScoreData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.Card", b => + modelBuilder.Entity("GameDatabase.Entities.Card", b => { b.Property("AccessCode") .HasColumnType("TEXT"); - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.HasKey("AccessCode"); @@ -92,9 +92,9 @@ namespace TaikoLocalServer.Migrations b.ToTable("Card", (string)null); }); - modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => { - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.Property("DanId") @@ -119,9 +119,9 @@ namespace TaikoLocalServer.Migrations b.ToTable("DanScoreData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => { - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.Property("DanId") @@ -159,9 +159,9 @@ namespace TaikoLocalServer.Migrations b.ToTable("DanStageScoreData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => { - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.Property("SongId") @@ -187,13 +187,13 @@ namespace TaikoLocalServer.Migrations b.ToTable("SongBestData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.Property("ComboCount") @@ -248,9 +248,9 @@ namespace TaikoLocalServer.Migrations b.ToTable("SongPlayData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => { - b.Property("Baid") + b.Property("Baid") .HasColumnType("INTEGER"); b.Property("AchievementDisplayDifficulty") @@ -326,18 +326,26 @@ namespace TaikoLocalServer.Migrations b.Property("TitlePlateId") .HasColumnType("INTEGER"); + b.Property("TokenCountDict") + .IsRequired() + .HasColumnType("TEXT"); + b.Property("ToneFlgArray") .IsRequired() .HasColumnType("TEXT"); + b.Property("UnlockedSongIdList") + .IsRequired() + .HasColumnType("TEXT"); + b.HasKey("Baid"); b.ToTable("UserData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => { - b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + b.HasOne("GameDatabase.Entities.Card", "Ba") .WithMany() .HasForeignKey("Baid") .HasPrincipalKey("Baid") @@ -347,9 +355,9 @@ namespace TaikoLocalServer.Migrations b.Navigation("Ba"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.AiSectionScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => { - b.HasOne("TaikoLocalServer.Entities.AiScoreDatum", "Parent") + b.HasOne("GameDatabase.Entities.AiScoreDatum", "Parent") .WithMany("AiSectionScoreData") .HasForeignKey("Baid", "SongId", "Difficulty") .OnDelete(DeleteBehavior.Cascade) @@ -358,9 +366,9 @@ namespace TaikoLocalServer.Migrations b.Navigation("Parent"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => { - b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + b.HasOne("GameDatabase.Entities.Card", "Ba") .WithMany() .HasForeignKey("Baid") .HasPrincipalKey("Baid") @@ -370,9 +378,9 @@ namespace TaikoLocalServer.Migrations b.Navigation("Ba"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.DanStageScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => { - b.HasOne("TaikoLocalServer.Entities.DanScoreDatum", "Parent") + b.HasOne("GameDatabase.Entities.DanScoreDatum", "Parent") .WithMany("DanStageScoreData") .HasForeignKey("Baid", "DanId") .OnDelete(DeleteBehavior.Cascade) @@ -381,9 +389,9 @@ namespace TaikoLocalServer.Migrations b.Navigation("Parent"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.SongBestDatum", b => + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => { - b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + b.HasOne("GameDatabase.Entities.Card", "Ba") .WithMany() .HasForeignKey("Baid") .HasPrincipalKey("Baid") @@ -393,9 +401,9 @@ namespace TaikoLocalServer.Migrations b.Navigation("Ba"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.SongPlayDatum", b => + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => { - b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + b.HasOne("GameDatabase.Entities.Card", "Ba") .WithMany() .HasForeignKey("Baid") .HasPrincipalKey("Baid") @@ -405,9 +413,9 @@ namespace TaikoLocalServer.Migrations b.Navigation("Ba"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.UserDatum", b => + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => { - b.HasOne("TaikoLocalServer.Entities.Card", "Ba") + b.HasOne("GameDatabase.Entities.Card", "Ba") .WithMany() .HasForeignKey("Baid") .HasPrincipalKey("Baid") @@ -417,12 +425,12 @@ namespace TaikoLocalServer.Migrations b.Navigation("Ba"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.AiScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => { b.Navigation("AiSectionScoreData"); }); - modelBuilder.Entity("TaikoLocalServer.Entities.DanScoreDatum", b => + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => { b.Navigation("DanStageScoreData"); }); diff --git a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj index 41b84d1..ce03ddd 100644 --- a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj +++ b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net6.0 enable enable 1.0.0-beta1 diff --git a/SharedProject/SharedProject.csproj b/SharedProject/SharedProject.csproj index 4841f53..f6af8be 100644 --- a/SharedProject/SharedProject.csproj +++ b/SharedProject/SharedProject.csproj @@ -1,7 +1,7 @@ - net8.0 + net6.0 enable enable diff --git a/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs index 2dc3a9e..a85b739 100644 --- a/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs +++ b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs @@ -1,15 +1,56 @@ -namespace TaikoLocalServer.Controllers.Game; +using System.Text.Json; +using Throw; + +namespace TaikoLocalServer.Controllers.Game; [Route("/v12r00_cn/chassis/gettokencount.php")] [ApiController] public class GetTokenCountController : BaseController { + private readonly IGameDataService gameDataService; + private readonly IUserDatumService userDatumService; + + public GetTokenCountController(IUserDatumService userDatumService, IGameDataService gameDataService) + { + this.userDatumService = userDatumService; + this.gameDataService = gameDataService; + } + [HttpPost] [Produces("application/protobuf")] - public IActionResult GetTokenCount([FromBody] GetTokenCountRequest request) + public async Task GetTokenCount([FromBody] GetTokenCountRequest request) { Logger.LogInformation("GetTokenCount request : {Request}", request.Stringify()); + var user = await userDatumService.GetFirstUserDatumOrNull(request.Baid); + var tokenDataDictionary = gameDataService.GetTokenDataDictionary(); + tokenDataDictionary.TryGetValue("shopTokenId", out var shopTokenId); + tokenDataDictionary.TryGetValue("kaTokenId", out var kaTokenId); + user.ThrowIfNull($"User with baid {request.Baid} does not exist!"); + + var tokenCountDict = new Dictionary(); + try + { + tokenCountDict = !string.IsNullOrEmpty(user.TokenCountDict) + ? JsonSerializer.Deserialize>(user.TokenCountDict) + : new Dictionary(); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing TokenCountDict data for user with baid {Request} failed!", request.Baid); + } + + tokenCountDict.ThrowIfNull("TokenCountDict should never be null"); + + if (tokenCountDict.Count == 0) tokenCountDict.Add(shopTokenId, 0); + + tokenCountDict.TryAdd(shopTokenId, 0); + + tokenCountDict.TryAdd(kaTokenId, 0); + + user.TokenCountDict = JsonSerializer.Serialize(tokenCountDict); + await userDatumService.UpdateUserDatum(user); + var response = new GetTokenCountResponse { Result = 1 @@ -17,10 +58,16 @@ public class GetTokenCountController : BaseController response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData { - TokenCount = 10, - TokenId = 1 + TokenCount = tokenCountDict[shopTokenId], + TokenId = shopTokenId }); + response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + { + TokenCount = tokenCountDict[kaTokenId], + TokenId = kaTokenId + }); + return Ok(response); } } \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/SongPurchaseController.cs b/TaikoLocalServer/Controllers/Game/SongPurchaseController.cs index b26850c..2240b54 100644 --- a/TaikoLocalServer/Controllers/Game/SongPurchaseController.cs +++ b/TaikoLocalServer/Controllers/Game/SongPurchaseController.cs @@ -1,19 +1,73 @@ -namespace TaikoLocalServer.Controllers.Game; +using System.Text.Json; +using Throw; + +namespace TaikoLocalServer.Controllers.Game; [Route("/v12r00_cn/chassis/songpurchase.php")] [ApiController] public class SongPurchaseController : BaseController { + private readonly IUserDatumService userDatumService; + + public SongPurchaseController(IUserDatumService userDatumService) + { + this.userDatumService = userDatumService; + } + [HttpPost] [Produces("application/protobuf")] - public IActionResult SongPurchase([FromBody] SongPurchaseRequest request) + public async Task SongPurchase([FromBody] SongPurchaseRequest request) { Logger.LogInformation("SongPurchase request : {Request}", request.Stringify()); + var user = await userDatumService.GetFirstUserDatumOrNull(request.Baid); + user.ThrowIfNull($"User with baid {request.Baid} does not exist!"); + + var tokenCountDict = new Dictionary(); + try + { + tokenCountDict = !string.IsNullOrEmpty(user.TokenCountDict) + ? JsonSerializer.Deserialize>(user.TokenCountDict) + : new Dictionary(); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing TokenCountDict data for user with baid {Request} failed!", request.Baid); + } + + tokenCountDict.ThrowIfNull("TokenCountDict should never be null"); + + Logger.LogInformation("Original UnlockedSongIdList: {UnlockedSongIdList}", user.UnlockedSongIdList); + + var unlockedSongIdList = new List(); + try + { + unlockedSongIdList = !string.IsNullOrEmpty(user.UnlockedSongIdList) + ? JsonSerializer.Deserialize>(user.UnlockedSongIdList) + : new List(); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing UnlockedSongIdList data for user with baid {Request} failed!", request.Baid); + } + + unlockedSongIdList.ThrowIfNull("UnlockedSongIdList should never be null"); + + if (tokenCountDict.ContainsKey(request.TokenId)) tokenCountDict[request.TokenId] -= (int)request.Price; + + if (!unlockedSongIdList.Contains(request.SongNo)) unlockedSongIdList.Add(request.SongNo); + + user.TokenCountDict = JsonSerializer.Serialize(tokenCountDict); + user.UnlockedSongIdList = JsonSerializer.Serialize(unlockedSongIdList); + + Logger.LogInformation("Updated UnlockedSongIdList: {UnlockedSongIdList}", user.UnlockedSongIdList); + + await userDatumService.UpdateUserDatum(user); + var response = new SongPurchaseResponse { Result = 1, - TokenCount = (int)(10 - request.Price) + TokenCount = tokenCountDict[request.TokenId] }; return Ok(response); diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs index cca201a..eea2302 100644 --- a/TaikoLocalServer/Controllers/Game/UserDataController.cs +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -118,14 +118,15 @@ public class UserDataController : BaseController TitleFlg = titleArray, ReleaseSongFlg = releaseSongArray, UraReleaseSongFlg = uraSongArray, + AryFavoriteSongNoes = favoriteSongs, + AryRecentSongNoes = recentSongs, DefaultOptionSetting = defaultOptions, + NotesPosition = userData.NotesPosition, IsVoiceOn = userData.IsVoiceOn, IsSkipOn = userData.IsSkipOn, IsChallengecompe = false, SongRecentCnt = (uint)recentSongs.Length, - AryFavoriteSongNoes = favoriteSongs, - AryRecentSongNoes = recentSongs, - NotesPosition = userData.NotesPosition + TotalCreditCnt = 99 }; return Ok(response); diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj index a7e3096..b39c692 100644 --- a/TaikoWebUI/TaikoWebUI.csproj +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -1,7 +1,7 @@ - net8.0 + net6.0 enable enable From fadbed54aeedfef880be7985fe684f2966b27321 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 00:44:11 +0800 Subject: [PATCH 14/49] Add tokenCountDict and unlockedSongIDList into MyDonEntryController --- TaikoLocalServer/Controllers/Game/MyDonEntryController.cs | 4 +++- TaikoLocalServer/Controllers/Game/UserDataController.cs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs b/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs index 6875445..45aeb79 100644 --- a/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs +++ b/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs @@ -43,7 +43,9 @@ public class MyDonEntryController : BaseController ToneFlgArray = "[]", TitleFlgArray = "[]", CostumeFlgArray = "[[],[],[],[],[]]", - GenericInfoFlgArray = "[]" + GenericInfoFlgArray = "[]", + TokenCountDict = "{}", + UnlockedSongIdList = "[]" }; await userDatumService.InsertUserDatum(newUser); diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs index eea2302..1df52b9 100644 --- a/TaikoLocalServer/Controllers/Game/UserDataController.cs +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -126,7 +126,7 @@ public class UserDataController : BaseController IsSkipOn = userData.IsSkipOn, IsChallengecompe = false, SongRecentCnt = (uint)recentSongs.Length, - TotalCreditCnt = 99 + TotalCreditCnt = 0 }; return Ok(response); From c7c380fa0aabc2922ce250e4ef827d6cdd171ba2 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 01:17:44 +0800 Subject: [PATCH 15/49] Implemented turning off shopToken and kaToken, default token_data.json to both tokens turned off --- .../Game/GetShopFolderController.cs | 2 +- .../Game/GetTokenCountController.cs | 41 +++++++++++-------- .../Controllers/Game/UserDataController.cs | 3 +- TaikoLocalServer/Services/GameDataService.cs | 8 ++-- .../Services/Interfaces/IGameDataService.cs | 2 +- TaikoLocalServer/wwwroot/data/token_data.json | 4 +- 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/GetShopFolderController.cs b/TaikoLocalServer/Controllers/Game/GetShopFolderController.cs index fc76e57..e11486d 100644 --- a/TaikoLocalServer/Controllers/Game/GetShopFolderController.cs +++ b/TaikoLocalServer/Controllers/Game/GetShopFolderController.cs @@ -24,7 +24,7 @@ public class GetShopFolderController : BaseController var response = new GetShopFolderResponse { Result = 1, - TokenId = shopTokenId, + TokenId = shopTokenId > 0 ? (uint)shopTokenId : 1, VerupNo = 2 }; diff --git a/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs index a85b739..7993e79 100644 --- a/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs +++ b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs @@ -41,32 +41,37 @@ public class GetTokenCountController : BaseController } tokenCountDict.ThrowIfNull("TokenCountDict should never be null"); - - if (tokenCountDict.Count == 0) tokenCountDict.Add(shopTokenId, 0); - - tokenCountDict.TryAdd(shopTokenId, 0); - - tokenCountDict.TryAdd(kaTokenId, 0); - - user.TokenCountDict = JsonSerializer.Serialize(tokenCountDict); - await userDatumService.UpdateUserDatum(user); - + var response = new GetTokenCountResponse { Result = 1 }; - response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + if (tokenCountDict.Count == 0) tokenCountDict.Add(1, 0); + if (shopTokenId > 0) { - TokenCount = tokenCountDict[shopTokenId], - TokenId = shopTokenId - }); + var castedShopTokenId = (uint)shopTokenId; + tokenCountDict.TryAdd(castedShopTokenId, 0); + response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + { + TokenCount = tokenCountDict[castedShopTokenId], + TokenId = castedShopTokenId + }); + } - response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + if (kaTokenId > 0) { - TokenCount = tokenCountDict[kaTokenId], - TokenId = kaTokenId - }); + var castedKaTokenId = (uint)kaTokenId; + tokenCountDict.TryAdd(castedKaTokenId, 0); + response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + { + TokenCount = tokenCountDict[castedKaTokenId], + TokenId = castedKaTokenId + }); + } + + user.TokenCountDict = JsonSerializer.Serialize(tokenCountDict); + await userDatumService.UpdateUserDatum(user); return Ok(response); } diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs index 1df52b9..582e680 100644 --- a/TaikoLocalServer/Controllers/Game/UserDataController.cs +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -125,8 +125,7 @@ public class UserDataController : BaseController IsVoiceOn = userData.IsVoiceOn, IsSkipOn = userData.IsSkipOn, IsChallengecompe = false, - SongRecentCnt = (uint)recentSongs.Length, - TotalCreditCnt = 0 + SongRecentCnt = (uint)recentSongs.Length }; return Ok(response); diff --git a/TaikoLocalServer/Services/GameDataService.cs b/TaikoLocalServer/Services/GameDataService.cs index 62c0e7a..7c411f4 100644 --- a/TaikoLocalServer/Services/GameDataService.cs +++ b/TaikoLocalServer/Services/GameDataService.cs @@ -39,7 +39,7 @@ public class GameDataService : IGameDataService private List lockedSongsList = new(); - private Dictionary tokenDataDictionary = new(); + private Dictionary tokenDataDictionary = new(); private readonly DataSettings settings; @@ -93,7 +93,7 @@ public class GameDataService : IGameDataService return shopFolderDictionary; } - public Dictionary GetTokenDataDictionary() + public Dictionary GetTokenDataDictionary() { return tokenDataDictionary; } @@ -143,7 +143,7 @@ public class GameDataService : IGameDataService var movieData = await JsonSerializer.DeserializeAsync>(movieDataFile); var eventFolderData = await JsonSerializer.DeserializeAsync>(eventFolderDataFile); var shopFolderData = await JsonSerializer.DeserializeAsync>(shopFolderDataFile); - var tokenData = await JsonSerializer.DeserializeAsync>(tokenDataFile); + var tokenData = await JsonSerializer.DeserializeAsync>(tokenDataFile); var lockedSongsData = await JsonSerializer.DeserializeAsync>(lockedSongsDataFile); InitializeMusicInfoes(infoesData); @@ -242,7 +242,7 @@ public class GameDataService : IGameDataService shopFolderDictionary = shopFolderData.ToImmutableDictionary(data => data.SongNo, ToResponseShopFolderData); } - private void InitializeTokenData(Dictionary? tokenData) + private void InitializeTokenData(Dictionary? tokenData) { tokenData.ThrowIfNull("Shouldn't happen!"); tokenDataDictionary = tokenData; diff --git a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs index 5c97fd5..1b6035c 100644 --- a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs +++ b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs @@ -24,7 +24,7 @@ public interface IGameDataService public ImmutableDictionary GetShopFolderDictionary(); - public Dictionary GetTokenDataDictionary(); + public Dictionary GetTokenDataDictionary(); public List GetLockedSongsList(); } diff --git a/TaikoLocalServer/wwwroot/data/token_data.json b/TaikoLocalServer/wwwroot/data/token_data.json index a590dbb..837057c 100644 --- a/TaikoLocalServer/wwwroot/data/token_data.json +++ b/TaikoLocalServer/wwwroot/data/token_data.json @@ -1,4 +1,4 @@ { - "shopTokenId": 4, - "kaTokenId": 1000 + "shopTokenId": -1, + "kaTokenId": -1 } \ No newline at end of file From 9714bf222b295619702948c7e63cf127c84290ac Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 01:50:47 +0800 Subject: [PATCH 16/49] Implemented soshina and one piece collabo win count, turn on more VerUpNo1s --- .../Game/GetTokenCountController.cs | 24 +++++++++++++++++++ .../Game/InitialDataCheckController.cs | 2 +- TaikoLocalServer/wwwroot/data/token_data.json | 4 +++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs index 7993e79..8993784 100644 --- a/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs +++ b/TaikoLocalServer/Controllers/Game/GetTokenCountController.cs @@ -26,6 +26,8 @@ public class GetTokenCountController : BaseController var tokenDataDictionary = gameDataService.GetTokenDataDictionary(); tokenDataDictionary.TryGetValue("shopTokenId", out var shopTokenId); tokenDataDictionary.TryGetValue("kaTokenId", out var kaTokenId); + tokenDataDictionary.TryGetValue("onePieceTokenId", out var onePieceTokenId); + tokenDataDictionary.TryGetValue("soshinaTokenId", out var soshinaTokenId); user.ThrowIfNull($"User with baid {request.Baid} does not exist!"); var tokenCountDict = new Dictionary(); @@ -69,6 +71,28 @@ public class GetTokenCountController : BaseController TokenId = castedKaTokenId }); } + + if (onePieceTokenId > 0) + { + var castedOnePieceTokenId = (uint)onePieceTokenId; + tokenCountDict.TryAdd(castedOnePieceTokenId, 0); + response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + { + TokenCount = tokenCountDict[castedOnePieceTokenId], + TokenId = castedOnePieceTokenId + }); + } + + if (soshinaTokenId > 0) + { + var castedSoshinaTokenId = (uint)soshinaTokenId; + tokenCountDict.TryAdd(castedSoshinaTokenId, 0); + response.AryTokenCountDatas.Add(new GetTokenCountResponse.TokenCountData + { + TokenCount = tokenCountDict[castedSoshinaTokenId], + TokenId = castedSoshinaTokenId + }); + } user.TokenCountDict = JsonSerializer.Serialize(tokenCountDict); await userDatumService.UpdateUserDatum(user); diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index bdc1f96..4f7323e 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -31,7 +31,7 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 { MasterType = i, diff --git a/TaikoLocalServer/wwwroot/data/token_data.json b/TaikoLocalServer/wwwroot/data/token_data.json index 837057c..a8edc65 100644 --- a/TaikoLocalServer/wwwroot/data/token_data.json +++ b/TaikoLocalServer/wwwroot/data/token_data.json @@ -1,4 +1,6 @@ { "shopTokenId": -1, - "kaTokenId": -1 + "kaTokenId": -1, + "onePieceTokenId": 100100, + "soshinaTokenId": 100200 } \ No newline at end of file From 30acee09ae3b0ea45ea8dbc3e3e375e01b6f84cd Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 04:21:56 +0800 Subject: [PATCH 17/49] Readded accidentally deleted movie handle in initialDataCheck --- .../Game/InitialDataCheckController.cs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index 4f7323e..ea61fd8 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -31,14 +31,6 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 - { - MasterType = i, - VerupNo = 1 - }) - .ToList(); - var response = new InitialdatacheckResponse { Result = 1, @@ -49,6 +41,14 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 + { + MasterType = i, + VerupNo = 1 + }) + .ToList(); + var danData = new List(); for (var danId = Constants.MIN_DAN_ID; danId <= Constants.MAX_DAN_ID; danId++) { @@ -98,6 +98,9 @@ public class InitialDataCheckController : BaseController Date: Sun, 17 Sep 2023 04:23:18 +0800 Subject: [PATCH 18/49] Fix --- .../Controllers/Game/InitialDataCheckController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index ea61fd8..d8dfc37 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -39,8 +39,7 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 { @@ -48,6 +47,7 @@ public class InitialDataCheckController : BaseController(); for (var danId = Constants.MIN_DAN_ID; danId <= Constants.MAX_DAN_ID; danId++) From 5b1f64153216ecb3d0c27d5f4580c794eee1d9b6 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 21:40:00 +0800 Subject: [PATCH 19/49] Pushing the addTokenCountController I forgot to push before --- .../Game/AddTokenCountController.cs | 45 ++++++++++++++++++- .../Controllers/Game/GetDanOdaiController.cs | 8 ++-- .../Game/InitialDataCheckController.cs | 13 ++++-- .../Game/VerifyQrCodeController.cs | 2 +- 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/AddTokenCountController.cs b/TaikoLocalServer/Controllers/Game/AddTokenCountController.cs index fcf0618..36c9fda 100644 --- a/TaikoLocalServer/Controllers/Game/AddTokenCountController.cs +++ b/TaikoLocalServer/Controllers/Game/AddTokenCountController.cs @@ -1,15 +1,56 @@ -namespace TaikoLocalServer.Controllers.Game; +using System.Text.Json; +using Throw; + +namespace TaikoLocalServer.Controllers.Game; [Route("/v12r00_cn/chassis/addtokencount.php")] [ApiController] public class AddTokenCountController : BaseController { + private readonly IUserDatumService userDatumService; + + public AddTokenCountController(IUserDatumService userDatumService) + { + this.userDatumService = userDatumService; + } + [HttpPost] [Produces("application/protobuf")] - public IActionResult AddTokenCount([FromBody] AddTokenCountRequest request) + public async Task AddTokenCount([FromBody] AddTokenCountRequest request) { Logger.LogInformation("AddTokenCount request : {Request}", request.Stringify()); + var user = await userDatumService.GetFirstUserDatumOrNull(request.Baid); + user.ThrowIfNull($"User with baid {request.Baid} does not exist!"); + + var tokenCountDict = new Dictionary(); + try + { + tokenCountDict = !string.IsNullOrEmpty(user.TokenCountDict) + ? JsonSerializer.Deserialize>(user.TokenCountDict) + : new Dictionary(); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing TokenCountDict data for user with baid {Request} failed!", request.Baid); + } + + tokenCountDict.ThrowIfNull("TokenCountDict should never be null"); + + foreach (var addTokenCountData in request.AryAddTokenCountDatas) + { + var tokenId = addTokenCountData.TokenId; + var addTokenCount = addTokenCountData.AddTokenCount; + + if (tokenCountDict.ContainsKey(tokenId)) + tokenCountDict[tokenId] += addTokenCount; + else + tokenCountDict.Add(tokenId, addTokenCount); + } + + user.TokenCountDict = JsonSerializer.Serialize(tokenCountDict); + await userDatumService.UpdateUserDatum(user); + var response = new AddTokenCountResponse { Result = 1 diff --git a/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs index a1072ca..8819e69 100644 --- a/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs +++ b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs @@ -22,10 +22,10 @@ public class GetDanOdaiController : BaseController Result = 1 }; - if (request.Type == 2) - { - return Ok(response); - } + // if (request.Type == 2) + // { + // return Ok(response); + // } foreach (var danId in request.DanIds) { diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index d8dfc37..fc6db04 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -39,6 +39,9 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 @@ -65,6 +68,13 @@ public class InitialDataCheckController : BaseController(); foreach (var folderId in Constants.EVENT_FOLDER_IDS) { @@ -98,9 +108,6 @@ public class InitialDataCheckController : BaseController var response = new VerifyQrcodeResponse { Result = 1, - QrcodeId = 1 + QrcodeId = 999999001 }; return Ok(response); From e440e340fcf3de6463958ec983945627b9f57e5e Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 21:52:28 +0800 Subject: [PATCH 20/49] Readded locking songs in initialDataCheck, updated game constants --- GameDatabase/GameDatabase.csproj | 14 +- .../LocalSaveModScoreMigrator.csproj | 20 +- SharedProject/SharedProject.csproj | 2 +- TaikoLocalServer/Common/Constants.cs | 6 +- .../Configurations/DataSettings.json | 10 +- TaikoLocalServer/Configurations/Database.json | 2 +- TaikoLocalServer/Configurations/Logging.json | 10 +- .../Game/InitialDataCheckController.cs | 22 +- TaikoLocalServer/README.md | 2 +- TaikoLocalServer/TaikoLocalServer.csproj | 164 +-- TaikoLocalServer/wwwroot/data/dan_data.json | 1212 ++++++++--------- .../wwwroot/data/event_folder_data.json | 307 +++-- TaikoLocalServer/wwwroot/data/intro_data.json | 156 ++- TaikoLocalServer/wwwroot/data/movie_data.json | 4 +- TaikoWebUI/TaikoWebUI.csproj | 58 +- TaikoWebUI/wwwroot/index.html | 28 +- TaikoWebUI/wwwroot/style.overrides.css | 2 +- 17 files changed, 1117 insertions(+), 902 deletions(-) diff --git a/GameDatabase/GameDatabase.csproj b/GameDatabase/GameDatabase.csproj index 79420dd..92ffe57 100644 --- a/GameDatabase/GameDatabase.csproj +++ b/GameDatabase/GameDatabase.csproj @@ -7,16 +7,16 @@ - + - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj index ce03ddd..ad877e7 100644 --- a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj +++ b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj @@ -9,19 +9,19 @@ - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + - + diff --git a/SharedProject/SharedProject.csproj b/SharedProject/SharedProject.csproj index f6af8be..9d5d21d 100644 --- a/SharedProject/SharedProject.csproj +++ b/SharedProject/SharedProject.csproj @@ -7,7 +7,7 @@ - + diff --git a/TaikoLocalServer/Common/Constants.cs b/TaikoLocalServer/Common/Constants.cs index 71c96c3..ae4ab64 100644 --- a/TaikoLocalServer/Common/Constants.cs +++ b/TaikoLocalServer/Common/Constants.cs @@ -29,13 +29,13 @@ public static class Constants public const int TONE_UID_MAX = 19; - public const int TITLE_UID_MAX = 814; + public const int TITLE_UID_MAX = 941; - private const int COSTUME_FLAG_1_ARRAY_SIZE = 154; + private const int COSTUME_FLAG_1_ARRAY_SIZE = 156; private const int COSTUME_FLAG_2_ARRAY_SIZE = 140; private const int COSTUME_FLAG_3_ARRAY_SIZE = 156; private const int COSTUME_FLAG_4_ARRAY_SIZE = 58; - private const int COSTUME_FLAG_5_ARRAY_SIZE = 129; + private const int COSTUME_FLAG_5_ARRAY_SIZE = 142; public static readonly int[] CostumeFlagArraySizes = { COSTUME_FLAG_1_ARRAY_SIZE, diff --git a/TaikoLocalServer/Configurations/DataSettings.json b/TaikoLocalServer/Configurations/DataSettings.json index 3e01ff6..cb69bbb 100644 --- a/TaikoLocalServer/Configurations/DataSettings.json +++ b/TaikoLocalServer/Configurations/DataSettings.json @@ -1,7 +1,7 @@ { - "DataSettings" : { - "DanDataFileName" : "dan_data.json", - "EventFolderDataFileName" : "event_folder_data.json", - "IntroDataFileName" : "intro_data.json" - } + "DataSettings": { + "DanDataFileName": "dan_data.json", + "EventFolderDataFileName": "event_folder_data.json", + "IntroDataFileName": "intro_data.json" + } } \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/Database.json b/TaikoLocalServer/Configurations/Database.json index 1dbc08c..976f625 100644 --- a/TaikoLocalServer/Configurations/Database.json +++ b/TaikoLocalServer/Configurations/Database.json @@ -1,3 +1,3 @@ { - "DbFileName" : "taiko.db3" + "DbFileName": "taiko.db3" } \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/Logging.json b/TaikoLocalServer/Configurations/Logging.json index 5a5b182..5a8a8b2 100644 --- a/TaikoLocalServer/Configurations/Logging.json +++ b/TaikoLocalServer/Configurations/Logging.json @@ -1,6 +1,9 @@ { "Serilog": { - "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], + "Using": [ + "Serilog.Sinks.Console", + "Serilog.Sinks.File" + ], "MinimumLevel": { "Default": "Information", "Override": { @@ -20,7 +23,10 @@ "WriteTo": [ { "Name": "File", - "Args": { "path": "./Logs/log-.txt", "rollingInterval": "Day" } + "Args": { + "path": "./Logs/log-.txt", + "rollingInterval": "Day" + } } ] } diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index fc6db04..0ed5d4d 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -24,12 +24,17 @@ public class InitialDataCheckController : BaseController(); foreach (var folderId in Constants.EVENT_FOLDER_IDS) diff --git a/TaikoLocalServer/README.md b/TaikoLocalServer/README.md index 1cd9ad9..3bcf338 100644 --- a/TaikoLocalServer/README.md +++ b/TaikoLocalServer/README.md @@ -1,6 +1,6 @@ # Server -This is the solution for server. +This is the solution for server. Server is implemented with ASP.NET Core 6. ORM is Entity Framework Core 6. Database is SQLite for easier setup. diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index cc7dcb1..dafaa7d 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -6,105 +6,105 @@ enable 0.4.0-alpha 11 - false + false - + - - - + + + - all - runtime; build; native; contentfiles; analyzers; buildtransitive + all + runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - + + + + + + + + + + - - PreserveNewest - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + - - - + + + diff --git a/TaikoLocalServer/wwwroot/data/dan_data.json b/TaikoLocalServer/wwwroot/data/dan_data.json index dae1a65..8c4da29 100644 --- a/TaikoLocalServer/wwwroot/data/dan_data.json +++ b/TaikoLocalServer/wwwroot/data/dan_data.json @@ -1,937 +1,937 @@ [ { - "danId":1, - "verupNo":1, - "title":"5kyuu", - "aryOdaiSong":[ + "danId": 1, + "verupNo": 1, + "title": "5kyuu", + "aryOdaiSong": [ { - "songNo":828, - "level":2, - "isHiddenSongName":false + "songNo": 828, + "level": 2, + "isHiddenSongName": false }, { - "songNo":187, - "level":2, - "isHiddenSongName":false + "songNo": 187, + "level": 2, + "isHiddenSongName": false }, { - "songNo":789, - "level":2, - "isHiddenSongName":false + "songNo": 789, + "level": 2, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":92, - "goldBorderTotal":95 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 92, + "goldBorderTotal": 95 }, { - "odaiType":8, - "borderType":1, - "redBorderTotal":786, - "goldBorderTotal":832 + "odaiType": 8, + "borderType": 1, + "redBorderTotal": 786, + "goldBorderTotal": 832 } ] }, { - "danId":2, - "verupNo":1, - "title":"4kyuu", - "aryOdaiSong":[ + "danId": 2, + "verupNo": 1, + "title": "4kyuu", + "aryOdaiSong": [ { - "songNo":874, - "level":3, - "isHiddenSongName":false + "songNo": 874, + "level": 3, + "isHiddenSongName": false }, { - "songNo":411, - "level":3, - "isHiddenSongName":false + "songNo": 411, + "level": 3, + "isHiddenSongName": false }, { - "songNo":793, - "level":3, - "isHiddenSongName":false + "songNo": 793, + "level": 3, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":94, - "goldBorderTotal":97 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 94, + "goldBorderTotal": 97 }, { - "odaiType":8, - "borderType":1, - "redBorderTotal":970, - "goldBorderTotal":1023 + "odaiType": 8, + "borderType": 1, + "redBorderTotal": 970, + "goldBorderTotal": 1023 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":84, - "goldBorderTotal":65 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 84, + "goldBorderTotal": 65 } ] }, { - "danId":3, - "verupNo":1, - "title":"3kyuu", - "aryOdaiSong":[ + "danId": 3, + "verupNo": 1, + "title": "3kyuu", + "aryOdaiSong": [ { - "songNo":405, - "level":3, - "isHiddenSongName":false + "songNo": 405, + "level": 3, + "isHiddenSongName": false }, { - "songNo":728, - "level":3, - "isHiddenSongName":false + "songNo": 728, + "level": 3, + "isHiddenSongName": false }, { - "songNo":893, - "level":3, - "isHiddenSongName":false + "songNo": 893, + "level": 3, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":95, - "goldBorderTotal":99 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 95, + "goldBorderTotal": 99 }, { - "odaiType":8, - "borderType":1, - "redBorderTotal":1180, - "goldBorderTotal":1230 + "odaiType": 8, + "borderType": 1, + "redBorderTotal": 1180, + "goldBorderTotal": 1230 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":65, - "goldBorderTotal":43 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 65, + "goldBorderTotal": 43 } ] }, { - "danId":4, - "verupNo":1, - "title":"2kyuu", - "aryOdaiSong":[ + "danId": 4, + "verupNo": 1, + "title": "2kyuu", + "aryOdaiSong": [ { - "songNo":140, - "level":3, - "isHiddenSongName":false + "songNo": 140, + "level": 3, + "isHiddenSongName": false }, { - "songNo":414, - "level":3, - "isHiddenSongName":false + "songNo": 414, + "level": 3, + "isHiddenSongName": false }, { - "songNo":354, - "level":3, - "isHiddenSongName":false + "songNo": 354, + "level": 3, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":96, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 96, + "goldBorderTotal": 100 }, { - "odaiType":8, - "borderType":1, - "redBorderTotal":1555, - "goldBorderTotal":1604 + "odaiType": 8, + "borderType": 1, + "redBorderTotal": 1555, + "goldBorderTotal": 1604 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":55, - "goldBorderTotal":27 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 55, + "goldBorderTotal": 27 } ] }, { - "danId":5, - "verupNo":1, - "title":"1kyuu", - "aryOdaiSong":[ + "danId": 5, + "verupNo": 1, + "title": "1kyuu", + "aryOdaiSong": [ { - "songNo":881, - "level":3, - "isHiddenSongName":false + "songNo": 881, + "level": 3, + "isHiddenSongName": false }, { - "songNo":421, - "level":3, - "isHiddenSongName":false + "songNo": 421, + "level": 3, + "isHiddenSongName": false }, { - "songNo":641, - "level":3, - "isHiddenSongName":false + "songNo": 641, + "level": 3, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":96, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 96, + "goldBorderTotal": 100 }, { - "odaiType":8, - "borderType":1, - "redBorderTotal":2135, - "goldBorderTotal":2183 + "odaiType": 8, + "borderType": 1, + "redBorderTotal": 2135, + "goldBorderTotal": 2183 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":40, - "goldBorderTotal":32 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 40, + "goldBorderTotal": 32 } ] }, { - "danId":6, - "verupNo":1, - "title":"1dan", - "aryOdaiSong":[ + "danId": 6, + "verupNo": 1, + "title": "1dan", + "aryOdaiSong": [ { - "songNo":809, - "level":4, - "isHiddenSongName":false + "songNo": 809, + "level": 4, + "isHiddenSongName": false }, { - "songNo":303, - "level":4, - "isHiddenSongName":false + "songNo": 303, + "level": 4, + "isHiddenSongName": false }, { - "songNo":689, - "level":4, - "isHiddenSongName":false + "songNo": 689, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":97, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 97, + "goldBorderTotal": 100 }, { - "odaiType":5, - "borderType":1, - "redBorderTotal":370, - "goldBorderTotal":520 + "odaiType": 5, + "borderType": 1, + "redBorderTotal": 370, + "goldBorderTotal": 520 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":30, - "goldBorderTotal":15 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 30, + "goldBorderTotal": 15 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":43, - "goldBorder_1":54, - "redBorder_2":77, - "goldBorder_2":94, - "redBorder_3":0, - "goldBorder_3":0 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 43, + "goldBorder_1": 54, + "redBorder_2": 77, + "goldBorder_2": 94, + "redBorder_3": 0, + "goldBorder_3": 0 } ] }, { - "danId":7, - "verupNo":1, - "title":"2dan", - "aryOdaiSong":[ + "danId": 7, + "verupNo": 1, + "title": "2dan", + "aryOdaiSong": [ { - "songNo":726, - "level":4, - "isHiddenSongName":false + "songNo": 726, + "level": 4, + "isHiddenSongName": false }, { - "songNo":861, - "level":4, - "isHiddenSongName":false + "songNo": 861, + "level": 4, + "isHiddenSongName": false }, { - "songNo":52, - "level":4, - "isHiddenSongName":false + "songNo": 52, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":98, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 98, + "goldBorderTotal": 100 }, { - "odaiType":5, - "borderType":1, - "redBorderTotal":480, - "goldBorderTotal":647 + "odaiType": 5, + "borderType": 1, + "redBorderTotal": 480, + "goldBorderTotal": 647 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":25, - "goldBorderTotal":16 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 25, + "goldBorderTotal": 16 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":24, - "goldBorder_1":30, - "redBorder_2":16, - "goldBorder_2":20, - "redBorder_3":16, - "goldBorder_3":21 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 24, + "goldBorder_1": 30, + "redBorder_2": 16, + "goldBorder_2": 20, + "redBorder_3": 16, + "goldBorder_3": 21 } ] }, { - "danId":8, - "verupNo":1, - "title":"3dan", - "aryOdaiSong":[ + "danId": 8, + "verupNo": 1, + "title": "3dan", + "aryOdaiSong": [ { - "songNo":804, - "level":4, - "isHiddenSongName":false + "songNo": 804, + "level": 4, + "isHiddenSongName": false }, { - "songNo":474, - "level":4, - "isHiddenSongName":false + "songNo": 474, + "level": 4, + "isHiddenSongName": false }, { - "songNo":141, - "level":4, - "isHiddenSongName":false + "songNo": 141, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":99, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 99, + "goldBorderTotal": 100 }, { - "odaiType":5, - "borderType":1, - "redBorderTotal":590, - "goldBorderTotal":764 + "odaiType": 5, + "borderType": 1, + "redBorderTotal": 590, + "goldBorderTotal": 764 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":24, - "goldBorderTotal":12 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 24, + "goldBorderTotal": 12 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":180, - "goldBorder_1":219, - "redBorder_2":63, - "goldBorder_2":75, - "redBorder_3":32, - "goldBorder_3":41 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 180, + "goldBorder_1": 219, + "redBorder_2": 63, + "goldBorder_2": 75, + "redBorder_3": 32, + "goldBorder_3": 41 } ] }, { - "danId":9, - "verupNo":1, - "title":"4dan", - "aryOdaiSong":[ + "danId": 9, + "verupNo": 1, + "title": "4dan", + "aryOdaiSong": [ { - "songNo":523, - "level":4, - "isHiddenSongName":false + "songNo": 523, + "level": 4, + "isHiddenSongName": false }, { - "songNo":70, - "level":4, - "isHiddenSongName":false + "songNo": 70, + "level": 4, + "isHiddenSongName": false }, { - "songNo":735, - "level":4, - "isHiddenSongName":false + "songNo": 735, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":99, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 99, + "goldBorderTotal": 100 }, { - "odaiType":5, - "borderType":1, - "redBorderTotal":660, - "goldBorderTotal":842 + "odaiType": 5, + "borderType": 1, + "redBorderTotal": 660, + "goldBorderTotal": 842 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":22, - "goldBorderTotal":11 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 22, + "goldBorderTotal": 11 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":121, - "goldBorder_1":141, - "redBorder_2":0, - "goldBorder_2":0, - "redBorder_3":76, - "goldBorder_3":93 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 121, + "goldBorder_1": 141, + "redBorder_2": 0, + "goldBorder_2": 0, + "redBorder_3": 76, + "goldBorder_3": 93 } ] }, { - "danId":10, - "verupNo":1, - "title":"5dan", - "aryOdaiSong":[ + "danId": 10, + "verupNo": 1, + "title": "5dan", + "aryOdaiSong": [ { - "songNo":213, - "level":4, - "isHiddenSongName":false + "songNo": 213, + "level": 4, + "isHiddenSongName": false }, { - "songNo":428, - "level":4, - "isHiddenSongName":false + "songNo": 428, + "level": 4, + "isHiddenSongName": false }, { - "songNo":451, - "level":4, - "isHiddenSongName":false + "songNo": 451, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":99, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 99, + "goldBorderTotal": 100 }, { - "odaiType":5, - "borderType":1, - "redBorderTotal":825, - "goldBorderTotal":1007 + "odaiType": 5, + "borderType": 1, + "redBorderTotal": 825, + "goldBorderTotal": 1007 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":20, - "goldBorderTotal":10 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 20, + "goldBorderTotal": 10 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":33, - "goldBorder_1":40, - "redBorder_2":71, - "goldBorder_2":87, - "redBorder_3":75, - "goldBorder_3":94 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 33, + "goldBorder_1": 40, + "redBorder_2": 71, + "goldBorder_2": 87, + "redBorder_3": 75, + "goldBorder_3": 94 } ] }, { - "danId":11, - "verupNo":1, - "title":"6dan", - "aryOdaiSong":[ + "danId": 11, + "verupNo": 1, + "title": "6dan", + "aryOdaiSong": [ { - "songNo":551, - "level":5, - "isHiddenSongName":false + "songNo": 551, + "level": 5, + "isHiddenSongName": false }, { - "songNo":270, - "level":4, - "isHiddenSongName":false + "songNo": 270, + "level": 4, + "isHiddenSongName": false }, { - "songNo":645, - "level":4, - "isHiddenSongName":false + "songNo": 645, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":2, - "borderType":1, - "redBorderTotal":1530, - "goldBorderTotal":1590 + "odaiType": 2, + "borderType": 1, + "redBorderTotal": 1530, + "goldBorderTotal": 1590 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":18, - "goldBorderTotal":9 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 18, + "goldBorderTotal": 9 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":40, - "goldBorder_1":48, - "redBorder_2":15, - "goldBorder_2":18, - "redBorder_3":4, - "goldBorder_3":5 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 40, + "goldBorder_1": 48, + "redBorder_2": 15, + "goldBorder_2": 18, + "redBorder_3": 4, + "goldBorder_3": 5 } ] }, { - "danId":12, - "verupNo":1, - "title":"7dan", - "aryOdaiSong":[ + "danId": 12, + "verupNo": 1, + "title": "7dan", + "aryOdaiSong": [ { - "songNo":805, - "level":4, - "isHiddenSongName":false + "songNo": 805, + "level": 4, + "isHiddenSongName": false }, { - "songNo":800, - "level":4, - "isHiddenSongName":false + "songNo": 800, + "level": 4, + "isHiddenSongName": false }, { - "songNo":361, - "level":4, - "isHiddenSongName":false + "songNo": 361, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":2, - "borderType":1, - "redBorderTotal":1790, - "goldBorderTotal":1895 + "odaiType": 2, + "borderType": 1, + "redBorderTotal": 1790, + "goldBorderTotal": 1895 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":16, - "goldBorderTotal":8 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 16, + "goldBorderTotal": 8 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":0, - "goldBorder_1":0, - "redBorder_2":44, - "goldBorder_2":52, - "redBorder_3":33, - "goldBorder_3":37 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 0, + "goldBorder_1": 0, + "redBorder_2": 44, + "goldBorder_2": 52, + "redBorder_3": 33, + "goldBorder_3": 37 } ] }, { - "danId":13, - "verupNo":1, - "title":"8dan", - "aryOdaiSong":[ + "danId": 13, + "verupNo": 1, + "title": "8dan", + "aryOdaiSong": [ { - "songNo":239, - "level":4, - "isHiddenSongName":false + "songNo": 239, + "level": 4, + "isHiddenSongName": false }, { - "songNo":866, - "level":4, - "isHiddenSongName":false + "songNo": 866, + "level": 4, + "isHiddenSongName": false }, { - "songNo":431, - "level":4, - "isHiddenSongName":false + "songNo": 431, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":2, - "borderType":1, - "redBorderTotal":1940, - "goldBorderTotal":2020 + "odaiType": 2, + "borderType": 1, + "redBorderTotal": 1940, + "goldBorderTotal": 2020 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":13, - "goldBorderTotal":6 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 13, + "goldBorderTotal": 6 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":18, - "goldBorder_1":20, - "redBorder_2":158, - "goldBorder_2":187, - "redBorder_3":72, - "goldBorder_3":84 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 18, + "goldBorder_1": 20, + "redBorder_2": 158, + "goldBorder_2": 187, + "redBorder_3": 72, + "goldBorder_3": 84 } ] }, { - "danId":14, - "verupNo":1, - "title":"9dan", - "aryOdaiSong":[ + "danId": 14, + "verupNo": 1, + "title": "9dan", + "aryOdaiSong": [ { - "songNo":785, - "level":4, - "isHiddenSongName":false + "songNo": 785, + "level": 4, + "isHiddenSongName": false }, { - "songNo":780, - "level":4, - "isHiddenSongName":false + "songNo": 780, + "level": 4, + "isHiddenSongName": false }, { - "songNo":779, - "level":4, - "isHiddenSongName":false + "songNo": 779, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":2, - "borderType":1, - "redBorderTotal":2260, - "goldBorderTotal":2330 + "odaiType": 2, + "borderType": 1, + "redBorderTotal": 2260, + "goldBorderTotal": 2330 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":12, - "goldBorderTotal":6 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 12, + "goldBorderTotal": 6 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":44, - "goldBorder_1":51, - "redBorder_2":207, - "goldBorder_2":243, - "redBorder_3":6, - "goldBorder_3":8 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 44, + "goldBorder_1": 51, + "redBorder_2": 207, + "goldBorder_2": 243, + "redBorder_3": 6, + "goldBorder_3": 8 } ] }, { - "danId":15, - "verupNo":1, - "title":"10dan", - "aryOdaiSong":[ + "danId": 15, + "verupNo": 1, + "title": "10dan", + "aryOdaiSong": [ { - "songNo":759, - "level":4, - "isHiddenSongName":false + "songNo": 759, + "level": 4, + "isHiddenSongName": false }, { - "songNo":719, - "level":4, - "isHiddenSongName":false + "songNo": 719, + "level": 4, + "isHiddenSongName": false }, { - "songNo":905, - "level":4, - "isHiddenSongName":false + "songNo": 905, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":3, - "borderType":2, - "redBorder_1":30, - "goldBorder_1":13, - "redBorder_2":30, - "goldBorder_2":13, - "redBorder_3":28, - "goldBorder_3":12 + "odaiType": 3, + "borderType": 2, + "redBorder_1": 30, + "goldBorder_1": 13, + "redBorder_2": 30, + "goldBorder_2": 13, + "redBorder_3": 28, + "goldBorder_3": 12 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":7, - "goldBorderTotal":3 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 7, + "goldBorderTotal": 3 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":26, - "goldBorder_1":31, - "redBorder_2":59, - "goldBorder_2":70, - "redBorder_3":53, - "goldBorder_3":61 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 26, + "goldBorder_1": 31, + "redBorder_2": 59, + "goldBorder_2": 70, + "redBorder_3": 53, + "goldBorder_3": 61 } ] }, { - "danId":16, - "verupNo":1, - "title":"11dan", - "aryOdaiSong":[ + "danId": 16, + "verupNo": 1, + "title": "11dan", + "aryOdaiSong": [ { - "songNo":595, - "level":4, - "isHiddenSongName":false + "songNo": 595, + "level": 4, + "isHiddenSongName": false }, { - "songNo":714, - "level":4, - "isHiddenSongName":false + "songNo": 714, + "level": 4, + "isHiddenSongName": false }, { - "songNo":961, - "level":4, - "isHiddenSongName":false + "songNo": 961, + "level": 4, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":3, - "borderType":1, - "redBorderTotal":50, - "goldBorderTotal":25 + "odaiType": 3, + "borderType": 1, + "redBorderTotal": 50, + "goldBorderTotal": 25 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":6, - "goldBorderTotal":3 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 6, + "goldBorderTotal": 3 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":105, - "goldBorder_1":111, - "redBorder_2":32, - "goldBorder_2":34, - "redBorder_3":38, - "goldBorder_3":41 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 105, + "goldBorder_1": 111, + "redBorder_2": 32, + "goldBorder_2": 34, + "redBorder_3": 38, + "goldBorder_3": 41 } ] }, { - "danId":17, - "verupNo":1, - "title":"12dan", - "aryOdaiSong":[ + "danId": 17, + "verupNo": 1, + "title": "12dan", + "aryOdaiSong": [ { - "songNo":859, - "level":4, - "isHiddenSongName":false + "songNo": 859, + "level": 4, + "isHiddenSongName": false }, { - "songNo":720, - "level":4, - "isHiddenSongName":false + "songNo": 720, + "level": 4, + "isHiddenSongName": false }, { - "songNo":959, - "level":5, - "isHiddenSongName":false + "songNo": 959, + "level": 5, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":3, - "borderType":1, - "redBorderTotal":30, - "goldBorderTotal":15 + "odaiType": 3, + "borderType": 1, + "redBorderTotal": 30, + "goldBorderTotal": 15 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":5, - "goldBorderTotal":2 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 5, + "goldBorderTotal": 2 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":4, - "goldBorder_1":5, - "redBorder_2":49, - "goldBorder_2":52, - "redBorder_3":6, - "goldBorder_3":7 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 4, + "goldBorder_1": 5, + "redBorder_2": 49, + "goldBorder_2": 52, + "redBorder_3": 6, + "goldBorder_3": 7 } ] }, { - "danId":18, - "verupNo":1, - "title":"13dan", - "aryOdaiSong":[ + "danId": 18, + "verupNo": 1, + "title": "13dan", + "aryOdaiSong": [ { - "songNo":777, - "level":4, - "isHiddenSongName":false + "songNo": 777, + "level": 4, + "isHiddenSongName": false }, { - "songNo":716, - "level":5, - "isHiddenSongName":false + "songNo": 716, + "level": 5, + "isHiddenSongName": false }, { - "songNo":958, - "level":5, - "isHiddenSongName":false + "songNo": 958, + "level": 5, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":3, - "borderType":1, - "redBorderTotal":15, - "goldBorderTotal":6 + "odaiType": 3, + "borderType": 1, + "redBorderTotal": 15, + "goldBorderTotal": 6 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":4, - "goldBorderTotal":2 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 4, + "goldBorderTotal": 2 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":151, - "goldBorder_1":159, - "redBorder_2":8, - "goldBorder_2":9, - "redBorder_3":34, - "goldBorder_3":36 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 151, + "goldBorder_1": 159, + "redBorder_2": 8, + "goldBorder_2": 9, + "redBorder_3": 34, + "goldBorder_3": 36 } ] }, { - "danId":19, - "verupNo":1, - "title":"14dan", - "aryOdaiSong":[ + "danId": 19, + "verupNo": 1, + "title": "14dan", + "aryOdaiSong": [ { - "songNo":627, - "level":4, - "isHiddenSongName":false + "songNo": 627, + "level": 4, + "isHiddenSongName": false }, { - "songNo":463, - "level":4, - "isHiddenSongName":false + "songNo": 463, + "level": 4, + "isHiddenSongName": false }, { - "songNo":960, - "level":5, - "isHiddenSongName":false + "songNo": 960, + "level": 5, + "isHiddenSongName": false } ], - "aryOdaiBorder":[ + "aryOdaiBorder": [ { - "odaiType":1, - "borderType":1, - "redBorderTotal":100, - "goldBorderTotal":100 + "odaiType": 1, + "borderType": 1, + "redBorderTotal": 100, + "goldBorderTotal": 100 }, { - "odaiType":3, - "borderType":1, - "redBorderTotal":8, - "goldBorderTotal":1 + "odaiType": 3, + "borderType": 1, + "redBorderTotal": 8, + "goldBorderTotal": 1 }, { - "odaiType":4, - "borderType":1, - "redBorderTotal":3, - "goldBorderTotal":1 + "odaiType": 4, + "borderType": 1, + "redBorderTotal": 3, + "goldBorderTotal": 1 }, { - "odaiType":6, - "borderType":2, - "redBorder_1":13, - "goldBorder_1":14, - "redBorder_2":25, - "goldBorder_2":27, - "redBorder_3":124, - "goldBorder_3":131 + "odaiType": 6, + "borderType": 2, + "redBorder_1": 13, + "goldBorder_1": 14, + "redBorder_2": 25, + "goldBorder_2": 27, + "redBorder_3": 124, + "goldBorder_3": 131 } ] } diff --git a/TaikoLocalServer/wwwroot/data/event_folder_data.json b/TaikoLocalServer/wwwroot/data/event_folder_data.json index 9e5dd84..518590b 100644 --- a/TaikoLocalServer/wwwroot/data/event_folder_data.json +++ b/TaikoLocalServer/wwwroot/data/event_folder_data.json @@ -1,84 +1,227 @@ [ - { - "folderId": 1, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 2, - "verupNo": 1, - "priority": 1, - "songNo": [ - 478, 153, 200, 482, 511, 672, 675, 646, 644, 645, 676, 671, 479, - 707, 480, 481, 203, 204, 483, 205, 202, 241, 14, 387, 197, 281, 226, - 484, 543, 512, 709, 35 - ] - }, - { - "folderId": 3, - "verupNo": 1, - "priority": 1, - "songNo": [ - 1485, 1404, 1580, 1730, 1750, 1277, 1478, 1481, 1482, 1484, 1500, - 1890, 2349, 2604, 2640, 1176, 1419, 1596, 1693, 2248, 1049, 1221, - 1222, 1223, 1224, 1493, 1578, 1719, 2650, 1595, 1964, 1469, 1217, - 1314, 1406, 1565, 1745, 2120, 2200, 2324, 2785, 1631, 2301, 2802, - 1490, 2088, 2268, 2309, 2507, 2126, 1630, 2509, 1263, 2495, 2642, - 2745, 1054, 2583, 1271, 1266, 1267, 2923 - ] - }, - { - "folderId": 4, - "verupNo": 1, - "priority": 1, - "songNo": [ - 1361, 1366, 1373, 1379, 1337, 1345, 1357, 1362, 1367, 1368, 1369, - 1374, 1375, 1388, 1390, 1579, 2225, 1354, 1394, 2804, 1340, 1341, - 1370, 1376, 1384, 1359, 1385, 2416, 2756, 1363, 1920, 1353, 1360, - 1381, 1389, 1364, 1391, 1342, 1546, 1931 - ] - }, - { - "folderId": 5, - "verupNo": 1, - "priority": 1, - "songNo": [242, 430, 368, 604, 333] - }, - { - "folderId": 6, - "verupNo": 1, - "priority": 1, - "songNo": [841, 767, 658, 467, 468, 466, 460, 157, 465] - }, - { - "folderId": 7, - "verupNo": 1, - "priority": 1, - "songNo": [733, 732, 44, 790, 894] - }, - { - "folderId": 8, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 12, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 13, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 14, - "verupNo": 1, - "priority": 1, - "songNo": [] - } + { + "folderId": 1, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 2, + "verupNo": 1, + "priority": 1, + "songNo": [ + 478, + 153, + 200, + 482, + 511, + 672, + 675, + 646, + 644, + 645, + 676, + 671, + 479, + 707, + 480, + 481, + 203, + 204, + 483, + 205, + 202, + 241, + 14, + 387, + 197, + 281, + 226, + 484, + 543, + 512, + 709, + 35 + ] + }, + { + "folderId": 3, + "verupNo": 1, + "priority": 1, + "songNo": [ + 1485, + 1404, + 1580, + 1730, + 1750, + 1277, + 1478, + 1481, + 1482, + 1484, + 1500, + 1890, + 2349, + 2604, + 2640, + 1176, + 1419, + 1596, + 1693, + 2248, + 1049, + 1221, + 1222, + 1223, + 1224, + 1493, + 1578, + 1719, + 2650, + 1595, + 1964, + 1469, + 1217, + 1314, + 1406, + 1565, + 1745, + 2120, + 2200, + 2324, + 2785, + 1631, + 2301, + 2802, + 1490, + 2088, + 2268, + 2309, + 2507, + 2126, + 1630, + 2509, + 1263, + 2495, + 2642, + 2745, + 1054, + 2583, + 1271, + 1266, + 1267, + 2923 + ] + }, + { + "folderId": 4, + "verupNo": 1, + "priority": 1, + "songNo": [ + 1361, + 1366, + 1373, + 1379, + 1337, + 1345, + 1357, + 1362, + 1367, + 1368, + 1369, + 1374, + 1375, + 1388, + 1390, + 1579, + 2225, + 1354, + 1394, + 2804, + 1340, + 1341, + 1370, + 1376, + 1384, + 1359, + 1385, + 2416, + 2756, + 1363, + 1920, + 1353, + 1360, + 1381, + 1389, + 1364, + 1391, + 1342, + 1546, + 1931 + ] + }, + { + "folderId": 5, + "verupNo": 1, + "priority": 1, + "songNo": [ + 242, + 430, + 368, + 604, + 333 + ] + }, + { + "folderId": 6, + "verupNo": 1, + "priority": 1, + "songNo": [ + 841, + 767, + 658, + 467, + 468, + 466, + 460, + 157, + 465 + ] + }, + { + "folderId": 7, + "verupNo": 1, + "priority": 1, + "songNo": [ + 733, + 732, + 44, + 790, + 894 + ] + }, + { + "folderId": 8, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 12, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 13, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 14, + "verupNo": 1, + "priority": 1, + "songNo": [] + } ] diff --git a/TaikoLocalServer/wwwroot/data/intro_data.json b/TaikoLocalServer/wwwroot/data/intro_data.json index ac08a5c..0cbb8fb 100644 --- a/TaikoLocalServer/wwwroot/data/intro_data.json +++ b/TaikoLocalServer/wwwroot/data/intro_data.json @@ -1,74 +1,134 @@ [ { - "setId":1, - "verupNo":1, - "mainSongNo":895, - "subSongNo":[894,732,44,921] + "setId": 1, + "verupNo": 1, + "mainSongNo": 895, + "subSongNo": [ + 894, + 732, + 44, + 921 + ] }, { - "setId":2, - "verupNo":1, - "mainSongNo":912, - "subSongNo":[827,871,36,227] + "setId": 2, + "verupNo": 1, + "mainSongNo": 912, + "subSongNo": [ + 827, + 871, + 36, + 227 + ] }, { - "setId":3, - "verupNo":1, - "mainSongNo":913, - "subSongNo":[460,916,430,872] + "setId": 3, + "verupNo": 1, + "mainSongNo": 913, + "subSongNo": [ + 460, + 916, + 430, + 872 + ] }, { - "setId":4, - "verupNo":1, - "mainSongNo":842, - "subSongNo":[7,233,256,831] + "setId": 4, + "verupNo": 1, + "mainSongNo": 842, + "subSongNo": [ + 7, + 233, + 256, + 831 + ] }, { - "setId":5, - "verupNo":1, - "mainSongNo":947, - "subSongNo":[926,882,730,695] + "setId": 5, + "verupNo": 1, + "mainSongNo": 947, + "subSongNo": [ + 926, + 882, + 730, + 695 + ] }, { - "setId":6, - "verupNo":1, - "mainSongNo":937, - "subSongNo":[828,925,474,924] + "setId": 6, + "verupNo": 1, + "mainSongNo": 937, + "subSongNo": [ + 828, + 925, + 474, + 924 + ] }, { - "setId":7, - "verupNo":1, - "mainSongNo":956, - "subSongNo":[839,255,285,187] + "setId": 7, + "verupNo": 1, + "mainSongNo": 956, + "subSongNo": [ + 839, + 255, + 285, + 187 + ] }, { - "setId":8, - "verupNo":1, - "mainSongNo":923, - "subSongNo":[729,873,789,893] + "setId": 8, + "verupNo": 1, + "mainSongNo": 923, + "subSongNo": [ + 729, + 873, + 789, + 893 + ] }, { - "setId":9, - "verupNo":1, - "mainSongNo":915, - "subSongNo":[726,811,711,303] + "setId": 9, + "verupNo": 1, + "mainSongNo": 915, + "subSongNo": [ + 726, + 811, + 711, + 303 + ] }, { - "setId":10, - "verupNo":1, - "mainSongNo":885, - "subSongNo":[837,464,801,18] + "setId": 10, + "verupNo": 1, + "mainSongNo": 885, + "subSongNo": [ + 837, + 464, + 801, + 18 + ] }, { - "setId":11, - "verupNo":1, - "mainSongNo":898, - "subSongNo":[47,135,374,792] + "setId": 11, + "verupNo": 1, + "mainSongNo": 898, + "subSongNo": [ + 47, + 135, + 374, + 792 + ] }, { - "setId":12, - "verupNo":1, - "mainSongNo":948, - "subSongNo":[412,538,411,413] + "setId": 12, + "verupNo": 1, + "mainSongNo": 948, + "subSongNo": [ + 412, + 538, + 411, + 413 + ] } ] \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/movie_data.json b/TaikoLocalServer/wwwroot/data/movie_data.json index f26aa0b..00e2ed7 100644 --- a/TaikoLocalServer/wwwroot/data/movie_data.json +++ b/TaikoLocalServer/wwwroot/data/movie_data.json @@ -1,6 +1,6 @@ [ { - "movie_id": 0, - "enable_days": 0 + "movie_id": 0, + "enable_days": 0 } ] \ No newline at end of file diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj index b39c692..cd2c7f3 100644 --- a/TaikoWebUI/TaikoWebUI.csproj +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -7,44 +7,44 @@ - - - - - - + + + + + + - + - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + - + diff --git a/TaikoWebUI/wwwroot/index.html b/TaikoWebUI/wwwroot/index.html index 17a13c8..e048a30 100644 --- a/TaikoWebUI/wwwroot/index.html +++ b/TaikoWebUI/wwwroot/index.html @@ -2,25 +2,25 @@ - - + + TaikoWebUI - - - - + + + + -
Loading...
+
Loading...
-
- An unhandled error has occurred. - Reload - 🗙 -
- - +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + \ No newline at end of file diff --git a/TaikoWebUI/wwwroot/style.overrides.css b/TaikoWebUI/wwwroot/style.overrides.css index e1a5915..427818b 100644 --- a/TaikoWebUI/wwwroot/style.overrides.css +++ b/TaikoWebUI/wwwroot/style.overrides.css @@ -3,7 +3,7 @@ } .mud-progress-linear.bar-pass-gold .mud-progress-linear-bars .mud-progress-linear-bar { - background: linear-gradient( 90deg, rgb(255,83,147) 0%, rgb(255,248,6) 15%, rgb(255,248,6) 20%, rgb(122,255,79) 30%, rgb(122,244,255) 45%, rgb(149,104,255) 70%, rgb(255,98,244) 90%, rgb(255,98,244) 95%, rgb(255,83,147) 100% ); + background: linear-gradient(90deg, rgb(255, 83, 147) 0%, rgb(255, 248, 6) 15%, rgb(255, 248, 6) 20%, rgb(122, 255, 79) 30%, rgb(122, 244, 255) 45%, rgb(149, 104, 255) 70%, rgb(255, 98, 244) 90%, rgb(255, 98, 244) 95%, rgb(255, 83, 147) 100%); } .mud-progress-linear.bar-pass-red .mud-progress-linear-bars .mud-progress-linear-bar { From d476d323d998a819511f89a8f65b4820451a51c8 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 22:07:41 +0800 Subject: [PATCH 21/49] Revert "Readded locking songs in initialDataCheck, updated game constants" This reverts commit e440e340fcf3de6463958ec983945627b9f57e5e. --- GameDatabase/GameDatabase.csproj | 14 +- .../LocalSaveModScoreMigrator.csproj | 20 +- SharedProject/SharedProject.csproj | 2 +- TaikoLocalServer/Common/Constants.cs | 6 +- .../Configurations/DataSettings.json | 10 +- TaikoLocalServer/Configurations/Database.json | 2 +- TaikoLocalServer/Configurations/Logging.json | 10 +- .../Game/InitialDataCheckController.cs | 22 +- TaikoLocalServer/README.md | 2 +- TaikoLocalServer/TaikoLocalServer.csproj | 164 +-- TaikoLocalServer/wwwroot/data/dan_data.json | 1212 ++++++++--------- .../wwwroot/data/event_folder_data.json | 307 ++--- TaikoLocalServer/wwwroot/data/intro_data.json | 156 +-- TaikoLocalServer/wwwroot/data/movie_data.json | 4 +- TaikoWebUI/TaikoWebUI.csproj | 58 +- TaikoWebUI/wwwroot/index.html | 28 +- TaikoWebUI/wwwroot/style.overrides.css | 2 +- 17 files changed, 902 insertions(+), 1117 deletions(-) diff --git a/GameDatabase/GameDatabase.csproj b/GameDatabase/GameDatabase.csproj index 92ffe57..79420dd 100644 --- a/GameDatabase/GameDatabase.csproj +++ b/GameDatabase/GameDatabase.csproj @@ -7,16 +7,16 @@ - + - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj index ad877e7..ce03ddd 100644 --- a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj +++ b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj @@ -9,19 +9,19 @@ - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + - + diff --git a/SharedProject/SharedProject.csproj b/SharedProject/SharedProject.csproj index 9d5d21d..f6af8be 100644 --- a/SharedProject/SharedProject.csproj +++ b/SharedProject/SharedProject.csproj @@ -7,7 +7,7 @@ - + diff --git a/TaikoLocalServer/Common/Constants.cs b/TaikoLocalServer/Common/Constants.cs index ae4ab64..71c96c3 100644 --- a/TaikoLocalServer/Common/Constants.cs +++ b/TaikoLocalServer/Common/Constants.cs @@ -29,13 +29,13 @@ public static class Constants public const int TONE_UID_MAX = 19; - public const int TITLE_UID_MAX = 941; + public const int TITLE_UID_MAX = 814; - private const int COSTUME_FLAG_1_ARRAY_SIZE = 156; + private const int COSTUME_FLAG_1_ARRAY_SIZE = 154; private const int COSTUME_FLAG_2_ARRAY_SIZE = 140; private const int COSTUME_FLAG_3_ARRAY_SIZE = 156; private const int COSTUME_FLAG_4_ARRAY_SIZE = 58; - private const int COSTUME_FLAG_5_ARRAY_SIZE = 142; + private const int COSTUME_FLAG_5_ARRAY_SIZE = 129; public static readonly int[] CostumeFlagArraySizes = { COSTUME_FLAG_1_ARRAY_SIZE, diff --git a/TaikoLocalServer/Configurations/DataSettings.json b/TaikoLocalServer/Configurations/DataSettings.json index cb69bbb..3e01ff6 100644 --- a/TaikoLocalServer/Configurations/DataSettings.json +++ b/TaikoLocalServer/Configurations/DataSettings.json @@ -1,7 +1,7 @@ { - "DataSettings": { - "DanDataFileName": "dan_data.json", - "EventFolderDataFileName": "event_folder_data.json", - "IntroDataFileName": "intro_data.json" - } + "DataSettings" : { + "DanDataFileName" : "dan_data.json", + "EventFolderDataFileName" : "event_folder_data.json", + "IntroDataFileName" : "intro_data.json" + } } \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/Database.json b/TaikoLocalServer/Configurations/Database.json index 976f625..1dbc08c 100644 --- a/TaikoLocalServer/Configurations/Database.json +++ b/TaikoLocalServer/Configurations/Database.json @@ -1,3 +1,3 @@ { - "DbFileName": "taiko.db3" + "DbFileName" : "taiko.db3" } \ No newline at end of file diff --git a/TaikoLocalServer/Configurations/Logging.json b/TaikoLocalServer/Configurations/Logging.json index 5a8a8b2..5a5b182 100644 --- a/TaikoLocalServer/Configurations/Logging.json +++ b/TaikoLocalServer/Configurations/Logging.json @@ -1,9 +1,6 @@ { "Serilog": { - "Using": [ - "Serilog.Sinks.Console", - "Serilog.Sinks.File" - ], + "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], "MinimumLevel": { "Default": "Information", "Override": { @@ -23,10 +20,7 @@ "WriteTo": [ { "Name": "File", - "Args": { - "path": "./Logs/log-.txt", - "rollingInterval": "Day" - } + "Args": { "path": "./Logs/log-.txt", "rollingInterval": "Day" } } ] } diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index 0ed5d4d..fc6db04 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -24,17 +24,12 @@ public class InitialDataCheckController : BaseController(); foreach (var folderId in Constants.EVENT_FOLDER_IDS) diff --git a/TaikoLocalServer/README.md b/TaikoLocalServer/README.md index 3bcf338..1cd9ad9 100644 --- a/TaikoLocalServer/README.md +++ b/TaikoLocalServer/README.md @@ -1,6 +1,6 @@ # Server -This is the solution for server. +This is the solution for server. Server is implemented with ASP.NET Core 6. ORM is Entity Framework Core 6. Database is SQLite for easier setup. diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index dafaa7d..cc7dcb1 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -6,105 +6,105 @@ enable 0.4.0-alpha 11 - false + false - + - - - + + + - all - runtime; build; native; contentfiles; analyzers; buildtransitive + all + runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - + + + + + + + + + + - - PreserveNewest - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + - - - + + + diff --git a/TaikoLocalServer/wwwroot/data/dan_data.json b/TaikoLocalServer/wwwroot/data/dan_data.json index 8c4da29..dae1a65 100644 --- a/TaikoLocalServer/wwwroot/data/dan_data.json +++ b/TaikoLocalServer/wwwroot/data/dan_data.json @@ -1,937 +1,937 @@ [ { - "danId": 1, - "verupNo": 1, - "title": "5kyuu", - "aryOdaiSong": [ + "danId":1, + "verupNo":1, + "title":"5kyuu", + "aryOdaiSong":[ { - "songNo": 828, - "level": 2, - "isHiddenSongName": false + "songNo":828, + "level":2, + "isHiddenSongName":false }, { - "songNo": 187, - "level": 2, - "isHiddenSongName": false + "songNo":187, + "level":2, + "isHiddenSongName":false }, { - "songNo": 789, - "level": 2, - "isHiddenSongName": false + "songNo":789, + "level":2, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 92, - "goldBorderTotal": 95 + "odaiType":1, + "borderType":1, + "redBorderTotal":92, + "goldBorderTotal":95 }, { - "odaiType": 8, - "borderType": 1, - "redBorderTotal": 786, - "goldBorderTotal": 832 + "odaiType":8, + "borderType":1, + "redBorderTotal":786, + "goldBorderTotal":832 } ] }, { - "danId": 2, - "verupNo": 1, - "title": "4kyuu", - "aryOdaiSong": [ + "danId":2, + "verupNo":1, + "title":"4kyuu", + "aryOdaiSong":[ { - "songNo": 874, - "level": 3, - "isHiddenSongName": false + "songNo":874, + "level":3, + "isHiddenSongName":false }, { - "songNo": 411, - "level": 3, - "isHiddenSongName": false + "songNo":411, + "level":3, + "isHiddenSongName":false }, { - "songNo": 793, - "level": 3, - "isHiddenSongName": false + "songNo":793, + "level":3, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 94, - "goldBorderTotal": 97 + "odaiType":1, + "borderType":1, + "redBorderTotal":94, + "goldBorderTotal":97 }, { - "odaiType": 8, - "borderType": 1, - "redBorderTotal": 970, - "goldBorderTotal": 1023 + "odaiType":8, + "borderType":1, + "redBorderTotal":970, + "goldBorderTotal":1023 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 84, - "goldBorderTotal": 65 + "odaiType":4, + "borderType":1, + "redBorderTotal":84, + "goldBorderTotal":65 } ] }, { - "danId": 3, - "verupNo": 1, - "title": "3kyuu", - "aryOdaiSong": [ + "danId":3, + "verupNo":1, + "title":"3kyuu", + "aryOdaiSong":[ { - "songNo": 405, - "level": 3, - "isHiddenSongName": false + "songNo":405, + "level":3, + "isHiddenSongName":false }, { - "songNo": 728, - "level": 3, - "isHiddenSongName": false + "songNo":728, + "level":3, + "isHiddenSongName":false }, { - "songNo": 893, - "level": 3, - "isHiddenSongName": false + "songNo":893, + "level":3, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 95, - "goldBorderTotal": 99 + "odaiType":1, + "borderType":1, + "redBorderTotal":95, + "goldBorderTotal":99 }, { - "odaiType": 8, - "borderType": 1, - "redBorderTotal": 1180, - "goldBorderTotal": 1230 + "odaiType":8, + "borderType":1, + "redBorderTotal":1180, + "goldBorderTotal":1230 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 65, - "goldBorderTotal": 43 + "odaiType":4, + "borderType":1, + "redBorderTotal":65, + "goldBorderTotal":43 } ] }, { - "danId": 4, - "verupNo": 1, - "title": "2kyuu", - "aryOdaiSong": [ + "danId":4, + "verupNo":1, + "title":"2kyuu", + "aryOdaiSong":[ { - "songNo": 140, - "level": 3, - "isHiddenSongName": false + "songNo":140, + "level":3, + "isHiddenSongName":false }, { - "songNo": 414, - "level": 3, - "isHiddenSongName": false + "songNo":414, + "level":3, + "isHiddenSongName":false }, { - "songNo": 354, - "level": 3, - "isHiddenSongName": false + "songNo":354, + "level":3, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 96, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":96, + "goldBorderTotal":100 }, { - "odaiType": 8, - "borderType": 1, - "redBorderTotal": 1555, - "goldBorderTotal": 1604 + "odaiType":8, + "borderType":1, + "redBorderTotal":1555, + "goldBorderTotal":1604 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 55, - "goldBorderTotal": 27 + "odaiType":4, + "borderType":1, + "redBorderTotal":55, + "goldBorderTotal":27 } ] }, { - "danId": 5, - "verupNo": 1, - "title": "1kyuu", - "aryOdaiSong": [ + "danId":5, + "verupNo":1, + "title":"1kyuu", + "aryOdaiSong":[ { - "songNo": 881, - "level": 3, - "isHiddenSongName": false + "songNo":881, + "level":3, + "isHiddenSongName":false }, { - "songNo": 421, - "level": 3, - "isHiddenSongName": false + "songNo":421, + "level":3, + "isHiddenSongName":false }, { - "songNo": 641, - "level": 3, - "isHiddenSongName": false + "songNo":641, + "level":3, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 96, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":96, + "goldBorderTotal":100 }, { - "odaiType": 8, - "borderType": 1, - "redBorderTotal": 2135, - "goldBorderTotal": 2183 + "odaiType":8, + "borderType":1, + "redBorderTotal":2135, + "goldBorderTotal":2183 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 40, - "goldBorderTotal": 32 + "odaiType":4, + "borderType":1, + "redBorderTotal":40, + "goldBorderTotal":32 } ] }, { - "danId": 6, - "verupNo": 1, - "title": "1dan", - "aryOdaiSong": [ + "danId":6, + "verupNo":1, + "title":"1dan", + "aryOdaiSong":[ { - "songNo": 809, - "level": 4, - "isHiddenSongName": false + "songNo":809, + "level":4, + "isHiddenSongName":false }, { - "songNo": 303, - "level": 4, - "isHiddenSongName": false + "songNo":303, + "level":4, + "isHiddenSongName":false }, { - "songNo": 689, - "level": 4, - "isHiddenSongName": false + "songNo":689, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 97, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":97, + "goldBorderTotal":100 }, { - "odaiType": 5, - "borderType": 1, - "redBorderTotal": 370, - "goldBorderTotal": 520 + "odaiType":5, + "borderType":1, + "redBorderTotal":370, + "goldBorderTotal":520 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 30, - "goldBorderTotal": 15 + "odaiType":4, + "borderType":1, + "redBorderTotal":30, + "goldBorderTotal":15 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 43, - "goldBorder_1": 54, - "redBorder_2": 77, - "goldBorder_2": 94, - "redBorder_3": 0, - "goldBorder_3": 0 + "odaiType":6, + "borderType":2, + "redBorder_1":43, + "goldBorder_1":54, + "redBorder_2":77, + "goldBorder_2":94, + "redBorder_3":0, + "goldBorder_3":0 } ] }, { - "danId": 7, - "verupNo": 1, - "title": "2dan", - "aryOdaiSong": [ + "danId":7, + "verupNo":1, + "title":"2dan", + "aryOdaiSong":[ { - "songNo": 726, - "level": 4, - "isHiddenSongName": false + "songNo":726, + "level":4, + "isHiddenSongName":false }, { - "songNo": 861, - "level": 4, - "isHiddenSongName": false + "songNo":861, + "level":4, + "isHiddenSongName":false }, { - "songNo": 52, - "level": 4, - "isHiddenSongName": false + "songNo":52, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 98, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":98, + "goldBorderTotal":100 }, { - "odaiType": 5, - "borderType": 1, - "redBorderTotal": 480, - "goldBorderTotal": 647 + "odaiType":5, + "borderType":1, + "redBorderTotal":480, + "goldBorderTotal":647 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 25, - "goldBorderTotal": 16 + "odaiType":4, + "borderType":1, + "redBorderTotal":25, + "goldBorderTotal":16 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 24, - "goldBorder_1": 30, - "redBorder_2": 16, - "goldBorder_2": 20, - "redBorder_3": 16, - "goldBorder_3": 21 + "odaiType":6, + "borderType":2, + "redBorder_1":24, + "goldBorder_1":30, + "redBorder_2":16, + "goldBorder_2":20, + "redBorder_3":16, + "goldBorder_3":21 } ] }, { - "danId": 8, - "verupNo": 1, - "title": "3dan", - "aryOdaiSong": [ + "danId":8, + "verupNo":1, + "title":"3dan", + "aryOdaiSong":[ { - "songNo": 804, - "level": 4, - "isHiddenSongName": false + "songNo":804, + "level":4, + "isHiddenSongName":false }, { - "songNo": 474, - "level": 4, - "isHiddenSongName": false + "songNo":474, + "level":4, + "isHiddenSongName":false }, { - "songNo": 141, - "level": 4, - "isHiddenSongName": false + "songNo":141, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 99, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":99, + "goldBorderTotal":100 }, { - "odaiType": 5, - "borderType": 1, - "redBorderTotal": 590, - "goldBorderTotal": 764 + "odaiType":5, + "borderType":1, + "redBorderTotal":590, + "goldBorderTotal":764 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 24, - "goldBorderTotal": 12 + "odaiType":4, + "borderType":1, + "redBorderTotal":24, + "goldBorderTotal":12 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 180, - "goldBorder_1": 219, - "redBorder_2": 63, - "goldBorder_2": 75, - "redBorder_3": 32, - "goldBorder_3": 41 + "odaiType":6, + "borderType":2, + "redBorder_1":180, + "goldBorder_1":219, + "redBorder_2":63, + "goldBorder_2":75, + "redBorder_3":32, + "goldBorder_3":41 } ] }, { - "danId": 9, - "verupNo": 1, - "title": "4dan", - "aryOdaiSong": [ + "danId":9, + "verupNo":1, + "title":"4dan", + "aryOdaiSong":[ { - "songNo": 523, - "level": 4, - "isHiddenSongName": false + "songNo":523, + "level":4, + "isHiddenSongName":false }, { - "songNo": 70, - "level": 4, - "isHiddenSongName": false + "songNo":70, + "level":4, + "isHiddenSongName":false }, { - "songNo": 735, - "level": 4, - "isHiddenSongName": false + "songNo":735, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 99, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":99, + "goldBorderTotal":100 }, { - "odaiType": 5, - "borderType": 1, - "redBorderTotal": 660, - "goldBorderTotal": 842 + "odaiType":5, + "borderType":1, + "redBorderTotal":660, + "goldBorderTotal":842 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 22, - "goldBorderTotal": 11 + "odaiType":4, + "borderType":1, + "redBorderTotal":22, + "goldBorderTotal":11 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 121, - "goldBorder_1": 141, - "redBorder_2": 0, - "goldBorder_2": 0, - "redBorder_3": 76, - "goldBorder_3": 93 + "odaiType":6, + "borderType":2, + "redBorder_1":121, + "goldBorder_1":141, + "redBorder_2":0, + "goldBorder_2":0, + "redBorder_3":76, + "goldBorder_3":93 } ] }, { - "danId": 10, - "verupNo": 1, - "title": "5dan", - "aryOdaiSong": [ + "danId":10, + "verupNo":1, + "title":"5dan", + "aryOdaiSong":[ { - "songNo": 213, - "level": 4, - "isHiddenSongName": false + "songNo":213, + "level":4, + "isHiddenSongName":false }, { - "songNo": 428, - "level": 4, - "isHiddenSongName": false + "songNo":428, + "level":4, + "isHiddenSongName":false }, { - "songNo": 451, - "level": 4, - "isHiddenSongName": false + "songNo":451, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 99, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":99, + "goldBorderTotal":100 }, { - "odaiType": 5, - "borderType": 1, - "redBorderTotal": 825, - "goldBorderTotal": 1007 + "odaiType":5, + "borderType":1, + "redBorderTotal":825, + "goldBorderTotal":1007 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 20, - "goldBorderTotal": 10 + "odaiType":4, + "borderType":1, + "redBorderTotal":20, + "goldBorderTotal":10 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 33, - "goldBorder_1": 40, - "redBorder_2": 71, - "goldBorder_2": 87, - "redBorder_3": 75, - "goldBorder_3": 94 + "odaiType":6, + "borderType":2, + "redBorder_1":33, + "goldBorder_1":40, + "redBorder_2":71, + "goldBorder_2":87, + "redBorder_3":75, + "goldBorder_3":94 } ] }, { - "danId": 11, - "verupNo": 1, - "title": "6dan", - "aryOdaiSong": [ + "danId":11, + "verupNo":1, + "title":"6dan", + "aryOdaiSong":[ { - "songNo": 551, - "level": 5, - "isHiddenSongName": false + "songNo":551, + "level":5, + "isHiddenSongName":false }, { - "songNo": 270, - "level": 4, - "isHiddenSongName": false + "songNo":270, + "level":4, + "isHiddenSongName":false }, { - "songNo": 645, - "level": 4, - "isHiddenSongName": false + "songNo":645, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 2, - "borderType": 1, - "redBorderTotal": 1530, - "goldBorderTotal": 1590 + "odaiType":2, + "borderType":1, + "redBorderTotal":1530, + "goldBorderTotal":1590 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 18, - "goldBorderTotal": 9 + "odaiType":4, + "borderType":1, + "redBorderTotal":18, + "goldBorderTotal":9 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 40, - "goldBorder_1": 48, - "redBorder_2": 15, - "goldBorder_2": 18, - "redBorder_3": 4, - "goldBorder_3": 5 + "odaiType":6, + "borderType":2, + "redBorder_1":40, + "goldBorder_1":48, + "redBorder_2":15, + "goldBorder_2":18, + "redBorder_3":4, + "goldBorder_3":5 } ] }, { - "danId": 12, - "verupNo": 1, - "title": "7dan", - "aryOdaiSong": [ + "danId":12, + "verupNo":1, + "title":"7dan", + "aryOdaiSong":[ { - "songNo": 805, - "level": 4, - "isHiddenSongName": false + "songNo":805, + "level":4, + "isHiddenSongName":false }, { - "songNo": 800, - "level": 4, - "isHiddenSongName": false + "songNo":800, + "level":4, + "isHiddenSongName":false }, { - "songNo": 361, - "level": 4, - "isHiddenSongName": false + "songNo":361, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 2, - "borderType": 1, - "redBorderTotal": 1790, - "goldBorderTotal": 1895 + "odaiType":2, + "borderType":1, + "redBorderTotal":1790, + "goldBorderTotal":1895 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 16, - "goldBorderTotal": 8 + "odaiType":4, + "borderType":1, + "redBorderTotal":16, + "goldBorderTotal":8 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 0, - "goldBorder_1": 0, - "redBorder_2": 44, - "goldBorder_2": 52, - "redBorder_3": 33, - "goldBorder_3": 37 + "odaiType":6, + "borderType":2, + "redBorder_1":0, + "goldBorder_1":0, + "redBorder_2":44, + "goldBorder_2":52, + "redBorder_3":33, + "goldBorder_3":37 } ] }, { - "danId": 13, - "verupNo": 1, - "title": "8dan", - "aryOdaiSong": [ + "danId":13, + "verupNo":1, + "title":"8dan", + "aryOdaiSong":[ { - "songNo": 239, - "level": 4, - "isHiddenSongName": false + "songNo":239, + "level":4, + "isHiddenSongName":false }, { - "songNo": 866, - "level": 4, - "isHiddenSongName": false + "songNo":866, + "level":4, + "isHiddenSongName":false }, { - "songNo": 431, - "level": 4, - "isHiddenSongName": false + "songNo":431, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 2, - "borderType": 1, - "redBorderTotal": 1940, - "goldBorderTotal": 2020 + "odaiType":2, + "borderType":1, + "redBorderTotal":1940, + "goldBorderTotal":2020 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 13, - "goldBorderTotal": 6 + "odaiType":4, + "borderType":1, + "redBorderTotal":13, + "goldBorderTotal":6 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 18, - "goldBorder_1": 20, - "redBorder_2": 158, - "goldBorder_2": 187, - "redBorder_3": 72, - "goldBorder_3": 84 + "odaiType":6, + "borderType":2, + "redBorder_1":18, + "goldBorder_1":20, + "redBorder_2":158, + "goldBorder_2":187, + "redBorder_3":72, + "goldBorder_3":84 } ] }, { - "danId": 14, - "verupNo": 1, - "title": "9dan", - "aryOdaiSong": [ + "danId":14, + "verupNo":1, + "title":"9dan", + "aryOdaiSong":[ { - "songNo": 785, - "level": 4, - "isHiddenSongName": false + "songNo":785, + "level":4, + "isHiddenSongName":false }, { - "songNo": 780, - "level": 4, - "isHiddenSongName": false + "songNo":780, + "level":4, + "isHiddenSongName":false }, { - "songNo": 779, - "level": 4, - "isHiddenSongName": false + "songNo":779, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 2, - "borderType": 1, - "redBorderTotal": 2260, - "goldBorderTotal": 2330 + "odaiType":2, + "borderType":1, + "redBorderTotal":2260, + "goldBorderTotal":2330 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 12, - "goldBorderTotal": 6 + "odaiType":4, + "borderType":1, + "redBorderTotal":12, + "goldBorderTotal":6 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 44, - "goldBorder_1": 51, - "redBorder_2": 207, - "goldBorder_2": 243, - "redBorder_3": 6, - "goldBorder_3": 8 + "odaiType":6, + "borderType":2, + "redBorder_1":44, + "goldBorder_1":51, + "redBorder_2":207, + "goldBorder_2":243, + "redBorder_3":6, + "goldBorder_3":8 } ] }, { - "danId": 15, - "verupNo": 1, - "title": "10dan", - "aryOdaiSong": [ + "danId":15, + "verupNo":1, + "title":"10dan", + "aryOdaiSong":[ { - "songNo": 759, - "level": 4, - "isHiddenSongName": false + "songNo":759, + "level":4, + "isHiddenSongName":false }, { - "songNo": 719, - "level": 4, - "isHiddenSongName": false + "songNo":719, + "level":4, + "isHiddenSongName":false }, { - "songNo": 905, - "level": 4, - "isHiddenSongName": false + "songNo":905, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 3, - "borderType": 2, - "redBorder_1": 30, - "goldBorder_1": 13, - "redBorder_2": 30, - "goldBorder_2": 13, - "redBorder_3": 28, - "goldBorder_3": 12 + "odaiType":3, + "borderType":2, + "redBorder_1":30, + "goldBorder_1":13, + "redBorder_2":30, + "goldBorder_2":13, + "redBorder_3":28, + "goldBorder_3":12 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 7, - "goldBorderTotal": 3 + "odaiType":4, + "borderType":1, + "redBorderTotal":7, + "goldBorderTotal":3 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 26, - "goldBorder_1": 31, - "redBorder_2": 59, - "goldBorder_2": 70, - "redBorder_3": 53, - "goldBorder_3": 61 + "odaiType":6, + "borderType":2, + "redBorder_1":26, + "goldBorder_1":31, + "redBorder_2":59, + "goldBorder_2":70, + "redBorder_3":53, + "goldBorder_3":61 } ] }, { - "danId": 16, - "verupNo": 1, - "title": "11dan", - "aryOdaiSong": [ + "danId":16, + "verupNo":1, + "title":"11dan", + "aryOdaiSong":[ { - "songNo": 595, - "level": 4, - "isHiddenSongName": false + "songNo":595, + "level":4, + "isHiddenSongName":false }, { - "songNo": 714, - "level": 4, - "isHiddenSongName": false + "songNo":714, + "level":4, + "isHiddenSongName":false }, { - "songNo": 961, - "level": 4, - "isHiddenSongName": false + "songNo":961, + "level":4, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 3, - "borderType": 1, - "redBorderTotal": 50, - "goldBorderTotal": 25 + "odaiType":3, + "borderType":1, + "redBorderTotal":50, + "goldBorderTotal":25 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 6, - "goldBorderTotal": 3 + "odaiType":4, + "borderType":1, + "redBorderTotal":6, + "goldBorderTotal":3 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 105, - "goldBorder_1": 111, - "redBorder_2": 32, - "goldBorder_2": 34, - "redBorder_3": 38, - "goldBorder_3": 41 + "odaiType":6, + "borderType":2, + "redBorder_1":105, + "goldBorder_1":111, + "redBorder_2":32, + "goldBorder_2":34, + "redBorder_3":38, + "goldBorder_3":41 } ] }, { - "danId": 17, - "verupNo": 1, - "title": "12dan", - "aryOdaiSong": [ + "danId":17, + "verupNo":1, + "title":"12dan", + "aryOdaiSong":[ { - "songNo": 859, - "level": 4, - "isHiddenSongName": false + "songNo":859, + "level":4, + "isHiddenSongName":false }, { - "songNo": 720, - "level": 4, - "isHiddenSongName": false + "songNo":720, + "level":4, + "isHiddenSongName":false }, { - "songNo": 959, - "level": 5, - "isHiddenSongName": false + "songNo":959, + "level":5, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 3, - "borderType": 1, - "redBorderTotal": 30, - "goldBorderTotal": 15 + "odaiType":3, + "borderType":1, + "redBorderTotal":30, + "goldBorderTotal":15 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 5, - "goldBorderTotal": 2 + "odaiType":4, + "borderType":1, + "redBorderTotal":5, + "goldBorderTotal":2 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 4, - "goldBorder_1": 5, - "redBorder_2": 49, - "goldBorder_2": 52, - "redBorder_3": 6, - "goldBorder_3": 7 + "odaiType":6, + "borderType":2, + "redBorder_1":4, + "goldBorder_1":5, + "redBorder_2":49, + "goldBorder_2":52, + "redBorder_3":6, + "goldBorder_3":7 } ] }, { - "danId": 18, - "verupNo": 1, - "title": "13dan", - "aryOdaiSong": [ + "danId":18, + "verupNo":1, + "title":"13dan", + "aryOdaiSong":[ { - "songNo": 777, - "level": 4, - "isHiddenSongName": false + "songNo":777, + "level":4, + "isHiddenSongName":false }, { - "songNo": 716, - "level": 5, - "isHiddenSongName": false + "songNo":716, + "level":5, + "isHiddenSongName":false }, { - "songNo": 958, - "level": 5, - "isHiddenSongName": false + "songNo":958, + "level":5, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 3, - "borderType": 1, - "redBorderTotal": 15, - "goldBorderTotal": 6 + "odaiType":3, + "borderType":1, + "redBorderTotal":15, + "goldBorderTotal":6 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 4, - "goldBorderTotal": 2 + "odaiType":4, + "borderType":1, + "redBorderTotal":4, + "goldBorderTotal":2 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 151, - "goldBorder_1": 159, - "redBorder_2": 8, - "goldBorder_2": 9, - "redBorder_3": 34, - "goldBorder_3": 36 + "odaiType":6, + "borderType":2, + "redBorder_1":151, + "goldBorder_1":159, + "redBorder_2":8, + "goldBorder_2":9, + "redBorder_3":34, + "goldBorder_3":36 } ] }, { - "danId": 19, - "verupNo": 1, - "title": "14dan", - "aryOdaiSong": [ + "danId":19, + "verupNo":1, + "title":"14dan", + "aryOdaiSong":[ { - "songNo": 627, - "level": 4, - "isHiddenSongName": false + "songNo":627, + "level":4, + "isHiddenSongName":false }, { - "songNo": 463, - "level": 4, - "isHiddenSongName": false + "songNo":463, + "level":4, + "isHiddenSongName":false }, { - "songNo": 960, - "level": 5, - "isHiddenSongName": false + "songNo":960, + "level":5, + "isHiddenSongName":false } ], - "aryOdaiBorder": [ + "aryOdaiBorder":[ { - "odaiType": 1, - "borderType": 1, - "redBorderTotal": 100, - "goldBorderTotal": 100 + "odaiType":1, + "borderType":1, + "redBorderTotal":100, + "goldBorderTotal":100 }, { - "odaiType": 3, - "borderType": 1, - "redBorderTotal": 8, - "goldBorderTotal": 1 + "odaiType":3, + "borderType":1, + "redBorderTotal":8, + "goldBorderTotal":1 }, { - "odaiType": 4, - "borderType": 1, - "redBorderTotal": 3, - "goldBorderTotal": 1 + "odaiType":4, + "borderType":1, + "redBorderTotal":3, + "goldBorderTotal":1 }, { - "odaiType": 6, - "borderType": 2, - "redBorder_1": 13, - "goldBorder_1": 14, - "redBorder_2": 25, - "goldBorder_2": 27, - "redBorder_3": 124, - "goldBorder_3": 131 + "odaiType":6, + "borderType":2, + "redBorder_1":13, + "goldBorder_1":14, + "redBorder_2":25, + "goldBorder_2":27, + "redBorder_3":124, + "goldBorder_3":131 } ] } diff --git a/TaikoLocalServer/wwwroot/data/event_folder_data.json b/TaikoLocalServer/wwwroot/data/event_folder_data.json index 518590b..9e5dd84 100644 --- a/TaikoLocalServer/wwwroot/data/event_folder_data.json +++ b/TaikoLocalServer/wwwroot/data/event_folder_data.json @@ -1,227 +1,84 @@ [ - { - "folderId": 1, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 2, - "verupNo": 1, - "priority": 1, - "songNo": [ - 478, - 153, - 200, - 482, - 511, - 672, - 675, - 646, - 644, - 645, - 676, - 671, - 479, - 707, - 480, - 481, - 203, - 204, - 483, - 205, - 202, - 241, - 14, - 387, - 197, - 281, - 226, - 484, - 543, - 512, - 709, - 35 - ] - }, - { - "folderId": 3, - "verupNo": 1, - "priority": 1, - "songNo": [ - 1485, - 1404, - 1580, - 1730, - 1750, - 1277, - 1478, - 1481, - 1482, - 1484, - 1500, - 1890, - 2349, - 2604, - 2640, - 1176, - 1419, - 1596, - 1693, - 2248, - 1049, - 1221, - 1222, - 1223, - 1224, - 1493, - 1578, - 1719, - 2650, - 1595, - 1964, - 1469, - 1217, - 1314, - 1406, - 1565, - 1745, - 2120, - 2200, - 2324, - 2785, - 1631, - 2301, - 2802, - 1490, - 2088, - 2268, - 2309, - 2507, - 2126, - 1630, - 2509, - 1263, - 2495, - 2642, - 2745, - 1054, - 2583, - 1271, - 1266, - 1267, - 2923 - ] - }, - { - "folderId": 4, - "verupNo": 1, - "priority": 1, - "songNo": [ - 1361, - 1366, - 1373, - 1379, - 1337, - 1345, - 1357, - 1362, - 1367, - 1368, - 1369, - 1374, - 1375, - 1388, - 1390, - 1579, - 2225, - 1354, - 1394, - 2804, - 1340, - 1341, - 1370, - 1376, - 1384, - 1359, - 1385, - 2416, - 2756, - 1363, - 1920, - 1353, - 1360, - 1381, - 1389, - 1364, - 1391, - 1342, - 1546, - 1931 - ] - }, - { - "folderId": 5, - "verupNo": 1, - "priority": 1, - "songNo": [ - 242, - 430, - 368, - 604, - 333 - ] - }, - { - "folderId": 6, - "verupNo": 1, - "priority": 1, - "songNo": [ - 841, - 767, - 658, - 467, - 468, - 466, - 460, - 157, - 465 - ] - }, - { - "folderId": 7, - "verupNo": 1, - "priority": 1, - "songNo": [ - 733, - 732, - 44, - 790, - 894 - ] - }, - { - "folderId": 8, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 12, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 13, - "verupNo": 1, - "priority": 1, - "songNo": [] - }, - { - "folderId": 14, - "verupNo": 1, - "priority": 1, - "songNo": [] - } + { + "folderId": 1, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 2, + "verupNo": 1, + "priority": 1, + "songNo": [ + 478, 153, 200, 482, 511, 672, 675, 646, 644, 645, 676, 671, 479, + 707, 480, 481, 203, 204, 483, 205, 202, 241, 14, 387, 197, 281, 226, + 484, 543, 512, 709, 35 + ] + }, + { + "folderId": 3, + "verupNo": 1, + "priority": 1, + "songNo": [ + 1485, 1404, 1580, 1730, 1750, 1277, 1478, 1481, 1482, 1484, 1500, + 1890, 2349, 2604, 2640, 1176, 1419, 1596, 1693, 2248, 1049, 1221, + 1222, 1223, 1224, 1493, 1578, 1719, 2650, 1595, 1964, 1469, 1217, + 1314, 1406, 1565, 1745, 2120, 2200, 2324, 2785, 1631, 2301, 2802, + 1490, 2088, 2268, 2309, 2507, 2126, 1630, 2509, 1263, 2495, 2642, + 2745, 1054, 2583, 1271, 1266, 1267, 2923 + ] + }, + { + "folderId": 4, + "verupNo": 1, + "priority": 1, + "songNo": [ + 1361, 1366, 1373, 1379, 1337, 1345, 1357, 1362, 1367, 1368, 1369, + 1374, 1375, 1388, 1390, 1579, 2225, 1354, 1394, 2804, 1340, 1341, + 1370, 1376, 1384, 1359, 1385, 2416, 2756, 1363, 1920, 1353, 1360, + 1381, 1389, 1364, 1391, 1342, 1546, 1931 + ] + }, + { + "folderId": 5, + "verupNo": 1, + "priority": 1, + "songNo": [242, 430, 368, 604, 333] + }, + { + "folderId": 6, + "verupNo": 1, + "priority": 1, + "songNo": [841, 767, 658, 467, 468, 466, 460, 157, 465] + }, + { + "folderId": 7, + "verupNo": 1, + "priority": 1, + "songNo": [733, 732, 44, 790, 894] + }, + { + "folderId": 8, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 12, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 13, + "verupNo": 1, + "priority": 1, + "songNo": [] + }, + { + "folderId": 14, + "verupNo": 1, + "priority": 1, + "songNo": [] + } ] diff --git a/TaikoLocalServer/wwwroot/data/intro_data.json b/TaikoLocalServer/wwwroot/data/intro_data.json index 0cbb8fb..ac08a5c 100644 --- a/TaikoLocalServer/wwwroot/data/intro_data.json +++ b/TaikoLocalServer/wwwroot/data/intro_data.json @@ -1,134 +1,74 @@ [ { - "setId": 1, - "verupNo": 1, - "mainSongNo": 895, - "subSongNo": [ - 894, - 732, - 44, - 921 - ] + "setId":1, + "verupNo":1, + "mainSongNo":895, + "subSongNo":[894,732,44,921] }, { - "setId": 2, - "verupNo": 1, - "mainSongNo": 912, - "subSongNo": [ - 827, - 871, - 36, - 227 - ] + "setId":2, + "verupNo":1, + "mainSongNo":912, + "subSongNo":[827,871,36,227] }, { - "setId": 3, - "verupNo": 1, - "mainSongNo": 913, - "subSongNo": [ - 460, - 916, - 430, - 872 - ] + "setId":3, + "verupNo":1, + "mainSongNo":913, + "subSongNo":[460,916,430,872] }, { - "setId": 4, - "verupNo": 1, - "mainSongNo": 842, - "subSongNo": [ - 7, - 233, - 256, - 831 - ] + "setId":4, + "verupNo":1, + "mainSongNo":842, + "subSongNo":[7,233,256,831] }, { - "setId": 5, - "verupNo": 1, - "mainSongNo": 947, - "subSongNo": [ - 926, - 882, - 730, - 695 - ] + "setId":5, + "verupNo":1, + "mainSongNo":947, + "subSongNo":[926,882,730,695] }, { - "setId": 6, - "verupNo": 1, - "mainSongNo": 937, - "subSongNo": [ - 828, - 925, - 474, - 924 - ] + "setId":6, + "verupNo":1, + "mainSongNo":937, + "subSongNo":[828,925,474,924] }, { - "setId": 7, - "verupNo": 1, - "mainSongNo": 956, - "subSongNo": [ - 839, - 255, - 285, - 187 - ] + "setId":7, + "verupNo":1, + "mainSongNo":956, + "subSongNo":[839,255,285,187] }, { - "setId": 8, - "verupNo": 1, - "mainSongNo": 923, - "subSongNo": [ - 729, - 873, - 789, - 893 - ] + "setId":8, + "verupNo":1, + "mainSongNo":923, + "subSongNo":[729,873,789,893] }, { - "setId": 9, - "verupNo": 1, - "mainSongNo": 915, - "subSongNo": [ - 726, - 811, - 711, - 303 - ] + "setId":9, + "verupNo":1, + "mainSongNo":915, + "subSongNo":[726,811,711,303] }, { - "setId": 10, - "verupNo": 1, - "mainSongNo": 885, - "subSongNo": [ - 837, - 464, - 801, - 18 - ] + "setId":10, + "verupNo":1, + "mainSongNo":885, + "subSongNo":[837,464,801,18] }, { - "setId": 11, - "verupNo": 1, - "mainSongNo": 898, - "subSongNo": [ - 47, - 135, - 374, - 792 - ] + "setId":11, + "verupNo":1, + "mainSongNo":898, + "subSongNo":[47,135,374,792] }, { - "setId": 12, - "verupNo": 1, - "mainSongNo": 948, - "subSongNo": [ - 412, - 538, - 411, - 413 - ] + "setId":12, + "verupNo":1, + "mainSongNo":948, + "subSongNo":[412,538,411,413] } ] \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/movie_data.json b/TaikoLocalServer/wwwroot/data/movie_data.json index 00e2ed7..f26aa0b 100644 --- a/TaikoLocalServer/wwwroot/data/movie_data.json +++ b/TaikoLocalServer/wwwroot/data/movie_data.json @@ -1,6 +1,6 @@ [ { - "movie_id": 0, - "enable_days": 0 + "movie_id": 0, + "enable_days": 0 } ] \ No newline at end of file diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj index cd2c7f3..b39c692 100644 --- a/TaikoWebUI/TaikoWebUI.csproj +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -7,44 +7,44 @@ - - - - - - + + + + + + - + - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + - + diff --git a/TaikoWebUI/wwwroot/index.html b/TaikoWebUI/wwwroot/index.html index e048a30..17a13c8 100644 --- a/TaikoWebUI/wwwroot/index.html +++ b/TaikoWebUI/wwwroot/index.html @@ -2,25 +2,25 @@ - - + + TaikoWebUI - - - - + + + + -
Loading...
+
Loading...
-
- An unhandled error has occurred. - Reload - 🗙 -
- - +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + \ No newline at end of file diff --git a/TaikoWebUI/wwwroot/style.overrides.css b/TaikoWebUI/wwwroot/style.overrides.css index 427818b..e1a5915 100644 --- a/TaikoWebUI/wwwroot/style.overrides.css +++ b/TaikoWebUI/wwwroot/style.overrides.css @@ -3,7 +3,7 @@ } .mud-progress-linear.bar-pass-gold .mud-progress-linear-bars .mud-progress-linear-bar { - background: linear-gradient(90deg, rgb(255, 83, 147) 0%, rgb(255, 248, 6) 15%, rgb(255, 248, 6) 20%, rgb(122, 255, 79) 30%, rgb(122, 244, 255) 45%, rgb(149, 104, 255) 70%, rgb(255, 98, 244) 90%, rgb(255, 98, 244) 95%, rgb(255, 83, 147) 100%); + background: linear-gradient( 90deg, rgb(255,83,147) 0%, rgb(255,248,6) 15%, rgb(255,248,6) 20%, rgb(122,255,79) 30%, rgb(122,244,255) 45%, rgb(149,104,255) 70%, rgb(255,98,244) 90%, rgb(255,98,244) 95%, rgb(255,83,147) 100% ); } .mud-progress-linear.bar-pass-red .mud-progress-linear-bars .mud-progress-linear-bar { From 62ef9bf9804f16a780b96bbd02bce971c68a5b69 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Sun, 17 Sep 2023 22:11:56 +0800 Subject: [PATCH 22/49] Readded locking songs in initialDataCheck, updated game constants TRY 2 --- TaikoLocalServer/Common/Constants.cs | 6 +++--- .../Controllers/Game/InitialDataCheckController.cs | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/TaikoLocalServer/Common/Constants.cs b/TaikoLocalServer/Common/Constants.cs index 71c96c3..ae4ab64 100644 --- a/TaikoLocalServer/Common/Constants.cs +++ b/TaikoLocalServer/Common/Constants.cs @@ -29,13 +29,13 @@ public static class Constants public const int TONE_UID_MAX = 19; - public const int TITLE_UID_MAX = 814; + public const int TITLE_UID_MAX = 941; - private const int COSTUME_FLAG_1_ARRAY_SIZE = 154; + private const int COSTUME_FLAG_1_ARRAY_SIZE = 156; private const int COSTUME_FLAG_2_ARRAY_SIZE = 140; private const int COSTUME_FLAG_3_ARRAY_SIZE = 156; private const int COSTUME_FLAG_4_ARRAY_SIZE = 58; - private const int COSTUME_FLAG_5_ARRAY_SIZE = 129; + private const int COSTUME_FLAG_5_ARRAY_SIZE = 142; public static readonly int[] CostumeFlagArraySizes = { COSTUME_FLAG_1_ARRAY_SIZE, diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index fc6db04..e7fc337 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -24,12 +24,17 @@ public class InitialDataCheckController : BaseController Date: Sun, 17 Sep 2023 23:13:23 +0800 Subject: [PATCH 23/49] Implemented getDanOdai type 2 --- .../Controllers/Game/GetDanOdaiController.cs | 38 ++++++++++++------- .../Game/InitialDataCheckController.cs | 13 ++++++- TaikoLocalServer/Services/GameDataService.cs | 19 ++++++++++ .../Services/Interfaces/IGameDataService.cs | 2 + TaikoLocalServer/Settings/DataSettings.cs | 2 + TaikoLocalServer/TaikoLocalServer.csproj | 3 ++ .../wwwroot/data/gaiden_data.json | 38 +++++++++++++++++++ 7 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 TaikoLocalServer/wwwroot/data/gaiden_data.json diff --git a/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs index 8819e69..3395fab 100644 --- a/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs +++ b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs @@ -16,29 +16,41 @@ public class GetDanOdaiController : BaseController public IActionResult GetDanOdai([FromBody] GetDanOdaiRequest request) { Logger.LogInformation("GetDanOdai request : {Request}", request.Stringify()); - + var response = new GetDanOdaiResponse { Result = 1 }; - // if (request.Type == 2) - // { - // return Ok(response); - // } - - foreach (var danId in request.DanIds) + if (request.Type == 1) { - gameDataService.GetDanDataDictionary().TryGetValue(danId, out var odaiData); - if (odaiData is null) + foreach (var danId in request.DanIds) { - Logger.LogWarning("Requested dan id {Id} does not exist!", danId); - continue; + gameDataService.GetDanDataDictionary().TryGetValue(danId, out var odaiData); + if (odaiData is null) + { + Logger.LogWarning("Requested dan id {Id} does not exist!", danId); + continue; + } + + response.AryOdaiDatas.Add(odaiData); } - - response.AryOdaiDatas.Add(odaiData); } + else if (request.Type == 2) + { + foreach (var danId in request.DanIds) + { + gameDataService.GetGaidenDataDictionary().TryGetValue(danId, out var odaiData); + if (odaiData is null) + { + Logger.LogWarning("Requested dan id {Id} does not exist!", danId); + continue; + } + response.AryOdaiDatas.Add(odaiData); + } + } + return Ok(response); } } \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index e7fc337..da98de8 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -73,11 +73,22 @@ public class InitialDataCheckController : BaseController(); + var gaidenDataDictionary = gameDataService.GetGaidenDataDictionary(); + foreach (var gaidenId in gaidenDataDictionary.Keys) + { + gaidenData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData + { + InfoId = gaidenId, + VerupNo = 1 + }); + } + var verUp2Type102 = new InitialdatacheckResponse.VerupNoData2 { MasterType = 102, }; - verUp2Type102.AryInformationDatas.AddRange(danData); + verUp2Type102.AryInformationDatas.AddRange(gaidenData); response.AryVerupNoData2s.Add(verUp2Type102); var eventFolderData = new List(); diff --git a/TaikoLocalServer/Services/GameDataService.cs b/TaikoLocalServer/Services/GameDataService.cs index 7c411f4..4919602 100644 --- a/TaikoLocalServer/Services/GameDataService.cs +++ b/TaikoLocalServer/Services/GameDataService.cs @@ -17,6 +17,9 @@ public class GameDataService : IGameDataService private ImmutableDictionary danDataDictionary = ImmutableDictionary.Empty; + + private ImmutableDictionary gaidenDataDictionary = + ImmutableDictionary.Empty; private ImmutableDictionary introDataDictionary = ImmutableDictionary.Empty; @@ -72,6 +75,11 @@ public class GameDataService : IGameDataService { return danDataDictionary; } + + public ImmutableDictionary GetGaidenDataDictionary() + { + return gaidenDataDictionary; + } public ImmutableDictionary GetSongIntroDictionary() { @@ -111,6 +119,7 @@ public class GameDataService : IGameDataService var musicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_FILE_NAME); var compressedMusicAttributePath = Path.Combine(dataPath, Constants.MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME); var danDataPath = Path.Combine(dataPath, settings.DanDataFileName); + var gaidenDataPath = Path.Combine(dataPath, settings.GaidenDataFileName); var songIntroDataPath = Path.Combine(dataPath, settings.IntroDataFileName); var movieDataPath = Path.Combine(dataPath, settings.MovieDataFileName); var eventFolderDataPath = Path.Combine(dataPath, settings.EventFolderDataFileName); @@ -129,6 +138,7 @@ public class GameDataService : IGameDataService await using var musicInfoFile = File.OpenRead(musicInfoPath); await using var musicAttributeFile = File.OpenRead(musicAttributePath); await using var danDataFile = File.OpenRead(danDataPath); + await using var gaidenDataFile = File.OpenRead(gaidenDataPath); await using var songIntroDataFile = File.OpenRead(songIntroDataPath); await using var movieDataFile = File.OpenRead(movieDataPath); await using var eventFolderDataFile = File.OpenRead(eventFolderDataPath); @@ -139,6 +149,7 @@ public class GameDataService : IGameDataService var infoesData = await JsonSerializer.DeserializeAsync(musicInfoFile); var attributesData = await JsonSerializer.DeserializeAsync(musicAttributeFile); var danData = await JsonSerializer.DeserializeAsync>(danDataFile); + var gaidenData = await JsonSerializer.DeserializeAsync>(gaidenDataFile); var introData = await JsonSerializer.DeserializeAsync>(songIntroDataFile); var movieData = await JsonSerializer.DeserializeAsync>(movieDataFile); var eventFolderData = await JsonSerializer.DeserializeAsync>(eventFolderDataFile); @@ -151,6 +162,8 @@ public class GameDataService : IGameDataService InitializeMusicAttributes(attributesData); InitializeDanData(danData); + + InitializeGaidenData(gaidenData); InitializeIntroData(introData); @@ -206,6 +219,12 @@ public class GameDataService : IGameDataService danData.ThrowIfNull("Shouldn't happen!"); danDataDictionary = danData.ToImmutableDictionary(data => data.DanId, ToResponseOdaiData); } + + private void InitializeGaidenData(List? gaidenData) + { + gaidenData.ThrowIfNull("Shouldn't happen!"); + gaidenDataDictionary = gaidenData.ToImmutableDictionary(data => data.DanId, ToResponseOdaiData); + } private void InitializeEventFolderData(List? eventFolderData) { diff --git a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs index 1b6035c..82f302d 100644 --- a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs +++ b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs @@ -15,6 +15,8 @@ public interface IGameDataService public ImmutableDictionary GetMusicAttributes(); public ImmutableDictionary GetDanDataDictionary(); + + public ImmutableDictionary GetGaidenDataDictionary(); public ImmutableDictionary GetSongIntroDictionary(); diff --git a/TaikoLocalServer/Settings/DataSettings.cs b/TaikoLocalServer/Settings/DataSettings.cs index c6d4976..ddcdc65 100644 --- a/TaikoLocalServer/Settings/DataSettings.cs +++ b/TaikoLocalServer/Settings/DataSettings.cs @@ -3,6 +3,8 @@ public class DataSettings { public string DanDataFileName { get; set; } = "dan_data.json"; + + public string GaidenDataFileName { get; set; } = "gaiden_data.json"; public string EventFolderDataFileName { get; set; } = "event_folder_data.json"; diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index cc7dcb1..f6e9384 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -81,6 +81,9 @@ PreserveNewest + + PreserveNewest + diff --git a/TaikoLocalServer/wwwroot/data/gaiden_data.json b/TaikoLocalServer/wwwroot/data/gaiden_data.json new file mode 100644 index 0000000..d732bb2 --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/gaiden_data.json @@ -0,0 +1,38 @@ +[ + { + "danId":20, + "verupNo":1, + "title":"gaiden_2022_odai_7", + "aryOdaiSong":[ + { + "songNo":828, + "level":2, + "isHiddenSongName":false + }, + { + "songNo":187, + "level":2, + "isHiddenSongName":false + }, + { + "songNo":789, + "level":2, + "isHiddenSongName":false + } + ], + "aryOdaiBorder":[ + { + "odaiType":1, + "borderType":1, + "redBorderTotal":92, + "goldBorderTotal":95 + }, + { + "odaiType":8, + "borderType":1, + "redBorderTotal":786, + "goldBorderTotal":832 + } + ] + } +] \ No newline at end of file From 46fe93d8066421afa3119de4fec67b52be9b9b80 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Mon, 18 Sep 2023 03:15:04 +0800 Subject: [PATCH 24/49] Implemented qrCodeData related functions --- SharedProject/Models/QRCodeData.cs | 10 ++++++++++ .../Controllers/Game/GetDanOdaiController.cs | 1 + .../Controllers/Game/VerifyQrCodeController.cs | 18 +++++++++++++++++- TaikoLocalServer/Services/GameDataService.cs | 18 ++++++++++++++++++ .../Services/Interfaces/IGameDataService.cs | 2 ++ TaikoLocalServer/Settings/DataSettings.cs | 2 ++ TaikoLocalServer/wwwroot/data/movie_data.json | 4 ++-- TaikoLocalServer/wwwroot/data/qrcode_data.json | 6 ++++++ 8 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 SharedProject/Models/QRCodeData.cs create mode 100644 TaikoLocalServer/wwwroot/data/qrcode_data.json diff --git a/SharedProject/Models/QRCodeData.cs b/SharedProject/Models/QRCodeData.cs new file mode 100644 index 0000000..8785b68 --- /dev/null +++ b/SharedProject/Models/QRCodeData.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Serialization; + +namespace SharedProject.Models; + +public class QRCodeData +{ + [JsonPropertyName("serial")] public string Serial { get; set; } = null!; + + [JsonPropertyName("id")] public uint Id { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs index 3395fab..a7ec853 100644 --- a/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs +++ b/TaikoLocalServer/Controllers/Game/GetDanOdaiController.cs @@ -46,6 +46,7 @@ public class GetDanOdaiController : BaseController Logger.LogWarning("Requested dan id {Id} does not exist!", danId); continue; } + Logger.LogInformation(odaiData.Stringify()); response.AryOdaiDatas.Add(odaiData); } diff --git a/TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs b/TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs index 563fa83..9c8f896 100644 --- a/TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs +++ b/TaikoLocalServer/Controllers/Game/VerifyQrCodeController.cs @@ -4,16 +4,32 @@ [ApiController] public class VerifyQrCodeController : BaseController { + private readonly IGameDataService gameDataService; + + public VerifyQrCodeController(IGameDataService gameDataService) + { + this.gameDataService = gameDataService; + } + [HttpPost] [Produces("application/protobuf")] public IActionResult VerifyQrCode([FromBody] VerifyQrcodeRequest request) { Logger.LogInformation("VerifyQrCode request : {Request}", request.Stringify()); + var qrCodeDataDictionary = gameDataService.GetQRCodeDataDictionary(); + + qrCodeDataDictionary.TryGetValue(request.QrcodeSerial, out var qrCodeId); + + if (qrCodeId == 0) + { + Logger.LogWarning("Requested QR code serial {Serial} does not exist!", request.QrcodeSerial); + } + var response = new VerifyQrcodeResponse { Result = 1, - QrcodeId = 999999001 + QrcodeId = qrCodeId }; return Ok(response); diff --git a/TaikoLocalServer/Services/GameDataService.cs b/TaikoLocalServer/Services/GameDataService.cs index 4919602..a572cd5 100644 --- a/TaikoLocalServer/Services/GameDataService.cs +++ b/TaikoLocalServer/Services/GameDataService.cs @@ -36,6 +36,8 @@ public class GameDataService : IGameDataService private ImmutableDictionary shopFolderDictionary = ImmutableDictionary.Empty; + private ImmutableDictionary qrCodeDataDictionary = ImmutableDictionary.Empty; + private List musics = new(); private List musicsWithUra = new(); @@ -110,6 +112,11 @@ public class GameDataService : IGameDataService { return lockedSongsList; } + + public ImmutableDictionary GetQRCodeDataDictionary() + { + return qrCodeDataDictionary; + } public async Task InitializeAsync() { @@ -126,6 +133,7 @@ public class GameDataService : IGameDataService var shopFolderDataPath = Path.Combine(dataPath, settings.ShopFolderDataFileName); var tokenDataPath = Path.Combine(dataPath, settings.TokenDataFileName); var lockedSongsDataPath = Path.Combine(dataPath, settings.LockedSongsDataFileName); + var qrCodeDataPath = Path.Combine(dataPath, settings.QRCodeDataFileName); if (File.Exists(compressedMusicInfoPath)) { @@ -145,6 +153,7 @@ public class GameDataService : IGameDataService await using var shopFolderDataFile = File.OpenRead(shopFolderDataPath); await using var tokenDataFile = File.OpenRead(tokenDataPath); await using var lockedSongsDataFile = File.OpenRead(lockedSongsDataPath); + await using var qrCodeDataFile = File.OpenRead(qrCodeDataPath); var infoesData = await JsonSerializer.DeserializeAsync(musicInfoFile); var attributesData = await JsonSerializer.DeserializeAsync(musicAttributeFile); @@ -156,6 +165,7 @@ public class GameDataService : IGameDataService var shopFolderData = await JsonSerializer.DeserializeAsync>(shopFolderDataFile); var tokenData = await JsonSerializer.DeserializeAsync>(tokenDataFile); var lockedSongsData = await JsonSerializer.DeserializeAsync>(lockedSongsDataFile); + var qrCodeData = await JsonSerializer.DeserializeAsync>(qrCodeDataFile); InitializeMusicInfoes(infoesData); @@ -176,6 +186,8 @@ public class GameDataService : IGameDataService InitializeTokenData(tokenData); InitializeLockedSongsData(lockedSongsData); + + InitializeQRCodeData(qrCodeData); } private static void TryDecompressMusicInfo() @@ -272,6 +284,12 @@ public class GameDataService : IGameDataService lockedSongsData.ThrowIfNull("Shouldn't happen!"); lockedSongsList = lockedSongsData["songNo"].ToList(); } + + private void InitializeQRCodeData(List? qrCodeData) + { + qrCodeData.ThrowIfNull("Shouldn't happen!"); + qrCodeDataDictionary = qrCodeData.ToImmutableDictionary(data => data.Serial, data => data.Id); + } private static GetDanOdaiResponse.OdaiData ToResponseOdaiData(DanData data) { diff --git a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs index 82f302d..40bce35 100644 --- a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs +++ b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs @@ -29,5 +29,7 @@ public interface IGameDataService public Dictionary GetTokenDataDictionary(); public List GetLockedSongsList(); + + public ImmutableDictionary GetQRCodeDataDictionary(); } diff --git a/TaikoLocalServer/Settings/DataSettings.cs b/TaikoLocalServer/Settings/DataSettings.cs index ddcdc65..a9a92f8 100644 --- a/TaikoLocalServer/Settings/DataSettings.cs +++ b/TaikoLocalServer/Settings/DataSettings.cs @@ -17,4 +17,6 @@ public class DataSettings public string TokenDataFileName { get; set; } = "token_data.json"; public string LockedSongsDataFileName { get; set; } = "locked_songs_data.json"; + + public string QRCodeDataFileName { get; set; } = "qrcode_data.json"; } \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/movie_data.json b/TaikoLocalServer/wwwroot/data/movie_data.json index f26aa0b..00e2ed7 100644 --- a/TaikoLocalServer/wwwroot/data/movie_data.json +++ b/TaikoLocalServer/wwwroot/data/movie_data.json @@ -1,6 +1,6 @@ [ { - "movie_id": 0, - "enable_days": 0 + "movie_id": 0, + "enable_days": 0 } ] \ No newline at end of file diff --git a/TaikoLocalServer/wwwroot/data/qrcode_data.json b/TaikoLocalServer/wwwroot/data/qrcode_data.json new file mode 100644 index 0000000..76fb6f5 --- /dev/null +++ b/TaikoLocalServer/wwwroot/data/qrcode_data.json @@ -0,0 +1,6 @@ +[ + { + "serial": "", + "id": -1 + } +] \ No newline at end of file From 73b39abeb9a36ba0153fef0a97cd85dc49c21d15 Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Mon, 18 Sep 2023 10:25:22 +0900 Subject: [PATCH 25/49] Add qrcode_data.json to csproj --- TaikoLocalServer/TaikoLocalServer.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index f6e9384..4bb0b71 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -84,6 +84,9 @@ PreserveNewest + + PreserveNewest + From aa353663888e2ed4b029a7f6431f706c99cbe275 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Mon, 18 Sep 2023 13:10:45 +0800 Subject: [PATCH 26/49] Change default value of qrcode_data.json to 0 --- TaikoLocalServer/wwwroot/data/qrcode_data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TaikoLocalServer/wwwroot/data/qrcode_data.json b/TaikoLocalServer/wwwroot/data/qrcode_data.json index 76fb6f5..4015685 100644 --- a/TaikoLocalServer/wwwroot/data/qrcode_data.json +++ b/TaikoLocalServer/wwwroot/data/qrcode_data.json @@ -1,6 +1,6 @@ [ { "serial": "", - "id": -1 + "id": 0 } ] \ No newline at end of file From 05cdeb0dec6135ca1b982cbfa576cf4e4895b198 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Mon, 18 Sep 2023 14:18:58 +0800 Subject: [PATCH 27/49] Implemented saving DifficultyPlayedArray --- GameDatabase/Entities/UserDatum.cs | 2 + ...fficultySettingArrayToUserData.Designer.cs | 451 ++++++++++++++++++ ...rrayAndDifficultySettingArrayToUserData.cs | 40 ++ .../Migrations/TaikoDbContextModelSnapshot.cs | 8 + .../Controllers/Game/PlayResultController.cs | 27 +- .../Controllers/Game/UserDataController.cs | 34 ++ 6 files changed, 553 insertions(+), 9 deletions(-) create mode 100644 GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.Designer.cs create mode 100644 GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.cs diff --git a/GameDatabase/Entities/UserDatum.cs b/GameDatabase/Entities/UserDatum.cs index f9a81c0..5a33c78 100644 --- a/GameDatabase/Entities/UserDatum.cs +++ b/GameDatabase/Entities/UserDatum.cs @@ -17,6 +17,8 @@ namespace GameDatabase.Entities public int NotesPosition { get; set; } public bool IsVoiceOn { get; set; } public bool IsSkipOn { get; set; } + public string DifficultyPlayedArray { get; set; } = "[]"; + public string DifficultySettingArray { get; set; } = "[]"; public uint SelectedToneId { get; set; } public DateTime LastPlayDatetime { get; set; } public uint LastPlayMode { get; set; } diff --git a/GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.Designer.cs b/GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.Designer.cs new file mode 100644 index 0000000..1e75389 --- /dev/null +++ b/GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.Designer.cs @@ -0,0 +1,451 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData")] + partial class AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-rc.1.22426.7"); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("AiWinCount") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultyPlayedArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultySettingArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("TokenCountDict") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedSongIdList") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.cs b/GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.cs new file mode 100644 index 0000000..240b325 --- /dev/null +++ b/GameDatabase/Migrations/20230918052543_AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddDifficultyPlayedArrayAndDifficultySettingArrayToUserData : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "DifficultyPlayedArray", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: "[]"); + + migrationBuilder.AddColumn( + name: "DifficultySettingArray", + table: "UserData", + type: "TEXT", + nullable: false, + defaultValue: "[]"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "DifficultyPlayedArray", + table: "UserData"); + + migrationBuilder.DropColumn( + name: "DifficultySettingArray", + table: "UserData"); + } + } +} diff --git a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs index 0c04119..2c0118c 100644 --- a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs +++ b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs @@ -276,6 +276,14 @@ namespace TaikoLocalServer.Migrations .IsRequired() .HasColumnType("TEXT"); + b.Property("DifficultyPlayedArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultySettingArray") + .IsRequired() + .HasColumnType("TEXT"); + b.Property("DisplayAchievement") .HasColumnType("INTEGER"); diff --git a/TaikoLocalServer/Controllers/Game/PlayResultController.cs b/TaikoLocalServer/Controllers/Game/PlayResultController.cs index 013f12c..d71f9d0 100644 --- a/TaikoLocalServer/Controllers/Game/PlayResultController.cs +++ b/TaikoLocalServer/Controllers/Game/PlayResultController.cs @@ -203,16 +203,17 @@ public class PlayResultController : BaseController }; userdata.CostumeData = JsonSerializer.Serialize(costumeData); + // Skip user setting altogether following official logic // Skip user setting saving when in dan mode as dan mode uses its own default setting - if (playMode != PlayMode.DanMode) - { - var lastStage = playResultData.AryStageInfoes.Last(); - var option = BinaryPrimitives.ReadInt16LittleEndian(lastStage.OptionFlg); - userdata.OptionSetting = option; - userdata.IsSkipOn = lastStage.IsSkipOn; - userdata.IsVoiceOn = !lastStage.IsVoiceOn; - userdata.NotesPosition = lastStage.NotesPosition; - } + // if (playMode != PlayMode.DanMode) + // { + // var lastStage = playResultData.AryStageInfoes.Last(); + // var option = BinaryPrimitives.ReadInt16LittleEndian(lastStage.OptionFlg); + // userdata.OptionSetting = option; + // userdata.IsSkipOn = lastStage.IsSkipOn; + // userdata.IsVoiceOn = !lastStage.IsVoiceOn; + // userdata.NotesPosition = lastStage.NotesPosition; + // } userdata.LastPlayDatetime = lastPlayDatetime; userdata.LastPlayMode = playResultData.PlayMode; @@ -236,6 +237,14 @@ public class PlayResultController : BaseController userdata.GenericInfoFlgArray = UpdateJsonUintFlagArray(userdata.GenericInfoFlgArray, playResultData.GetGenericInfoNoes, nameof(userdata.GenericInfoFlgArray)); + var difficultyPlayedArray = new List + { + playResultData.DifficultyPlayedCourse, + playResultData.DifficultyPlayedStar, + playResultData.DifficultyPlayedSort + }; + userdata.DifficultyPlayedArray = JsonSerializer.Serialize(difficultyPlayedArray); + userdata.AiWinCount += playResultData.AryStageInfoes.Count(data => data.IsWin); await userDatumService.UpdateUserDatum(userdata); } diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs index 582e680..69cc0bf 100644 --- a/TaikoLocalServer/Controllers/Game/UserDataController.cs +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -110,7 +110,27 @@ public class UserDataController : BaseController var defaultOptions = new byte[2]; BinaryPrimitives.WriteInt16LittleEndian(defaultOptions, userData.OptionSetting); + + var difficultyPlayedArray = Array.Empty(); + try + { + difficultyPlayedArray = JsonSerializer.Deserialize(userData.DifficultyPlayedArray); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing difficulty played json data failed"); + } + var difficultySettingArray = Array.Empty(); + try + { + difficultySettingArray = JsonSerializer.Deserialize(userData.DifficultySettingArray); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing difficulty setting json data failed"); + } + var response = new UserDataResponse { Result = 1, @@ -128,6 +148,20 @@ public class UserDataController : BaseController SongRecentCnt = (uint)recentSongs.Length }; + if (difficultyPlayedArray is { Length: >= 3 }) + { + response.DifficultyPlayedCourse = difficultyPlayedArray[0]; + response.DifficultyPlayedStar = difficultyPlayedArray[1]; + response.DifficultyPlayedSort = difficultyPlayedArray[2]; + } + + if (difficultySettingArray is { Length: >= 3 }) + { + response.DifficultySettingCourse = difficultySettingArray[0]; + response.DifficultySettingStar = difficultySettingArray[1]; + response.DifficultySettingSort = difficultySettingArray[2]; + } + return Ok(response); } } \ No newline at end of file From 4fedead1742bdf11bd3f002020d695bb06c4e603 Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Mon, 18 Sep 2023 18:54:02 +0900 Subject: [PATCH 28/49] Add DifficultySettingArray handle and WebUI --- SharedProject/Models/UserSetting.cs | 34 +- TaikoLocalServer/Common/Utils/JsonHelper.cs | 33 +- .../Controllers/Api/UserSettingsController.cs | 26 +- .../Controllers/Game/UserDataController.cs | 55 +-- TaikoWebUI/Pages/Profile.razor | 407 ++++++++++-------- TaikoWebUI/Pages/Profile.razor.cs | 26 +- 6 files changed, 328 insertions(+), 253 deletions(-) diff --git a/SharedProject/Models/UserSetting.cs b/SharedProject/Models/UserSetting.cs index 50808a4..3d37729 100644 --- a/SharedProject/Models/UserSetting.cs +++ b/SharedProject/Models/UserSetting.cs @@ -7,17 +7,23 @@ public class UserSetting public uint ToneId { get; set; } public bool IsDisplayAchievement { get; set; } - + public bool IsDisplayDanOnNamePlate { get; set; } - + + public uint DifficultySettingCourse { get; set; } + + public uint DifficultySettingStar { get; set; } + + public uint DifficultySettingSort { get; set; } + public bool IsVoiceOn { get; set; } - + public bool IsSkipOn { get; set; } public Difficulty AchievementDisplayDifficulty { get; set; } public PlaySetting PlaySetting { get; set; } = new(); - + public int NotesPosition { get; set; } public string MyDonName { get; set; } = string.Empty; @@ -27,29 +33,29 @@ public class UserSetting public uint TitlePlateId { get; set; } public uint Kigurumi { get; set; } - + public uint Head { get; set; } - + public uint Body { get; set; } - + public uint Face { get; set; } - + public uint Puchi { get; set; } public List UnlockedKigurumi { get; set; } = new(); - + public List UnlockedHead { get; set; } = new(); - + public List UnlockedBody { get; set; } = new(); - + public List UnlockedFace { get; set; } = new(); - + public List UnlockedPuchi { get; set; } = new(); public uint FaceColor { get; set; } - + public uint BodyColor { get; set; } - + public uint LimbColor { get; set; } } \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/JsonHelper.cs b/TaikoLocalServer/Common/Utils/JsonHelper.cs index 83c87fb..ad4b2aa 100644 --- a/TaikoLocalServer/Common/Utils/JsonHelper.cs +++ b/TaikoLocalServer/Common/Utils/JsonHelper.cs @@ -1,10 +1,33 @@ -using System.Text.Json; -using GameDatabase.Entities; +using GameDatabase.Entities; +using System.Text.Json; namespace TaikoLocalServer.Common.Utils; public static class JsonHelper { + public static uint[] GetUIntArrayFromJson(string data, int length, ILogger logger, string fieldName) + { + var array = new uint[length]; + try + { + array = JsonSerializer.Deserialize(data); + } + catch (JsonException e) + { + logger.LogError(e, "Parsing {FieldName} json data failed", fieldName); + } + + if (array != null && array.Length >= length) + { + return array; + } + + logger.LogWarning($"{fieldName} is null or length less than {length}!"); + array = new uint[length]; + + return array; + } + public static List GetCostumeDataFromUserData(UserDatum userData, ILogger logger) { var costumeData = new List { 0, 0, 0, 0, 0 }; @@ -22,13 +45,13 @@ public static class JsonHelper { return costumeData; } - + logger.LogWarning("Costume data is null or count less than 5!"); costumeData = new List { 0, 0, 0, 0, 0 }; return costumeData; } - + public static List> GetCostumeUnlockDataFromUserData(UserDatum userData, ILogger logger) { var costumeUnlockData = new List> { new(), new(), new(), new(), new() }; @@ -45,7 +68,7 @@ public static class JsonHelper { return costumeUnlockData; } - + logger.LogWarning("Costume unlock data is null or count less than 5!"); costumeUnlockData = new List> { new(), new(), new(), new(), new() }; diff --git a/TaikoLocalServer/Controllers/Api/UserSettingsController.cs b/TaikoLocalServer/Controllers/Api/UserSettingsController.cs index 5b44c72..d98e18a 100644 --- a/TaikoLocalServer/Controllers/Api/UserSettingsController.cs +++ b/TaikoLocalServer/Controllers/Api/UserSettingsController.cs @@ -1,6 +1,6 @@ -using System.Text.Json; -using SharedProject.Models; +using SharedProject.Models; using SharedProject.Utils; +using System.Text.Json; namespace TaikoLocalServer.Controllers.Api; @@ -25,6 +25,8 @@ public class UserSettingsController : BaseController return NotFound(); } + var difficultySettingArray = JsonHelper.GetUIntArrayFromJson(user.DifficultySettingArray, 3, Logger, nameof(user.DifficultySettingArray)); + var costumeData = JsonHelper.GetCostumeDataFromUserData(user, Logger); var costumeUnlockData = JsonHelper.GetCostumeUnlockDataFromUserData(user, Logger); @@ -34,6 +36,9 @@ public class UserSettingsController : BaseController AchievementDisplayDifficulty = user.AchievementDisplayDifficulty, IsDisplayAchievement = user.DisplayAchievement, IsDisplayDanOnNamePlate = user.DisplayDan, + DifficultySettingCourse = difficultySettingArray[0], + DifficultySettingStar = difficultySettingArray[1], + DifficultySettingSort = difficultySettingArray[2], IsVoiceOn = user.IsVoiceOn, IsSkipOn = user.IsSkipOn, NotesPosition = user.NotesPosition, @@ -48,9 +53,9 @@ public class UserSettingsController : BaseController Face = costumeData[3], Puchi = costumeData[4], UnlockedKigurumi = costumeUnlockData[0], - UnlockedHead = costumeUnlockData[1], - UnlockedBody = costumeUnlockData[2], - UnlockedFace = costumeUnlockData[3], + UnlockedHead = costumeUnlockData[1], + UnlockedBody = costumeUnlockData[2], + UnlockedFace = costumeUnlockData[3], UnlockedPuchi = costumeUnlockData[4], BodyColor = user.ColorBody, FaceColor = user.ColorFace, @@ -77,11 +82,19 @@ public class UserSettingsController : BaseController userSetting.Face, userSetting.Puchi, }; - + + var difficultySettings = new List + { + userSetting.DifficultySettingCourse, + userSetting.DifficultySettingStar, + userSetting.DifficultySettingSort + }; + user.IsSkipOn = userSetting.IsSkipOn; user.IsVoiceOn = userSetting.IsVoiceOn; user.DisplayAchievement = userSetting.IsDisplayAchievement; user.DisplayDan = userSetting.IsDisplayDanOnNamePlate; + user.DifficultySettingArray = JsonSerializer.Serialize(difficultySettings); user.NotesPosition = userSetting.NotesPosition; user.SelectedToneId = userSetting.ToneId; user.AchievementDisplayDifficulty = userSetting.AchievementDisplayDifficulty; @@ -93,7 +106,6 @@ public class UserSettingsController : BaseController user.ColorFace = userSetting.FaceColor; user.ColorLimb = userSetting.LimbColor; user.CostumeData = JsonSerializer.Serialize(costumes); - await userDatumService.UpdateUserDatum(user); diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs index 69cc0bf..db02b1d 100644 --- a/TaikoLocalServer/Controllers/Game/UserDataController.cs +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -1,6 +1,6 @@ -using System.Buffers.Binary; +using Microsoft.Extensions.Options; +using System.Buffers.Binary; using System.Text.Json; -using Microsoft.Extensions.Options; using TaikoLocalServer.Settings; using Throw; @@ -17,8 +17,8 @@ public class UserDataController : BaseController private readonly IGameDataService gameDataService; private readonly ServerSettings settings; - - public UserDataController(IUserDatumService userDatumService, ISongPlayDatumService songPlayDatumService, + + public UserDataController(IUserDatumService userDatumService, ISongPlayDatumService songPlayDatumService, IGameDataService gameDataService, IOptions settings) { this.userDatumService = userDatumService; @@ -80,7 +80,7 @@ public class UserDataController : BaseController .ThenByDescending(datum => datum.SongNumber) .Select(datum => datum.SongId) .ToArray(); - + // Use custom implementation as distinctby cannot guarantee preserved element var recentSet = new OrderedSet(); foreach (var id in recentSongs) @@ -111,26 +111,17 @@ public class UserDataController : BaseController var defaultOptions = new byte[2]; BinaryPrimitives.WriteInt16LittleEndian(defaultOptions, userData.OptionSetting); - var difficultyPlayedArray = Array.Empty(); - try + var difficultySettingArray = JsonHelper.GetUIntArrayFromJson(userData.DifficultySettingArray, 3, Logger, nameof(userData.DifficultySettingArray)); + for (int i = 0; i < 3; i++) { - difficultyPlayedArray = JsonSerializer.Deserialize(userData.DifficultyPlayedArray); - } - catch (JsonException e) - { - Logger.LogError(e, "Parsing difficulty played json data failed"); - } - - var difficultySettingArray = Array.Empty(); - try - { - difficultySettingArray = JsonSerializer.Deserialize(userData.DifficultySettingArray); - } - catch (JsonException e) - { - Logger.LogError(e, "Parsing difficulty setting json data failed"); + if (difficultySettingArray[i] >= 2) + { + difficultySettingArray[i] -= 1; + } } + var difficultyPlayedArray = JsonHelper.GetUIntArrayFromJson(userData.DifficultyPlayedArray, 3, Logger, nameof(userData.DifficultyPlayedArray)); + var response = new UserDataResponse { Result = 1, @@ -144,24 +135,16 @@ public class UserDataController : BaseController NotesPosition = userData.NotesPosition, IsVoiceOn = userData.IsVoiceOn, IsSkipOn = userData.IsSkipOn, + DifficultySettingCourse = difficultySettingArray[0], + DifficultySettingStar = difficultySettingArray[1], + DifficultySettingSort = difficultySettingArray[2], + DifficultyPlayedCourse = difficultyPlayedArray[0], + DifficultyPlayedStar = difficultyPlayedArray[1], + DifficultyPlayedSort = difficultyPlayedArray[2], IsChallengecompe = false, SongRecentCnt = (uint)recentSongs.Length }; - if (difficultyPlayedArray is { Length: >= 3 }) - { - response.DifficultyPlayedCourse = difficultyPlayedArray[0]; - response.DifficultyPlayedStar = difficultyPlayedArray[1]; - response.DifficultyPlayedSort = difficultyPlayedArray[2]; - } - - if (difficultySettingArray is { Length: >= 3 }) - { - response.DifficultySettingCourse = difficultySettingArray[0]; - response.DifficultySettingStar = difficultySettingArray[1]; - response.DifficultySettingSort = difficultySettingArray[2]; - } - return Ok(response); } } \ No newline at end of file diff --git a/TaikoWebUI/Pages/Profile.razor b/TaikoWebUI/Pages/Profile.razor index 1373290..0eaa3dd 100644 --- a/TaikoWebUI/Pages/Profile.razor +++ b/TaikoWebUI/Pages/Profile.razor @@ -11,204 +11,237 @@ @if (response is not null) { - - - - - -

Profile Options

+ + + + + +

Profile Options

- + - - - - - Select a Title - - - - - @for (uint i = 0; i < 8; i++) - { - var index = i; - @TitlePlateStrings[index] - } - - - - - - @foreach (var item in Enum.GetValues()) - { - - } - - - - -
-
- - - -

Costume Options

- - - - - @for (var i = 0; i < Constants.COSTUME_HEAD_MAX; i++) - { - var index = (uint)i; - var costumeTitle = GameDataService.GetHeadTitle(index); - @index - @costumeTitle - } - - - - @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 - } - - - - @for (var i = 0; i < Constants.COSTUME_KIGURUMI_MAX; i++) - { - var index = (uint)i; - var costumeTitle = GameDataService.GetKigurumiTitle(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 < Constants.COSTUME_COLOR_MAX; i++) + + + + + Select a Title + + + + + @for (uint i = 0; i < 8; i++) { var index = i; - -
- @index -
+ @TitlePlateStrings[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 -
- } -
-
-
-
-
-
+
+
- - -

Song Options

- - - - - - - - - - - - - @for (uint i = 0; i < 15; i++) - { - var index = i; - @SpeedStrings[index] - } - + + @foreach (var item in Enum.GetValues()) + { + + } + - - @foreach (var item in Enum.GetValues()) - { - - } - + + + + + + + + + + + @for (uint i = 0; i < DifficultySettingCourseStrings.Length; i++) + { + var index = i; + @DifficultySettingCourseStrings[index] + } + - - @for (uint i = 0; i < 19; i++) - { - var index = i; - @ToneStrings[index] - } - + + @for (uint i = 0; i < DifficultySettingStarStrings.Length; i++) + { + var index = i; + @DifficultySettingStarStrings[index] + } + - - Notes Position - - - - - -
- - - + + @for (uint i = 0; i < DifficultySettingSortStrings.Length; i++) + { + var index = i; + @DifficultySettingSortStrings[index] + } + + + + + + - - - - @if (isSavingOptions) - { - - Saving... - } - else - { - - Save - } - - + + +

Costume Options

+ + + + + @for (var i = 0; i < Constants.COSTUME_HEAD_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetHeadTitle(index); + @index - @costumeTitle + } + - + + @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 + } + + + + @for (var i = 0; i < Constants.COSTUME_KIGURUMI_MAX; i++) + { + var index = (uint)i; + var costumeTitle = GameDataService.GetKigurumiTitle(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 < 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 +
+ } +
+
+
+ + + + + + +

Song Options

+ + + + + + + + + + + + + @for (uint i = 0; i < 15; i++) + { + var index = i; + @SpeedStrings[index] + } + + + + @foreach (var item in Enum.GetValues()) + { + + } + + + + @for (uint i = 0; i < 19; i++) + { + var index = i; + @ToneStrings[index] + } + + + + Notes Position + + + + +
+
+ + + + + + + + @if (isSavingOptions) + { + + Saving... + } + else + { + + Save + } + + + + } \ No newline at end of file diff --git a/TaikoWebUI/Pages/Profile.razor.cs b/TaikoWebUI/Pages/Profile.razor.cs index 31c2d78..bd9a5e7 100644 --- a/TaikoWebUI/Pages/Profile.razor.cs +++ b/TaikoWebUI/Pages/Profile.razor.cs @@ -11,15 +11,15 @@ public partial class Profile private bool isSavingOptions; - private static readonly string[] CostumeColors = + private static readonly string[] CostumeColors = { "#F84828", "#68C0C0", "#DC1500", "#F8F0E0", "#009687", "#00BF87", "#00FF9A", "#66FFC2", "#FFFFFF", "#690000", "#FF0000", "#FF6666", - "#FFB3B3", "#00BCC2", "#00F7FF", "#66FAFF", "#B3FDFF", "#E4E4E4", - "#993800", "#FF5E00", "#FF9E78", "#FFCFB3", "#005199", "#0088FF", + "#FFB3B3", "#00BCC2", "#00F7FF", "#66FAFF", "#B3FDFF", "#E4E4E4", + "#993800", "#FF5E00", "#FF9E78", "#FFCFB3", "#005199", "#0088FF", "#66B8FF", "#B3DBFF", "#B9B9B9", "#B37700", "#FFAA00", "#FFCC66", "#FFE2B3", "#000C80", "#0019FF", "#6675FF", "#B3BAFF", "#858585", - "#B39B00", "#FFDD00", "#FFFF00", "#FFFF71", "#2B0080", "#5500FF", + "#B39B00", "#FFDD00", "#FFFF00", "#FFFF71", "#2B0080", "#5500FF", "#9966FF", "#CCB3FF", "#505050", "#38A100", "#78C900", "#B3FF00", "#DCFF8A", "#610080", "#C400FF", "#DC66FF", "#EDB3FF", "#232323", "#006600", "#00B800", "#00FF00", "#8AFF9E", "#990059", "#FF0095", @@ -50,6 +50,24 @@ public partial class Profile "AI 1", "AI 2", "AI 3", "AI 4" }; + private static readonly string[] DifficultySettingCourseStrings = + { + "None", "Set up each time", + "Easy", "Normal", "Hard", "Oni", "Ura Oni" + }; + + private static readonly string[] DifficultySettingStarStrings = + { + "None", "Set up each time", + "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" + }; + + private static readonly string[] DifficultySettingSortStrings = + { + "None", "Set up each time", "Default", + "Not cleared", "Not Full Combo", "Not Donderful Combo" + }; + private readonly List breadcrumbs = new() { new BreadcrumbItem("Cards", href: "/Cards"), From 07772b4dbbb8c619e52ae78c3744159e98aafd8f Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Mon, 18 Sep 2023 18:12:43 +0800 Subject: [PATCH 29/49] Add MyDonNameLanguage to database --- GameDatabase/Entities/UserDatum.cs | 1 + ...AddMyDonNameLanguageToUserData.Designer.cs | 454 ++++++++++++++++++ ...18101009_AddMyDonNameLanguageToUserData.cs | 29 ++ .../Migrations/TaikoDbContextModelSnapshot.cs | 3 + .../Controllers/Game/BaidController.cs | 2 +- .../Controllers/Game/MyDonEntryController.cs | 3 +- 6 files changed, 490 insertions(+), 2 deletions(-) create mode 100644 GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.Designer.cs create mode 100644 GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.cs diff --git a/GameDatabase/Entities/UserDatum.cs b/GameDatabase/Entities/UserDatum.cs index 5a33c78..2dc25b2 100644 --- a/GameDatabase/Entities/UserDatum.cs +++ b/GameDatabase/Entities/UserDatum.cs @@ -6,6 +6,7 @@ namespace GameDatabase.Entities { public ulong Baid { get; set; } public string MyDonName { get; set; } = string.Empty; + public uint MyDonNameLanguage { get; set; } public string Title { get; set; } = string.Empty; public uint TitlePlateId { get; set; } public string FavoriteSongsArray { get; set; } = "[]"; diff --git a/GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.Designer.cs b/GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.Designer.cs new file mode 100644 index 0000000..9e38bac --- /dev/null +++ b/GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.Designer.cs @@ -0,0 +1,454 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20230918101009_AddMyDonNameLanguageToUserData")] + partial class AddMyDonNameLanguageToUserData + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.0-rc.1.22426.7"); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex(new[] { "Baid" }, "IX_Card_Baid") + .IsUnique(); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("AiWinCount") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultyPlayedArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultySettingArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MyDonNameLanguage") + .HasColumnType("INTEGER"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("TokenCountDict") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedSongIdList") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.HasOne("GameDatabase.Entities.Card", "Ba") + .WithMany() + .HasForeignKey("Baid") + .HasPrincipalKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.cs b/GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.cs new file mode 100644 index 0000000..27bc80a --- /dev/null +++ b/GameDatabase/Migrations/20230918101009_AddMyDonNameLanguageToUserData.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TaikoLocalServer.Migrations +{ + /// + public partial class AddMyDonNameLanguageToUserData : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "MyDonNameLanguage", + table: "UserData", + type: "INTEGER", + nullable: false, + defaultValue: 0u); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "MyDonNameLanguage", + table: "UserData"); + } + } +} diff --git a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs index 2c0118c..dd61194 100644 --- a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs +++ b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs @@ -314,6 +314,9 @@ namespace TaikoLocalServer.Migrations .IsRequired() .HasColumnType("TEXT"); + b.Property("MyDonNameLanguage") + .HasColumnType("INTEGER"); + b.Property("NotesPosition") .HasColumnType("INTEGER"); diff --git a/TaikoLocalServer/Controllers/Game/BaidController.cs b/TaikoLocalServer/Controllers/Game/BaidController.cs index e411c66..fa02809 100644 --- a/TaikoLocalServer/Controllers/Game/BaidController.cs +++ b/TaikoLocalServer/Controllers/Game/BaidController.cs @@ -118,7 +118,7 @@ public class BaidController : BaseController PlayerType = 0, Baid = baid, MydonName = userData.MyDonName, - MydonNameLanguage = 4, + MydonNameLanguage = userData.MyDonNameLanguage, Title = userData.Title, TitleplateId = userData.TitlePlateId, ColorFace = userData.ColorFace, diff --git a/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs b/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs index 45aeb79..fe16623 100644 --- a/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs +++ b/TaikoLocalServer/Controllers/Game/MyDonEntryController.cs @@ -33,6 +33,7 @@ public class MyDonEntryController : BaseController { Baid = newId, MyDonName = request.MydonName, + MyDonNameLanguage = 0, DisplayDan = true, DisplayAchievement = true, AchievementDisplayDifficulty = Difficulty.None, @@ -55,7 +56,7 @@ public class MyDonEntryController : BaseController Result = 1, Baid = newId, MydonName = request.MydonName, - MydonNameLanguage = 4 + MydonNameLanguage = 0 }; return Ok(response); From fd38cc680829a0014b5e9e323bc816565dfb03c2 Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Mon, 18 Sep 2023 19:26:08 +0900 Subject: [PATCH 30/49] Add MyDonNameLanguage to WebUI --- SharedProject/Models/UserSetting.cs | 2 ++ .../Controllers/Api/UserSettingsController.cs | 2 ++ TaikoWebUI/Pages/Profile.razor | 21 +++++++++++++++---- TaikoWebUI/Pages/Profile.razor.cs | 5 +++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/SharedProject/Models/UserSetting.cs b/SharedProject/Models/UserSetting.cs index 3d37729..b05460e 100644 --- a/SharedProject/Models/UserSetting.cs +++ b/SharedProject/Models/UserSetting.cs @@ -28,6 +28,8 @@ public class UserSetting public string MyDonName { get; set; } = string.Empty; + public uint MyDonNameLanguage { get; set; } + public string Title { get; set; } = string.Empty; public uint TitlePlateId { get; set; } diff --git a/TaikoLocalServer/Controllers/Api/UserSettingsController.cs b/TaikoLocalServer/Controllers/Api/UserSettingsController.cs index d98e18a..632a89e 100644 --- a/TaikoLocalServer/Controllers/Api/UserSettingsController.cs +++ b/TaikoLocalServer/Controllers/Api/UserSettingsController.cs @@ -45,6 +45,7 @@ public class UserSettingsController : BaseController PlaySetting = PlaySettingConverter.ShortToPlaySetting(user.OptionSetting), ToneId = user.SelectedToneId, MyDonName = user.MyDonName, + MyDonNameLanguage = user.MyDonNameLanguage, Title = user.Title, TitlePlateId = user.TitlePlateId, Kigurumi = costumeData[0], @@ -100,6 +101,7 @@ public class UserSettingsController : BaseController user.AchievementDisplayDifficulty = userSetting.AchievementDisplayDifficulty; user.OptionSetting = PlaySettingConverter.PlaySettingToShort(userSetting.PlaySetting); user.MyDonName = userSetting.MyDonName; + user.MyDonNameLanguage = userSetting.MyDonNameLanguage; user.Title = userSetting.Title; user.TitlePlateId = userSetting.TitlePlateId; user.ColorBody = userSetting.BodyColor; diff --git a/TaikoWebUI/Pages/Profile.razor b/TaikoWebUI/Pages/Profile.razor index 0eaa3dd..9e3e22f 100644 --- a/TaikoWebUI/Pages/Profile.razor +++ b/TaikoWebUI/Pages/Profile.razor @@ -18,7 +18,20 @@

Profile Options

- + + + + + + + @for (uint i = 0; i < LanguageStrings.Length; i++) + { + var index = i; + @LanguageStrings[index] + } + + + @@ -29,7 +42,7 @@ - @for (uint i = 0; i < 8; i++) + @for (uint i = 0; i < TitlePlateStrings.Length; i++) { var index = i; @TitlePlateStrings[index] @@ -188,7 +201,7 @@ - @for (uint i = 0; i < 15; i++) + @for (uint i = 0; i < SpeedStrings.Length; i++) { var index = i; @SpeedStrings[index] @@ -204,7 +217,7 @@ - @for (uint i = 0; i < 19; i++) + @for (uint i = 0; i < ToneStrings.Length; i++) { var index = i; @ToneStrings[index] diff --git a/TaikoWebUI/Pages/Profile.razor.cs b/TaikoWebUI/Pages/Profile.razor.cs index bd9a5e7..3bd0ceb 100644 --- a/TaikoWebUI/Pages/Profile.razor.cs +++ b/TaikoWebUI/Pages/Profile.razor.cs @@ -44,6 +44,11 @@ public partial class Profile "Synth Drum", "Shuriken", "Bubble Pop", "Electric Guitar" }; + private static readonly string[] LanguageStrings = + { + "Japanese", "English", "Chinese (Traditional)", "Korean", "Chinese (Simplified)" + }; + private static readonly string[] TitlePlateStrings = { "Wood", "Rainbow", "Gold", "Purple", From 4cce75b692382d9ac746008e22bc10e14fdcb857 Mon Sep 17 00:00:00 2001 From: S-Sebb?? Date: Thu, 21 Sep 2023 04:53:03 +0800 Subject: [PATCH 31/49] Implement sending user unlockedSongList in userDataResponse and dymamically sending eventFolder data in initialDataResponse --- TaikoLocalServer/Common/Constants.cs | 5 --- .../Game/InitialDataCheckController.cs | 5 +-- .../Controllers/Game/UserDataController.cs | 31 ++++++++++++++++--- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/TaikoLocalServer/Common/Constants.cs b/TaikoLocalServer/Common/Constants.cs index ae4ab64..6f4653b 100644 --- a/TaikoLocalServer/Common/Constants.cs +++ b/TaikoLocalServer/Common/Constants.cs @@ -20,10 +20,6 @@ public static class Constants public const string INTRO_DATA_FILE_NAME = "intro_data.json"; public const string EVENT_FOLDER_DATA_FILE_NAME = "event_folder_data.json"; - public static readonly int[] EVENT_FOLDER_IDS = { - 1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14 - }; - public const int MIN_DAN_ID = 1; public const int MAX_DAN_ID = 19; @@ -43,6 +39,5 @@ public static class Constants COSTUME_FLAG_3_ARRAY_SIZE, COSTUME_FLAG_4_ARRAY_SIZE, COSTUME_FLAG_5_ARRAY_SIZE - }; } \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index da98de8..b4d1c1b 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -92,11 +92,12 @@ public class InitialDataCheckController : BaseController(); - foreach (var folderId in Constants.EVENT_FOLDER_IDS) + var eventFolderDictionary = gameDataService.GetFolderDictionary(); + foreach (var folderId in eventFolderDictionary.Keys) { eventFolderData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { - InfoId = (uint)folderId, + InfoId = folderId, VerupNo = 1 }); } diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs index db02b1d..0b24b4e 100644 --- a/TaikoLocalServer/Controllers/Game/UserDataController.cs +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -34,13 +34,34 @@ public class UserDataController : BaseController Logger.LogInformation("UserData request : {Request}", request.Stringify()); var songIdMax = settings.EnableMoreSongs ? Constants.MUSIC_ID_MAX_EXPANDED : Constants.MUSIC_ID_MAX; - var releaseSongArray = - FlagCalculator.GetBitArrayFromIds(gameDataService.GetMusicList(), songIdMax, Logger); - - var uraSongArray = - FlagCalculator.GetBitArrayFromIds(gameDataService.GetMusicWithUraList(), songIdMax, Logger); var userData = await userDatumService.GetFirstUserDatumOrDefault(request.Baid); + + var unlockedSongIdList = new List(); + try + { + unlockedSongIdList = !string.IsNullOrEmpty(userData.UnlockedSongIdList) + ? JsonSerializer.Deserialize>(userData.UnlockedSongIdList) + : new List(); + } + catch (JsonException e) + { + Logger.LogError(e, "Parsing UnlockedSongIdList data for user with baid {Request} failed!", request.Baid); + } + + unlockedSongIdList.ThrowIfNull("UnlockedSongIdList should never be null"); + + var musicList = gameDataService.GetMusicList(); + var lockedSongsList = gameDataService.GetLockedSongsList(); + lockedSongsList = lockedSongsList.Except(unlockedSongIdList).ToList(); + var enabledMusicList = musicList.Except(lockedSongsList); + var releaseSongArray = + FlagCalculator.GetBitArrayFromIds(enabledMusicList, songIdMax, Logger); + + var defaultSongWithUraList = gameDataService.GetMusicWithUraList(); + var enabledUraMusicList = defaultSongWithUraList.Except(lockedSongsList); + var uraSongArray = + FlagCalculator.GetBitArrayFromIds(enabledUraMusicList, songIdMax, Logger); var toneFlg = Array.Empty(); try From e5678d00fd0d58d946495e29868e230ffbfb00d2 Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Fri, 22 Sep 2023 03:58:16 +0900 Subject: [PATCH 32/49] Synchronize VerupNo of VerupNoData2 with json --- .../Game/InitialDataCheckController.cs | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index b4d1c1b..8f3d59f 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -24,7 +24,7 @@ public class InitialDataCheckController : BaseController new InitialdatacheckResponse.VerupNoData1 - { - MasterType = i, - VerupNo = 1 - }) + { + MasterType = i, + VerupNo = 1 + }) .ToList(); response.AryVerupNoData1s.AddRange(aryVerUp); - + var danData = new List(); for (var danId = Constants.MIN_DAN_ID; danId <= Constants.MAX_DAN_ID; danId++) { + gameDataService.GetDanDataDictionary().TryGetValue((uint)danId, out var odaiData); danData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { InfoId = (uint)danId, - VerupNo = 1 + VerupNo = odaiData is not null ? odaiData.VerupNo : 1 }); } var verUp2Type101 = new InitialdatacheckResponse.VerupNoData2 @@ -72,33 +73,35 @@ public class InitialDataCheckController : BaseController(); var gaidenDataDictionary = gameDataService.GetGaidenDataDictionary(); foreach (var gaidenId in gaidenDataDictionary.Keys) { + gaidenDataDictionary.TryGetValue(gaidenId, out var odaiData); gaidenData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { InfoId = gaidenId, - VerupNo = 1 + VerupNo = odaiData is not null ? odaiData.VerupNo : 1 }); } - + var verUp2Type102 = new InitialdatacheckResponse.VerupNoData2 { MasterType = 102, }; verUp2Type102.AryInformationDatas.AddRange(gaidenData); response.AryVerupNoData2s.Add(verUp2Type102); - + var eventFolderData = new List(); var eventFolderDictionary = gameDataService.GetFolderDictionary(); foreach (var folderId in eventFolderDictionary.Keys) { + eventFolderDictionary.TryGetValue(folderId, out var folderData); eventFolderData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData { InfoId = folderId, - VerupNo = 1 + VerupNo = folderData is not null ? folderData.VerupNo : 1 }); } var verUp2Type103 = new InitialdatacheckResponse.VerupNoData2 @@ -109,22 +112,24 @@ public class InitialDataCheckController : BaseController(); + var songIntroDictionary = gameDataService.GetSongIntroDictionary(); + foreach (var setId in songIntroDictionary.Select(item => item.Value.SetId)) + { + songIntroDictionary.TryGetValue(setId, out var introData); + songIntroData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData + { + InfoId = setId, + VerupNo = introData is not null ? introData.VerupNo : 1 + }); + } var verUp2Type105 = new InitialdatacheckResponse.VerupNoData2 { MasterType = 105, }; - for (var setId = 1; setId <= gameDataService.GetSongIntroDictionary().Count; setId++) - { - songIntroData.Add(new InitialdatacheckResponse.VerupNoData2.InformationData - { - InfoId = (uint)setId, - VerupNo = 1 - }); - } verUp2Type105.AryInformationDatas.AddRange(songIntroData); response.AryVerupNoData2s.Add(verUp2Type105); - - response.AryChassisFunctionIds = new uint[] {1,2,3}; + + response.AryChassisFunctionIds = new uint[] { 1, 2, 3 }; return Ok(response); } From dca46c0cd700dabed57b96e43a4b997fb9451a8d Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Sat, 23 Sep 2023 08:34:23 +0900 Subject: [PATCH 33/49] Add GetfolderResponse.EventfolderData.ParentFolderId handle --- SharedProject/Models/EventFolderData.cs | 19 +++++++++++-------- TaikoLocalServer/Services/GameDataService.cs | 17 +++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/SharedProject/Models/EventFolderData.cs b/SharedProject/Models/EventFolderData.cs index 61e7a93..fb183c5 100644 --- a/SharedProject/Models/EventFolderData.cs +++ b/SharedProject/Models/EventFolderData.cs @@ -4,15 +4,18 @@ namespace SharedProject.Models; public class EventFolderData { - [JsonPropertyName("folderId")] - public uint FolderId { get; set; } + [JsonPropertyName("folderId")] + public uint FolderId { get; set; } - [JsonPropertyName("verupNo")] - public uint VerupNo { get; set; } + [JsonPropertyName("verupNo")] + public uint VerupNo { get; set; } - [JsonPropertyName("priority")] - public uint Priority { get; set; } + [JsonPropertyName("priority")] + public uint Priority { get; set; } - [JsonPropertyName("songNo")] - public uint[]? SongNo { get; set; } + [JsonPropertyName("songNo")] + public uint[]? SongNo { get; set; } + + [JsonPropertyName("parentFolderId")] + public uint ParentFolderId { get; set; } } \ No newline at end of file diff --git a/TaikoLocalServer/Services/GameDataService.cs b/TaikoLocalServer/Services/GameDataService.cs index a572cd5..cdf9ca4 100644 --- a/TaikoLocalServer/Services/GameDataService.cs +++ b/TaikoLocalServer/Services/GameDataService.cs @@ -17,7 +17,7 @@ public class GameDataService : IGameDataService private ImmutableDictionary danDataDictionary = ImmutableDictionary.Empty; - + private ImmutableDictionary gaidenDataDictionary = ImmutableDictionary.Empty; @@ -77,7 +77,7 @@ public class GameDataService : IGameDataService { return danDataDictionary; } - + public ImmutableDictionary GetGaidenDataDictionary() { return gaidenDataDictionary; @@ -112,7 +112,7 @@ public class GameDataService : IGameDataService { return lockedSongsList; } - + public ImmutableDictionary GetQRCodeDataDictionary() { return qrCodeDataDictionary; @@ -172,7 +172,7 @@ public class GameDataService : IGameDataService InitializeMusicAttributes(attributesData); InitializeDanData(danData); - + InitializeGaidenData(gaidenData); InitializeIntroData(introData); @@ -186,7 +186,7 @@ public class GameDataService : IGameDataService InitializeTokenData(tokenData); InitializeLockedSongsData(lockedSongsData); - + InitializeQRCodeData(qrCodeData); } @@ -231,7 +231,7 @@ public class GameDataService : IGameDataService danData.ThrowIfNull("Shouldn't happen!"); danDataDictionary = danData.ToImmutableDictionary(data => data.DanId, ToResponseOdaiData); } - + private void InitializeGaidenData(List? gaidenData) { gaidenData.ThrowIfNull("Shouldn't happen!"); @@ -284,7 +284,7 @@ public class GameDataService : IGameDataService lockedSongsData.ThrowIfNull("Shouldn't happen!"); lockedSongsList = lockedSongsData["songNo"].ToList(); } - + private void InitializeQRCodeData(List? qrCodeData) { qrCodeData.ThrowIfNull("Shouldn't happen!"); @@ -340,7 +340,8 @@ public class GameDataService : IGameDataService FolderId = data.FolderId, VerupNo = data.VerupNo, Priority = data.Priority, - SongNoes = data.SongNo + SongNoes = data.SongNo, + ParentFolderId = data.ParentFolderId }; return responseEventFolderData; From d63e3e8f7f9262a487857d50dd35a1a18637c817 Mon Sep 17 00:00:00 2001 From: asesidaa <1061472754@qq.com> Date: Sat, 23 Sep 2023 16:43:59 +0800 Subject: [PATCH 34/49] Update all to .net 8 Bump mudblazor to latest --- GameDatabase/GameDatabase.csproj | 19 +- .../LocalSaveModScoreMigrator.csproj | 3 +- SharedProject/SharedProject.csproj | 3 +- TaikoLocalServer/.gitignore | 5 +- .../Game/InitialDataCheckController.cs | 8 +- TaikoLocalServer/TaikoLocalServer.csproj | 2 +- TaikoWebUI/Pages/Cards.razor | 6 +- TaikoWebUI/Pages/Cards.razor.cs | 2 +- TaikoWebUI/Pages/DaniDojo.razor | 19 +- TaikoWebUI/Pages/HighScores.razor | 52 +- TaikoWebUI/Pages/Profile.razor | 4 +- TaikoWebUI/Pages/Profile.razor.cs | 2 +- TaikoWebUI/Shared/MainLayout.razor | 2 +- TaikoWebUI/TaikoWebUI.csproj | 13 +- TaikoWebUI/wwwroot/css/app.css | 101 ++++ .../wwwroot/css/bootstrap/bootstrap.min.css | 7 + .../css/bootstrap/bootstrap.min.css.map | 1 + .../wwwroot/css/open-iconic/FONT-LICENSE | 86 +++ .../wwwroot/css/open-iconic/ICON-LICENSE | 21 + TaikoWebUI/wwwroot/css/open-iconic/README.md | 114 ++++ .../font/css/open-iconic-bootstrap.min.css | 1 + .../open-iconic/font/fonts/open-iconic.eot | Bin 0 -> 28196 bytes .../open-iconic/font/fonts/open-iconic.otf | Bin 0 -> 20996 bytes .../open-iconic/font/fonts/open-iconic.svg | 543 ++++++++++++++++++ .../open-iconic/font/fonts/open-iconic.ttf | Bin 0 -> 28028 bytes .../open-iconic/font/fonts/open-iconic.woff | Bin 0 -> 14984 bytes TaikoWebUI/wwwroot/index.html | 10 +- 27 files changed, 954 insertions(+), 70 deletions(-) create mode 100644 TaikoWebUI/wwwroot/css/app.css create mode 100644 TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css create mode 100644 TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css.map create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/FONT-LICENSE create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/ICON-LICENSE create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/README.md create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/font/fonts/open-iconic.eot create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/font/fonts/open-iconic.otf create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/font/fonts/open-iconic.svg create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf create mode 100644 TaikoWebUI/wwwroot/css/open-iconic/font/fonts/open-iconic.woff diff --git a/GameDatabase/GameDatabase.csproj b/GameDatabase/GameDatabase.csproj index 79420dd..b3f8cfc 100644 --- a/GameDatabase/GameDatabase.csproj +++ b/GameDatabase/GameDatabase.csproj @@ -1,22 +1,23 @@ - net6.0 + net8.0 enable enable + 11 - + - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - + \ No newline at end of file diff --git a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj index ce03ddd..493e2f9 100644 --- a/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj +++ b/LocalSaveModScoreMigrator/LocalSaveModScoreMigrator.csproj @@ -2,10 +2,11 @@ Exe - net6.0 + net8.0 enable enable 1.0.0-beta1 + 11 diff --git a/SharedProject/SharedProject.csproj b/SharedProject/SharedProject.csproj index f6af8be..426878f 100644 --- a/SharedProject/SharedProject.csproj +++ b/SharedProject/SharedProject.csproj @@ -1,9 +1,10 @@ - net6.0 + net8.0 enable enable + 11 diff --git a/TaikoLocalServer/.gitignore b/TaikoLocalServer/.gitignore index 388d155..50cb58a 100644 --- a/TaikoLocalServer/.gitignore +++ b/TaikoLocalServer/.gitignore @@ -1 +1,4 @@ -wwwroot/data/music_attribute.json \ No newline at end of file +wwwroot/data/music_attribute.json +wwwroot/data/music_order.json +wwwroot/data/musicinfo.json +wwwroot/data/wordlist.json \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs index 8f3d59f..f7ed4da 100644 --- a/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs +++ b/TaikoLocalServer/Controllers/Game/InitialDataCheckController.cs @@ -64,7 +64,7 @@ public class InitialDataCheckController : BaseController - + diff --git a/TaikoWebUI/Pages/Cards.razor b/TaikoWebUI/Pages/Cards.razor index b71d5ac..27e2477 100644 --- a/TaikoWebUI/Pages/Cards.razor +++ b/TaikoWebUI/Pages/Cards.razor @@ -41,7 +41,7 @@ Delete Card @@ -63,8 +63,8 @@ Dense="true" Color="Color.Primary" Label="View Play Data" - StartIcon="@Icons.Filled.FeaturedPlayList" - EndIcon="@Icons.Filled.KeyboardArrowDown" + StartIcon="@Icons.Material.Filled.FeaturedPlayList" + EndIcon="@Icons.Material.Filled.KeyboardArrowDown" FullWidth="true" AnchorOrigin="Origin.BottomCenter" TransformOrigin="Origin.TopCenter"> diff --git a/TaikoWebUI/Pages/Cards.razor.cs b/TaikoWebUI/Pages/Cards.razor.cs index 0b7eb8f..fd5c41b 100644 --- a/TaikoWebUI/Pages/Cards.razor.cs +++ b/TaikoWebUI/Pages/Cards.razor.cs @@ -22,7 +22,7 @@ public partial class Cards var dialog = DialogService.Show("Delete Card", parameters); var result = await dialog.Result; - if (result.Cancelled) + if (result.Canceled) { return; } diff --git a/TaikoWebUI/Pages/DaniDojo.razor b/TaikoWebUI/Pages/DaniDojo.razor index 4c7d71c..d197dec 100644 --- a/TaikoWebUI/Pages/DaniDojo.razor +++ b/TaikoWebUI/Pages/DaniDojo.razor @@ -129,7 +129,7 @@ @difficulty - + @GameDataService.GetMusicStarLevel(danDataOdaiSong.SongNo, difficulty) @@ -140,9 +140,8 @@ - @if (bestDataMap.ContainsKey(danId)) + @if (bestDataMap.TryGetValue(danId, out var danBestData)) { - var danBestData = bestDataMap[danId]; if (danBestData.DanBestStageDataList.Count > index) { var bestStage = danBestData.DanBestStageDataList[index]; @@ -206,10 +205,8 @@ } Result - @if (bestDataMap.ContainsKey(danId)) + @if (bestDataMap.TryGetValue(danId, out var danBestData)) { - var danBestData = bestDataMap[danId]; - if (danBestData.SoulGaugeTotal >= redRequirement) { barClass = "bar-pass-red"; resultText = "Pass"; @@ -221,7 +218,7 @@ } - @(danBestData.SoulGaugeTotal)% + @danBestData.SoulGaugeTotal% @resultText } else { @@ -278,9 +275,8 @@ } Result - @if (bestDataMap.ContainsKey(danId)) + @if (bestDataMap.TryGetValue(danId, out var danBestData)) { - var danBestData = bestDataMap[danId]; var bestData = GetAllBestFromData((DanConditionType)border.OdaiType, danBestData); if ((DanConditionType)border.OdaiType is DanConditionType.BadCount or DanConditionType.OkCount) @@ -372,9 +368,8 @@ Result - @if (bestDataMap.ContainsKey(danId)) + @if (bestDataMap.TryGetValue(danId, out var danBestData)) { - var danBestData = bestDataMap[danId]; var bestData = GetSongBestFromData((DanConditionType)border.OdaiType, danBestData, songNumber); if ((DanConditionType)border.OdaiType is DanConditionType.BadCount or DanConditionType.OkCount) { @@ -390,7 +385,7 @@ resultText = "Gold"; } var resultValue = redRequirement - bestData; - if (resultValue < 0) resultValue = 0; + if (bestData >= redRequirement) resultValue = 0; @resultValue diff --git a/TaikoWebUI/Pages/HighScores.razor b/TaikoWebUI/Pages/HighScores.razor index aa54e55..a1e9a8f 100644 --- a/TaikoWebUI/Pages/HighScores.razor +++ b/TaikoWebUI/Pages/HighScores.razor @@ -27,12 +27,12 @@ { - @if (songBestDataMap.ContainsKey(difficulty)) + @if (songBestDataMap.TryGetValue(difficulty, out var value)) { - - +
@@ -50,16 +50,16 @@
-
- + + - + @GameDataService.GetMusicStarLevel(@context.Item.SongId, difficulty) - - + - - - + + + @(GetCrownText(context.Item.BestCrown)) - - + + @if (context.Item.BestScoreRank is not ScoreRank.None) { @(GetRankText(context.Item.BestScoreRank)) } - - - - - - - + + + + + + + - - - - - - + + + + + +
@if (context.Item.ShowAiData) diff --git a/TaikoWebUI/Pages/Profile.razor b/TaikoWebUI/Pages/Profile.razor index 9e3e22f..3420ae5 100644 --- a/TaikoWebUI/Pages/Profile.razor +++ b/TaikoWebUI/Pages/Profile.razor @@ -36,7 +36,7 @@ - + Select a Title @@ -249,7 +249,7 @@ } else { - + Save } diff --git a/TaikoWebUI/Pages/Profile.razor.cs b/TaikoWebUI/Pages/Profile.razor.cs index 3bd0ceb..082aff9 100644 --- a/TaikoWebUI/Pages/Profile.razor.cs +++ b/TaikoWebUI/Pages/Profile.razor.cs @@ -111,7 +111,7 @@ public partial class Profile }; var dialog = DialogService.Show("Player Titles", parameters, options); var result = await dialog.Result; - if (!result.Cancelled) + if (!result.Canceled) { StateHasChanged(); } diff --git a/TaikoWebUI/Shared/MainLayout.razor b/TaikoWebUI/Shared/MainLayout.razor index 1f74ac1..9694c14 100644 --- a/TaikoWebUI/Shared/MainLayout.razor +++ b/TaikoWebUI/Shared/MainLayout.razor @@ -19,7 +19,7 @@ @Body - + diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj index b39c692..d10f3ef 100644 --- a/TaikoWebUI/TaikoWebUI.csproj +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -1,18 +1,19 @@ - net6.0 + net8.0 enable enable + 11 - - - - - + + + + + diff --git a/TaikoWebUI/wwwroot/css/app.css b/TaikoWebUI/wwwroot/css/app.css new file mode 100644 index 0000000..8c8d833 --- /dev/null +++ b/TaikoWebUI/wwwroot/css/app.css @@ -0,0 +1,101 @@ +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); + +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } diff --git a/TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css b/TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css new file mode 100644 index 0000000..263a715 --- /dev/null +++ b/TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-rgb:33,37,41;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css.map b/TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css.map new file mode 100644 index 0000000..8c41293 --- /dev/null +++ b/TaikoWebUI/wwwroot/css/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}-root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`