From c98d96861f1127381f9db60a64f84e2cebca2c5a Mon Sep 17 00:00:00 2001 From: berichan <66521620+berichan@users.noreply.github.com> Date: Thu, 11 Mar 2021 23:47:53 +0000 Subject: [PATCH] Allow parsing of item with single parenthesised variant --- NHSE.Core/Editing/ItemRequest/ItemParser.cs | 13 +++++++++++-- NHSE.Core/Strings/GameStrings.cs | 18 ++++++++++++++++++ NHSE.Tests/ItemParsingTests.cs | 13 +++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/NHSE.Core/Editing/ItemRequest/ItemParser.cs b/NHSE.Core/Editing/ItemRequest/ItemParser.cs index 612fde1..8e5ff08 100644 --- a/NHSE.Core/Editing/ItemRequest/ItemParser.cs +++ b/NHSE.Core/Editing/ItemRequest/ItemParser.cs @@ -257,8 +257,17 @@ private static Item FinalizeItem(int requestIndex, IConfigItem config, ItemDesti /// Returns if no match found. public static Item GetItem(string itemName, string lang = "en") { - var strings = GameInfo.GetStrings(lang).ItemDataSource; - return GetItem(itemName, strings); + var gStrings = GameInfo.GetStrings(lang); + var strings = gStrings.ItemDataSource; + var parsedItem = GetItem(itemName, strings); + if (parsedItem != Item.NO_ITEM) + return parsedItem; + + if (gStrings.HasAssociatedItems(itemName, out var items)) + if (items != null && items.Count == 1) + return new Item((ushort)items[0].Value); + + return Item.NO_ITEM; } /// diff --git a/NHSE.Core/Strings/GameStrings.cs b/NHSE.Core/Strings/GameStrings.cs index 6d0f8b3..1bbd4a0 100644 --- a/NHSE.Core/Strings/GameStrings.cs +++ b/NHSE.Core/Strings/GameStrings.cs @@ -226,6 +226,24 @@ public List GetAssociatedItems(ushort id, out string baseItemName) else return new List(); } + + + public bool HasAssociatedItems(string baseName, out List? items) + { + if (string.IsNullOrWhiteSpace(baseName)) + { + items = null; + return false; + } + + baseName = baseName.Trim().ToLower(); + if (!baseName.EndsWith(" ")) + baseName += " "; + baseName += "("; + + items = ItemDataSource.FindAll(x => x.Text.ToLower().StartsWith(baseName)); + return items.Count > 0; + } } public interface IRemakeString diff --git a/NHSE.Tests/ItemParsingTests.cs b/NHSE.Tests/ItemParsingTests.cs index b518304..36c03cf 100644 --- a/NHSE.Tests/ItemParsingTests.cs +++ b/NHSE.Tests/ItemParsingTests.cs @@ -11,6 +11,7 @@ public static class ItemParsingTests [InlineData("diner sofa", 0x102D)] [InlineData("? block", 0x35FD)] [InlineData("block", 0x35FE)] + [InlineData("dal apron", 0x2F5E)] public static void ParseItem(string name, ushort id) { // single @@ -33,6 +34,18 @@ public static void ParseItem(string name, ushort id) } } + [Theory] + [InlineData("royal Crown", 0x14BB)] + [InlineData("royal crown (red)", 0x14BB)] + [InlineData("bug aloha shirt ", 0x223C)] + [InlineData("quaint painting", 0xA)] + [InlineData("(none)", Item.NONE)] + public static void ParseAssociatedItem(string nameNoParenthesis, ushort id) + { + var parse = ItemParser.GetItem(nameNoParenthesis); + parse.ItemId.Should().Be(id); + } + private class ConfigWrapFake : IConfigItem { public bool WrapAllItems { get; } = true;