From b73f81214e20e8d9cddccbb7a61539ccbe2bf608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 29 Jan 2022 23:26:02 +0100 Subject: [PATCH] fix(data): fix parsing file names and --- Data/NosSmooth.Data.NOSFiles/InfoService.cs | 24 +++++------ .../LanguageService.cs | 41 +++++++++++++++---- .../NostaleDataParser.cs | 4 +- .../Options/NostaleDataOptions.cs | 2 +- .../Parsers/Dat/DatReader.cs | 20 ++++++--- .../Parsers/LangParser.cs | 10 ++--- .../Parsers/MapParser.cs | 6 +-- .../Parsers/MonsterParser.cs | 2 +- 8 files changed, 70 insertions(+), 39 deletions(-) diff --git a/Data/NosSmooth.Data.NOSFiles/InfoService.cs b/Data/NosSmooth.Data.NOSFiles/InfoService.cs index e0c9ef9..3af1f7f 100644 --- a/Data/NosSmooth.Data.NOSFiles/InfoService.cs +++ b/Data/NosSmooth.Data.NOSFiles/InfoService.cs @@ -27,46 +27,46 @@ internal class InfoService : IInfoService } /// - public Result GetItemInfo(int vnum) + public Task> GetItemInfoAsync(int vnum, CancellationToken ct = default) { if (!_nostaleData.Items.ContainsKey(vnum)) { - return new NotFoundError($"Couldn't find item {vnum}"); + return Task.FromResult(Result.FromError(new NotFoundError($"Couldn't find item {vnum}"))); } - return Result.FromSuccess(_nostaleData.Items[vnum]); + return Task.FromResult(Result.FromSuccess(_nostaleData.Items[vnum])); } /// - public Result GetMapInfo(int id) + public Task> GetMapInfoAsync(int id, CancellationToken ct = default) { if (!_nostaleData.Maps.ContainsKey(id)) { - return new NotFoundError($"Couldn't find item {id}"); + return Task.FromResult(Result.FromError(new NotFoundError($"Couldn't find map {id}"))); } - return Result.FromSuccess(_nostaleData.Maps[id]); + return Task.FromResult(Result.FromSuccess(_nostaleData.Maps[id])); } /// - public Result GetMonsterInfo(int vnum) + public Task> GetMonsterInfoAsync(int vnum, CancellationToken ct = default) { if (!_nostaleData.Monsters.ContainsKey(vnum)) { - return new NotFoundError($"Couldn't find item {vnum}"); + return Task.FromResult(Result.FromError(new NotFoundError($"Couldn't find monster {vnum}"))); } - return Result.FromSuccess(_nostaleData.Monsters[vnum]); + return Task.FromResult(Result.FromSuccess(_nostaleData.Monsters[vnum])); } /// - public Result GetSkillInfo(int vnum) + public Task> GetSkillInfoAsync(int vnum, CancellationToken ct = default) { if (!_nostaleData.Skills.ContainsKey(vnum)) { - return new NotFoundError($"Couldn't find item {vnum}"); + return Task.FromResult(Result.FromError(new NotFoundError($"Couldn't find skill {vnum}"))); } - return Result.FromSuccess(_nostaleData.Skills[vnum]); + return Task.FromResult(Result.FromSuccess(_nostaleData.Skills[vnum])); } } \ No newline at end of file diff --git a/Data/NosSmooth.Data.NOSFiles/LanguageService.cs b/Data/NosSmooth.Data.NOSFiles/LanguageService.cs index 87da23b..15186fe 100644 --- a/Data/NosSmooth.Data.NOSFiles/LanguageService.cs +++ b/Data/NosSmooth.Data.NOSFiles/LanguageService.cs @@ -13,7 +13,10 @@ namespace NosSmooth.Data.NOSFiles; /// internal class LanguageService : ILanguageService { - private readonly IReadOnlyDictionary>> _translations; + private readonly + IReadOnlyDictionary>> + _translations; + private readonly LanguageServiceOptions _options; /// @@ -21,7 +24,12 @@ internal class LanguageService : ILanguageService /// /// The translations. /// The options. - public LanguageService(IReadOnlyDictionary>> translations, LanguageServiceOptions options) + public LanguageService + ( + IReadOnlyDictionary>> + translations, + LanguageServiceOptions options + ) { CurrentLanguage = options.Language; _translations = translations; @@ -32,32 +40,47 @@ internal class LanguageService : ILanguageService public Language CurrentLanguage { get; set; } /// - public Result GetTranslation(TranslationRoot root, string key, Language? language = default) + public Task> GetTranslationAsync + ( + TranslationRoot root, + string key, + Language? language = default, + CancellationToken ct = default + ) { if (!_translations.ContainsKey(language ?? CurrentLanguage)) { - return new NotFoundError($"The requested language {language ?? CurrentLanguage} is not parsed."); + return Task.FromResult + ( + Result.FromError + (new NotFoundError($"The requested language {language ?? CurrentLanguage} is not parsed.")) + ); } var translations = _translations[language ?? CurrentLanguage]; if (!translations.ContainsKey(root)) { - return key; + return Task.FromResult(Result.FromSuccess(key)); } var keyTranslations = translations[root]; if (!keyTranslations.ContainsKey(key)) { - return key; + return Task.FromResult(Result.FromSuccess(key)); } - return keyTranslations[key]; + return Task.FromResult(Result.FromSuccess(keyTranslations[key])); } /// - public Result GetTranslation(TranslatableString translatableString, Language? language = default) + public async Task> GetTranslationAsync + ( + TranslatableString translatableString, + Language? language = default, + CancellationToken ct = default + ) { - var translation = GetTranslation(translatableString.Root, translatableString.Key, language); + var translation = await GetTranslationAsync(translatableString.Root, translatableString.Key, language, ct); if (!translation.IsSuccess) { return translation; diff --git a/Data/NosSmooth.Data.NOSFiles/NostaleDataParser.cs b/Data/NosSmooth.Data.NOSFiles/NostaleDataParser.cs index b299ba9..98c3379 100644 --- a/Data/NosSmooth.Data.NOSFiles/NostaleDataParser.cs +++ b/Data/NosSmooth.Data.NOSFiles/NostaleDataParser.cs @@ -68,9 +68,9 @@ public class NostaleDataParser } var languageFiles = new Dictionary(); - foreach (var language in languages.Concat(_options.SupportedLanguages)) + foreach (var language in languages.Concat(_options.SupportedLanguages).Distinct()) { - var langString = language.ToString().ToLower(); + var langString = language.ToString().ToUpper(); var langPath = languageFilesPath.Replace("%lang%", langString); var languageFile = _fileReader.ReadFileSystemFile(langPath); diff --git a/Data/NosSmooth.Data.NOSFiles/Options/NostaleDataOptions.cs b/Data/NosSmooth.Data.NOSFiles/Options/NostaleDataOptions.cs index c56e2bb..e3286af 100644 --- a/Data/NosSmooth.Data.NOSFiles/Options/NostaleDataOptions.cs +++ b/Data/NosSmooth.Data.NOSFiles/Options/NostaleDataOptions.cs @@ -16,7 +16,7 @@ public class NostaleDataOptions /// /// Gets or sets the supported languages that will be loaded into the memory.. /// - public Language[] SupportedLanguages { get; set; } = new Language[] { Language.En }; + public Language[] SupportedLanguages { get; set; } = new Language[] { Language.Uk }; /// /// Gets or sets the path to .nos files. diff --git a/Data/NosSmooth.Data.NOSFiles/Parsers/Dat/DatReader.cs b/Data/NosSmooth.Data.NOSFiles/Parsers/Dat/DatReader.cs index 80a3d6d..48508c2 100644 --- a/Data/NosSmooth.Data.NOSFiles/Parsers/Dat/DatReader.cs +++ b/Data/NosSmooth.Data.NOSFiles/Parsers/Dat/DatReader.cs @@ -27,7 +27,7 @@ public class DatReader /// The file to read. public DatReader(RawFile file) { - _lines = Encoding.ASCII.GetString(file.Content).Split('\n').ToArray(); + _lines = Encoding.ASCII.GetString(file.Content).Split('\r', '\n').ToArray(); _currentLine = 0; _file = file; _separator = "VNUM"; @@ -36,7 +36,7 @@ public class DatReader /// /// Gets whether the reader has reached the end. /// - public bool ReachedEnd => _currentLine + 1 >= _lines.Count; + public bool ReachedEnd => _currentLine >= _lines.Count; /// /// Sets the separator of a new item. @@ -53,6 +53,11 @@ public class DatReader /// The read item. /// Whether an item was read. public bool ReadItem([NotNullWhen(true)] out DatItem? item) + { + return ReadItem(out item, _currentLine > 0); + } + + private bool ReadItem([NotNullWhen(true)] out DatItem? item, bool readFirstItem) { if (ReachedEnd) { @@ -60,24 +65,27 @@ public class DatReader return false; } - bool readFirstItem = _currentLine > 0; int startLine = _currentLine; + if (readFirstItem && _lines[_currentLine].Trim().StartsWith(_separator)) + { + _currentLine++; + } - while (!ReachedEnd && !_lines[_currentLine].StartsWith(_separator)) + while (!ReachedEnd && !_lines[_currentLine].Trim().StartsWith(_separator)) { _currentLine++; } if (!readFirstItem) { - return ReadItem(out item); + return ReadItem(out item, true); } var dictionary = new Dictionary>(); for (int i = startLine; i < _currentLine; i++) { var line = _lines[i]; - var splitted = line.Split('\t'); + var splitted = line.Trim().Split('\t'); var key = splitted[0]; var entry = new DatEntry(key, splitted); if (!dictionary.ContainsKey(key)) diff --git a/Data/NosSmooth.Data.NOSFiles/Parsers/LangParser.cs b/Data/NosSmooth.Data.NOSFiles/Parsers/LangParser.cs index ab6d951..bff08f2 100644 --- a/Data/NosSmooth.Data.NOSFiles/Parsers/LangParser.cs +++ b/Data/NosSmooth.Data.NOSFiles/Parsers/LangParser.cs @@ -34,7 +34,7 @@ public class LangParser var encoding = LanguageEncoding.GetEncoding(language); var dictionary = new Dictionary>(); - var itemParsedResult = ParseFile(archive, encoding, $"code_{language.ToString().ToLower()}_Item.txt"); + var itemParsedResult = ParseFile(archive, encoding, $"_code_{language.ToString().ToLower()}_Item.txt"); if (!itemParsedResult.IsSuccess) { return Result>>.FromError @@ -42,7 +42,7 @@ public class LangParser } dictionary.Add(TranslationRoot.Item, itemParsedResult.Entity); - var monsterParsedResult = ParseFile(archive, encoding, $"code_{language.ToString().ToLower()}_monster.txt"); + var monsterParsedResult = ParseFile(archive, encoding, $"_code_{language.ToString().ToLower()}_monster.txt"); if (!monsterParsedResult.IsSuccess) { return Result>>.FromError @@ -50,7 +50,7 @@ public class LangParser } dictionary.Add(TranslationRoot.Monster, itemParsedResult.Entity); - var skillParsedResult = ParseFile(archive, encoding, $"code_{language.ToString().ToLower()}_Skill.txt"); + var skillParsedResult = ParseFile(archive, encoding, $"_code_{language.ToString().ToLower()}_Skill.txt"); if (!skillParsedResult.IsSuccess) { return Result>>.FromError @@ -58,7 +58,7 @@ public class LangParser } dictionary.Add(TranslationRoot.Skill, itemParsedResult.Entity); - var mapParsedResult = ParseFile(archive, encoding, $"code_{language.ToString().ToLower()}_MapIDData.txt"); + var mapParsedResult = ParseFile(archive, encoding, $"_code_{language.ToString().ToLower()}_MapIDData.txt"); if (!mapParsedResult.IsSuccess) { return Result>>.FromError @@ -79,7 +79,7 @@ public class LangParser var fileContent = encoding.GetString(fileResult.Entity.Content); var dictionary = new Dictionary(); - var lines = fileContent.Split('\n'); + var lines = fileContent.Split('\r', '\n'); foreach (var line in lines) { var splitted = line.Split('\t'); diff --git a/Data/NosSmooth.Data.NOSFiles/Parsers/MapParser.cs b/Data/NosSmooth.Data.NOSFiles/Parsers/MapParser.cs index 6cc6edf..bcbb5c9 100644 --- a/Data/NosSmooth.Data.NOSFiles/Parsers/MapParser.cs +++ b/Data/NosSmooth.Data.NOSFiles/Parsers/MapParser.cs @@ -24,12 +24,12 @@ public class MapParser : IInfoParser return Result>.FromError(mapDatResult); } var mapGridsArchive = files.MapGridsFiles; - var mapDatContent = Encoding.ASCII.GetString(mapDatResult.Entity.Content).Split('\n'); + var mapDatContent = Encoding.ASCII.GetString(mapDatResult.Entity.Content).Split('\r', '\n'); var mapNames = new Dictionary(); foreach (var line in mapDatContent) { - var splitted = line.Split('\t'); + var splitted = line.Split(' ', '\t'); if (splitted.Length != 5) { continue; @@ -56,7 +56,7 @@ public class MapParser : IInfoParser result[id] = new MapInfo ( id, - mapNames[id], + mapNames.GetValueOrDefault(id, new TranslatableString(TranslationRoot.Map, "Map")), BitConverter.ToInt16(grid.Take(2).ToArray()), BitConverter.ToInt16(grid.Skip(2).Take(2).ToArray()), grid.Skip(4).ToArray() diff --git a/Data/NosSmooth.Data.NOSFiles/Parsers/MonsterParser.cs b/Data/NosSmooth.Data.NOSFiles/Parsers/MonsterParser.cs index 15e7f67..b852c95 100644 --- a/Data/NosSmooth.Data.NOSFiles/Parsers/MonsterParser.cs +++ b/Data/NosSmooth.Data.NOSFiles/Parsers/MonsterParser.cs @@ -18,7 +18,7 @@ public class MonsterParser : IInfoParser /// public Result> Parse(NostaleFiles files) { - var monsterDatResult = files.DatFiles.FindFile("Monster.dat"); + var monsterDatResult = files.DatFiles.FindFile("monster.dat"); if (!monsterDatResult.IsSuccess) { return Result>.FromError(monsterDatResult); -- 2.48.1