diff --git a/TaikoLocalServer/.gitignore b/TaikoLocalServer/.gitignore index 50cb58a..2c6ddca 100644 --- a/TaikoLocalServer/.gitignore +++ b/TaikoLocalServer/.gitignore @@ -1,4 +1,3 @@ -wwwroot/data/music_attribute.json -wwwroot/data/music_order.json +wwwroot/data/music_order.json wwwroot/data/musicinfo.json wwwroot/data/wordlist.json \ No newline at end of file diff --git a/TaikoLocalServer/Common/Constants.cs b/TaikoLocalServer/Common/Constants.cs index 0588daf..1291d57 100644 --- a/TaikoLocalServer/Common/Constants.cs +++ b/TaikoLocalServer/Common/Constants.cs @@ -11,36 +11,9 @@ public static class Constants public const string DEFAULT_DB_NAME = "taiko.db3"; public const string MUSIC_INFO_BASE_NAME = "musicinfo"; - public const string MUSIC_ATTRIBUTE_BASE_NAME = "music_attribute"; - public const string MUSIC_ATTRIBUTE_COMPRESSED_FILE_NAME = "music_attribute.bin"; - - public const string WORDLIST_BASE_NAME = "wordlist"; public const string MUSIC_ORDER_BASE_NAME = "music_order"; - - - 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 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 = 941; - - 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 = 142; - 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 - }; + public const string DON_COS_REWARD_BASE_NAME = "don_cos_reward"; + public const string SHOUGOU_BASE_NAME = "shougou"; + public const string NEIRO_BASE_NAME = "neiro"; } \ No newline at end of file diff --git a/TaikoLocalServer/Common/Utils/FlagCalculator.cs b/TaikoLocalServer/Common/Utils/FlagCalculator.cs index 40bf14d..78e4a55 100644 --- a/TaikoLocalServer/Common/Utils/FlagCalculator.cs +++ b/TaikoLocalServer/Common/Utils/FlagCalculator.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Collections.Immutable; using System.Collections.Specialized; using System.Runtime.InteropServices; using GameDatabase.Entities; @@ -70,7 +71,7 @@ public static class FlagCalculator return (ushort)(previous | result); } - public static byte[] ComputeGotDanFlags(List danScoreData) + public static byte[] ComputeGotDanFlags(List danScoreData, List danIdList) { var gotDanFlagList = new List(); var gotDanFlag = new BitVector32(); @@ -84,10 +85,9 @@ public static class FlagCalculator 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++) + + foreach (var danId in danIdList) { - var danId = i; var flag = 0; if (danScoreData.Any(datum => datum.DanId == danId)) { diff --git a/TaikoLocalServer/Controllers/Game/BaidController.cs b/TaikoLocalServer/Controllers/Game/BaidController.cs index fa02809..b1678aa 100644 --- a/TaikoLocalServer/Controllers/Game/BaidController.cs +++ b/TaikoLocalServer/Controllers/Game/BaidController.cs @@ -17,15 +17,19 @@ public class BaidController : BaseController private readonly IDanScoreDatumService danScoreDatumService; private readonly IAiDatumService aiDatumService; + + private readonly IGameDataService gameDataService; public BaidController(IUserDatumService userDatumService, ICardService cardService, - ISongBestDatumService songBestDatumService, IDanScoreDatumService danScoreDatumService, IAiDatumService aiDatumService) + ISongBestDatumService songBestDatumService, IDanScoreDatumService danScoreDatumService, IAiDatumService aiDatumService, + IGameDataService gameDataService) { this.userDatumService = userDatumService; this.cardService = cardService; this.songBestDatumService = songBestDatumService; this.danScoreDatumService = danScoreDatumService; this.aiDatumService = aiDatumService; + this.gameDataService = gameDataService; } @@ -78,7 +82,7 @@ public class BaidController : BaseController var costumeArrays = JsonHelper.GetCostumeUnlockDataFromUserData(userData, Logger); - var costumeFlagArrays = Constants.CostumeFlagArraySizes + var costumeFlagArrays = gameDataService.GetCostumeFlagArraySizes() .Select((size, index) => FlagCalculator.GetBitArrayFromIds(costumeArrays[index], size, Logger)) .ToList(); @@ -88,7 +92,10 @@ public class BaidController : BaseController .Select(datum => datum.DanId) .DefaultIfEmpty() .Max(); - var gotDanFlagArray = FlagCalculator.ComputeGotDanFlags(danData); + + var danDataDictionary = gameDataService.GetDanDataDictionary(); + var danIdList = danDataDictionary.Keys.ToList(); + var gotDanFlagArray = FlagCalculator.ComputeGotDanFlags(danData, danIdList); var genericInfoFlg = Array.Empty(); try diff --git a/TaikoLocalServer/Controllers/Game/SelfBestController.cs b/TaikoLocalServer/Controllers/Game/SelfBestController.cs index 16cfbeb..ec0ff2c 100644 --- a/TaikoLocalServer/Controllers/Game/SelfBestController.cs +++ b/TaikoLocalServer/Controllers/Game/SelfBestController.cs @@ -39,7 +39,7 @@ public class SelfBestController : BaseController .ToList(); foreach (var songNo in request.ArySongNoes) { - if (!gameDataService.GetMusicAttributes().ContainsKey(songNo)) + if (!gameDataService.GetMusicList().Contains(songNo)) { Logger.LogWarning("Music no {No} is missing!", songNo); continue; diff --git a/TaikoLocalServer/Controllers/Game/UserDataController.cs b/TaikoLocalServer/Controllers/Game/UserDataController.cs index 0b24b4e..45def90 100644 --- a/TaikoLocalServer/Controllers/Game/UserDataController.cs +++ b/TaikoLocalServer/Controllers/Game/UserDataController.cs @@ -77,7 +77,7 @@ public class UserDataController : BaseController // 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 toneArray = FlagCalculator.GetBitArrayFromIds(toneFlg, gameDataService.GetToneFlagArraySize(), Logger); var titleFlg = Array.Empty(); try @@ -93,7 +93,7 @@ public class UserDataController : BaseController // 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 titleArray = FlagCalculator.GetBitArrayFromIds(titleFlg, gameDataService.GetTitleFlagArraySize(), Logger); var recentSongs = (await songPlayDatumService.GetSongPlayDatumByBaid(request.Baid)) .AsEnumerable() diff --git a/TaikoLocalServer/Models/DonCosRewardEntry.cs b/TaikoLocalServer/Models/DonCosRewardEntry.cs new file mode 100644 index 0000000..b73b312 --- /dev/null +++ b/TaikoLocalServer/Models/DonCosRewardEntry.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class DonCosRewardEntry +{ + [JsonPropertyName("cosType")] + public string cosType { get; set; } = null!; + + [JsonPropertyName("uniqueId")] + public uint uniqueId { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/DonCosRewards.cs b/TaikoLocalServer/Models/DonCosRewards.cs new file mode 100644 index 0000000..3a91bc8 --- /dev/null +++ b/TaikoLocalServer/Models/DonCosRewards.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class DonCosRewards +{ + [JsonPropertyName("items")] + public List DonCosRewardEntries { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/MusicAttributeEntry.cs b/TaikoLocalServer/Models/MusicAttributeEntry.cs deleted file mode 100644 index d6fb212..0000000 --- a/TaikoLocalServer/Models/MusicAttributeEntry.cs +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index db526d6..0000000 --- a/TaikoLocalServer/Models/MusicAttributes.cs +++ /dev/null @@ -1,9 +0,0 @@ -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/NeiroEntry.cs b/TaikoLocalServer/Models/NeiroEntry.cs new file mode 100644 index 0000000..fc82ec9 --- /dev/null +++ b/TaikoLocalServer/Models/NeiroEntry.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class NeiroEntry +{ + [JsonPropertyName("uniqueId")] + public uint uniqueId { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/Neiros.cs b/TaikoLocalServer/Models/Neiros.cs new file mode 100644 index 0000000..88e0915 --- /dev/null +++ b/TaikoLocalServer/Models/Neiros.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class Neiros +{ + [JsonPropertyName("items")] + public List NeiroEntries { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/ShougouEntry.cs b/TaikoLocalServer/Models/ShougouEntry.cs new file mode 100644 index 0000000..1c759db --- /dev/null +++ b/TaikoLocalServer/Models/ShougouEntry.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class ShougouEntry +{ + [JsonPropertyName("uniqueId")] + public uint uniqueId { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/Shougous.cs b/TaikoLocalServer/Models/Shougous.cs new file mode 100644 index 0000000..1be52be --- /dev/null +++ b/TaikoLocalServer/Models/Shougous.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class Shougous +{ + [JsonPropertyName("items")] + public List ShougouEntries { get; set; } = new(); +} \ No newline at end of file diff --git a/TaikoLocalServer/Services/GameDataService.cs b/TaikoLocalServer/Services/GameDataService.cs index 0c93a54..580116d 100644 --- a/TaikoLocalServer/Services/GameDataService.cs +++ b/TaikoLocalServer/Services/GameDataService.cs @@ -29,9 +29,6 @@ public class GameDataService : IGameDataService private ImmutableDictionary movieDataDictionary = ImmutableDictionary.Empty; - private ImmutableDictionary musicAttributes = - ImmutableDictionary.Empty; - private ImmutableDictionary folderDictionary = ImmutableDictionary.Empty; @@ -44,6 +41,12 @@ public class GameDataService : IGameDataService private List musicsWithUra = new(); private List lockedSongsList = new(); + + private List costumeFlagArraySizes = new(); + + private int titleFlagArraySize; + + private int toneFlagArraySize; private Dictionary tokenDataDictionary = new(); @@ -69,11 +72,6 @@ public class GameDataService : IGameDataService return musicInfoes; } - public ImmutableDictionary GetMusicAttributes() - { - return musicAttributes; - } - public ImmutableDictionary GetDanDataDictionary() { return danDataDictionary; @@ -113,6 +111,21 @@ public class GameDataService : IGameDataService { return lockedSongsList; } + + public List GetCostumeFlagArraySizes() + { + return costumeFlagArraySizes; + } + + public int GetTitleFlagArraySize() + { + return titleFlagArraySize; + } + + public int GetToneFlagArraySize() + { + return toneFlagArraySize; + } public ImmutableDictionary GetQRCodeDataDictionary() { @@ -124,10 +137,7 @@ public class GameDataService : IGameDataService var dataPath = PathHelper.GetDataPath(); var musicInfoPath = Path.Combine(dataPath, $"{Constants.MUSIC_INFO_BASE_NAME}.json"); - var enctyptedInfo = Path.Combine(dataPath, $"{Constants.MUSIC_INFO_BASE_NAME}.bin"); - - var musicAttributePath = Path.Combine(dataPath, $"{Constants.MUSIC_ATTRIBUTE_BASE_NAME}.json"); - var encryptedAttribute = Path.Combine(dataPath, $"{Constants.MUSIC_ATTRIBUTE_BASE_NAME}.bin"); + var encryptedInfo = Path.Combine(dataPath, $"{Constants.MUSIC_INFO_BASE_NAME}.bin"); var wordlistPath = Path.Combine(dataPath, $"{Constants.WORDLIST_BASE_NAME}.json"); var encryptedWordlist = Path.Combine(dataPath, $"{Constants.WORDLIST_BASE_NAME}.bin"); @@ -135,6 +145,15 @@ public class GameDataService : IGameDataService var musicOrderPath = Path.Combine(dataPath, $"{Constants.MUSIC_ORDER_BASE_NAME}.json"); var encryptedMusicOrder = Path.Combine(dataPath, $"{Constants.MUSIC_ORDER_BASE_NAME}.bin"); + var donCosRewardPath = Path.Combine(dataPath, $"{Constants.DON_COS_REWARD_BASE_NAME}.json"); + var encryptedDonCosReward = Path.Combine(dataPath, $"{Constants.DON_COS_REWARD_BASE_NAME}.bin"); + + var shougouPath = Path.Combine(dataPath, $"{Constants.SHOUGOU_BASE_NAME}.json"); + var encryptedShougou = Path.Combine(dataPath, $"{Constants.SHOUGOU_BASE_NAME}.bin"); + + var neiroPath = Path.Combine(dataPath, $"{Constants.NEIRO_BASE_NAME}.json"); + var encryptedNeiro = Path.Combine(dataPath, $"{Constants.NEIRO_BASE_NAME}.bin"); + var danDataPath = Path.Combine(dataPath, settings.DanDataFileName); var gaidenDataPath = Path.Combine(dataPath, settings.GaidenDataFileName); var songIntroDataPath = Path.Combine(dataPath, settings.IntroDataFileName); @@ -145,13 +164,9 @@ public class GameDataService : IGameDataService var lockedSongsDataPath = Path.Combine(dataPath, settings.LockedSongsDataFileName); var qrCodeDataPath = Path.Combine(dataPath, settings.QRCodeDataFileName); - if (File.Exists(enctyptedInfo)) + if (File.Exists(encryptedInfo)) { - DecryptDataTable(enctyptedInfo, musicInfoPath); - } - if (File.Exists(encryptedAttribute)) - { - DecryptDataTable(encryptedAttribute, musicAttributePath); + DecryptDataTable(encryptedInfo, musicInfoPath); } if (File.Exists(encryptedWordlist)) { @@ -161,7 +176,23 @@ public class GameDataService : IGameDataService { DecryptDataTable(encryptedMusicOrder, musicOrderPath); } - + if (File.Exists(encryptedDonCosReward)) + { + DecryptDataTable(encryptedDonCosReward, donCosRewardPath); + } + if (File.Exists(encryptedShougou)) + { + DecryptDataTable(encryptedShougou, shougouPath); + } + if (File.Exists(encryptedNeiro)) + { + DecryptDataTable(encryptedNeiro, neiroPath); + } + + if (!File.Exists(musicInfoPath)) + { + throw new FileNotFoundException("Music info file not found!"); + } if (!File.Exists(wordlistPath)) { throw new FileNotFoundException("Wordlist file not found!"); @@ -170,9 +201,20 @@ public class GameDataService : IGameDataService { throw new FileNotFoundException("Music order file not found!"); } + if (!File.Exists(donCosRewardPath)) + { + throw new FileNotFoundException("Don cos reward file not found!"); + } + if (!File.Exists(shougouPath)) + { + throw new FileNotFoundException("Shougou file not found!"); + } + if (!File.Exists(neiroPath)) + { + throw new FileNotFoundException("Neiro file not found!"); + } 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); @@ -181,10 +223,12 @@ 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 donCosRewardFile = File.OpenRead(donCosRewardPath); + await using var shougouFile = File.OpenRead(shougouPath); + await using var neiroFile = File.OpenRead(neiroPath); await using var qrCodeDataFile = File.OpenRead(qrCodeDataPath); 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); @@ -193,12 +237,13 @@ public class GameDataService : IGameDataService var shopFolderData = await JsonSerializer.DeserializeAsync>(shopFolderDataFile); var tokenData = await JsonSerializer.DeserializeAsync>(tokenDataFile); var lockedSongsData = await JsonSerializer.DeserializeAsync>(lockedSongsDataFile); + var donCosRewardData = await JsonSerializer.DeserializeAsync(donCosRewardFile); + var shougouData = await JsonSerializer.DeserializeAsync(shougouFile); + var neiroData = await JsonSerializer.DeserializeAsync(neiroFile); var qrCodeData = await JsonSerializer.DeserializeAsync>(qrCodeDataFile); InitializeMusicInfoes(infoesData); - InitializeMusicAttributes(attributesData); - InitializeDanData(danData); InitializeGaidenData(gaidenData); @@ -214,8 +259,14 @@ public class GameDataService : IGameDataService InitializeTokenData(tokenData); InitializeLockedSongsData(lockedSongsData); + + InitializeCostumeFlagArraySizes(donCosRewardData); + + InitializeTitleFlagArraySize(shougouData); + + InitializeToneFlagArraySize(neiroData); - InitializeQRCodeData(qrCodeData); + InitializeQrCodeData(qrCodeData); } private static void DecryptDataTable(string inputFileName, string outputFileName) @@ -275,23 +326,16 @@ public class GameDataService : IGameDataService musicInfoes = infoesData.MusicInfoEntries.ToImmutableDictionary(info => info.MusicId); + musics = musicInfoes.Select(pair => pair.Key) + .ToList(); + musics.Sort(); + 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 void InitializeShopFolderData(List? shopFolderData) { shopFolderData.ThrowIfNull("Shouldn't happen!"); @@ -312,8 +356,49 @@ public class GameDataService : IGameDataService lockedSongsData.ThrowIfNull("Shouldn't happen!"); lockedSongsList = lockedSongsData["songNo"].ToList(); } - - private void InitializeQRCodeData(List? qrCodeData) + + private void InitializeCostumeFlagArraySizes(DonCosRewards? donCosRewardData) + { + donCosRewardData.ThrowIfNull("Shouldn't happen!"); + var kigurumiUniqueIdList = donCosRewardData.DonCosRewardEntries + .Where(entry => entry.cosType == "kigurumi") + .Select(entry => entry.uniqueId); + var headUniqueIdList = donCosRewardData.DonCosRewardEntries + .Where(entry => entry.cosType == "head") + .Select(entry => entry.uniqueId); + var bodyUniqueIdList = donCosRewardData.DonCosRewardEntries + .Where(entry => entry.cosType == "body") + .Select(entry => entry.uniqueId); + var faceUniqueIdList = donCosRewardData.DonCosRewardEntries + .Where(entry => entry.cosType == "face") + .Select(entry => entry.uniqueId); + var puchiUniqueIdList = donCosRewardData.DonCosRewardEntries + .Where(entry => entry.cosType == "puchi") + .Select(entry => entry.uniqueId); + + costumeFlagArraySizes = new List + { + (int)kigurumiUniqueIdList.Max(), + (int)headUniqueIdList.Max(), + (int)bodyUniqueIdList.Max(), + (int)faceUniqueIdList.Max(), + (int)puchiUniqueIdList.Max() + }; + } + + private void InitializeTitleFlagArraySize(Shougous? shougouData) + { + shougouData.ThrowIfNull("Shouldn't happen!"); + titleFlagArraySize = (int)shougouData.ShougouEntries.Max(entry => entry.uniqueId); + } + + private void InitializeToneFlagArraySize(Neiros? neiroData) + { + neiroData.ThrowIfNull("Shouldn't happen!"); + toneFlagArraySize = (int)neiroData.NeiroEntries.Max(entry => entry.uniqueId); + } + + private void InitializeQrCodeData(List? qrCodeData) { qrCodeData.ThrowIfNull("Shouldn't happen!"); qrCodeDataDictionary = qrCodeData.ToImmutableDictionary(data => data.Serial, data => data.Id); diff --git a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs index 6bed601..43ccd78 100644 --- a/TaikoLocalServer/Services/Interfaces/IGameDataService.cs +++ b/TaikoLocalServer/Services/Interfaces/IGameDataService.cs @@ -13,8 +13,6 @@ public interface IGameDataService public ImmutableDictionary GetMusicInfoes(); - public ImmutableDictionary GetMusicAttributes(); - public ImmutableDictionary GetDanDataDictionary(); public ImmutableDictionary GetGaidenDataDictionary(); @@ -30,6 +28,12 @@ public interface IGameDataService public Dictionary GetTokenDataDictionary(); public List GetLockedSongsList(); + + public List GetCostumeFlagArraySizes(); + + public int GetTitleFlagArraySize(); + + public int GetToneFlagArraySize(); public ImmutableDictionary GetQRCodeDataDictionary(); } diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index 301d211..3103980 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -96,7 +96,22 @@ PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + PreserveNewest @@ -111,12 +126,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - diff --git a/TaikoWebUI/TaikoWebUI.csproj b/TaikoWebUI/TaikoWebUI.csproj index bb5ad8e..f2d3f4d 100644 --- a/TaikoWebUI/TaikoWebUI.csproj +++ b/TaikoWebUI/TaikoWebUI.csproj @@ -31,9 +31,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest