diff --git a/Filtration.ObjectModel/BlockItemTypes/ProphecyBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/ProphecyBlockItem.cs new file mode 100644 index 0000000..393d45e --- /dev/null +++ b/Filtration.ObjectModel/BlockItemTypes/ProphecyBlockItem.cs @@ -0,0 +1,39 @@ +using System.Linq; +using System.Windows.Media; +using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.Enums; + +namespace Filtration.ObjectModel.BlockItemTypes +{ + public class ProphecyBlockItem : StringListBlockItem + { + public override string PrefixText => "Prophecy"; + public override int MaximumAllowed => 1; + public override string DisplayHeading => "Prophecy"; + + public override string SummaryText + { + get + { + if (Items.Count > 0 && Items.Count < 4) + { + return "Prophecies: " + + Items.Aggregate(string.Empty, (current, i) => current + i + ", ").TrimEnd(' ').TrimEnd(','); + } + if (Items.Count >= 4) + { + var remaining = Items.Count - 3; + return "Prophecies: " + Items.Take(3) + .Aggregate(string.Empty, (current, i) => current + i + ", ") + .TrimEnd(' ') + .TrimEnd(',') + " (+" + remaining + " more)"; + } + return "Prophecies: (none)"; + } + } + + public override Color SummaryBackgroundColor => Colors.DarkMagenta; + public override Color SummaryTextColor => Colors.White; + public override BlockItemOrdering SortOrder => BlockItemOrdering.Prophecy; + } +} diff --git a/Filtration.ObjectModel/Enums/BlockItemOrdering.cs b/Filtration.ObjectModel/Enums/BlockItemOrdering.cs index 7dedf89..a9fcd08 100644 --- a/Filtration.ObjectModel/Enums/BlockItemOrdering.cs +++ b/Filtration.ObjectModel/Enums/BlockItemOrdering.cs @@ -25,6 +25,7 @@ namespace Filtration.ObjectModel.Enums Rarity, Class, BaseType, + Prophecy, HasExplicitMod, SetTextColor, SetBackgroundColor, diff --git a/Filtration.ObjectModel/Enums/BlockItemType.cs b/Filtration.ObjectModel/Enums/BlockItemType.cs index 4a5d24a..c287b3a 100644 --- a/Filtration.ObjectModel/Enums/BlockItemType.cs +++ b/Filtration.ObjectModel/Enums/BlockItemType.cs @@ -8,6 +8,7 @@ Rarity, Class, BaseType, + Prophecy, Sockets, LinkedSockets, SocketGroup, diff --git a/Filtration.ObjectModel/Filtration.ObjectModel.csproj b/Filtration.ObjectModel/Filtration.ObjectModel.csproj index 2e40e39..cec09a1 100644 --- a/Filtration.ObjectModel/Filtration.ObjectModel.csproj +++ b/Filtration.ObjectModel/Filtration.ObjectModel.csproj @@ -92,6 +92,7 @@ + diff --git a/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs b/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs index 370d27d..e96760f 100644 --- a/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs +++ b/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs @@ -119,8 +119,8 @@ namespace Filtration.Parser.Tests.Services var blockItem = result.BlockItems.OfType().First(); Assert.AreEqual(55, blockItem.FilterPredicate.PredicateOperand); Assert.AreEqual(FilterPredicateOperator.GreaterThanOrEqual, blockItem.FilterPredicate.PredicateOperator); - } - + } + [Ignore("Update required, ItemFilterBlockTranslator does not set IsShowChecked anymore")] [Test] public void TranslateStringToItemFilterBlock_BlockGroupsEnabled_ShowBlock_SetsBlockGroupIsCheckedCorrectly() @@ -567,6 +567,25 @@ namespace Filtration.Parser.Tests.Services Assert.Contains("Test BaseType 2", blockItem.Items); } + [Test] + public void TranslateStringToItemFilterBlock_Prophecy_ReturnsCorrectObject() + { + // Arrange + var inputString = "Show" + Environment.NewLine + + @" Prophecy ""Test Prophecy 1"" ""TestOneWordProphecyInQuotes"" TestOneWordProphecyNotInQuotes ""Test Prophecy 2"""; + + // Act + var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript); + + // Assert + Assert.AreEqual(1, result.BlockItems.Count(b => b is ProphecyBlockItem)); + var blockItem = result.BlockItems.OfType().First(); + Assert.Contains("Test Prophecy 1", blockItem.Items); + Assert.Contains("TestOneWordProphecyInQuotes", blockItem.Items); + Assert.Contains("TestOneWordProphecyNotInQuotes", blockItem.Items); + Assert.Contains("Test Prophecy 2", blockItem.Items); + } + [Test] public void TranslateStringToItemFilterBlock_HasExplicitMod_ReturnsCorrectObject() { @@ -934,6 +953,7 @@ namespace Filtration.Parser.Tests.Services " ElderMap False" + Environment.NewLine + @" Class ""My Item Class"" AnotherClass ""AndAnotherClass""" + Environment.NewLine + @" BaseType MyBaseType ""Another BaseType""" + Environment.NewLine + + @" Prophecy MyProphecy ""Another Prophecy""" + Environment.NewLine + @" HasExplicitMod MyMod ""Another Mod""" + Environment.NewLine + " JunkLine Let's ignore this one!" + Environment.NewLine + " #Quality Commented out quality line" + Environment.NewLine + @@ -1008,6 +1028,11 @@ namespace Filtration.Parser.Tests.Services Assert.Contains("MyBaseType", baseTypeblockItem.Items); Assert.Contains("Another BaseType", baseTypeblockItem.Items); + var prophecyblockItem = result.BlockItems.OfType().First(); + Assert.AreEqual(2, prophecyblockItem.Items.Count); + Assert.Contains("MyProphecy", prophecyblockItem.Items); + Assert.Contains("Another Prophecy", prophecyblockItem.Items); + var hasExplicitModBlockItem = result.BlockItems.OfType().First(); Assert.AreEqual(2, hasExplicitModBlockItem.Items.Count); Assert.Contains("MyMod", hasExplicitModBlockItem.Items); @@ -1707,6 +1732,26 @@ namespace Filtration.Parser.Tests.Services Assert.AreEqual(expectedResult, result); } + [Test] + public void TranslateItemFilterBlockToString_Prophecies_ReturnsCorrectString() + { + // Arrange + var expectedResult = "Show" + Environment.NewLine + + " Prophecy \"Test Prophecy\" \"Another Prophecy\" \"Yet Another Prophecy\""; + + var prophecyBlockItem = new ProphecyBlockItem(); + prophecyBlockItem.Items.Add("Test Prophecy"); + prophecyBlockItem.Items.Add("Another Prophecy"); + prophecyBlockItem.Items.Add("Yet Another Prophecy"); + _testUtility.TestBlock.BlockItems.Add(prophecyBlockItem); + + // Act + var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock); + + // Assert + Assert.AreEqual(expectedResult, result); + } + [Test] public void TranslateItemFilterBlockToString_HasExplicitMod_ReturnsCorrectString() { @@ -2013,6 +2058,7 @@ namespace Filtration.Parser.Tests.Services " Rarity = Unique" + Environment.NewLine + " Class \"Body Armour\" \"Gloves\" \"Belt\" \"Two Hand Axes\"" + Environment.NewLine + " BaseType \"Greater Life Flask\" \"Simple Robe\" \"Full Wyrmscale\"" + Environment.NewLine + + " Prophecy \"The Cursed Choir\" \"A Valuable Combination\" \"The Beautiful Guide\"" + Environment.NewLine + " HasExplicitMod \"Guatelitzi's\" \"of Tacati\" \"Tyrannical\"" + Environment.NewLine + " SetTextColor 255 89 0 56" + Environment.NewLine + " SetBackgroundColor 0 0 0" + Environment.NewLine + @@ -2046,6 +2092,11 @@ namespace Filtration.Parser.Tests.Services baseTypeItemblockItem.Items.Add("Simple Robe"); baseTypeItemblockItem.Items.Add("Full Wyrmscale"); _testUtility.TestBlock.BlockItems.Add(baseTypeItemblockItem); + var prophecyItemblockItem = new ProphecyBlockItem(); + prophecyItemblockItem.Items.Add("The Cursed Choir"); + prophecyItemblockItem.Items.Add("A Valuable Combination"); + prophecyItemblockItem.Items.Add("The Beautiful Guide"); + _testUtility.TestBlock.BlockItems.Add(prophecyItemblockItem); var hasExplicitModBlockItem = new HasExplicitModBlockItem(); hasExplicitModBlockItem.Items.Add("Guatelitzi's"); hasExplicitModBlockItem.Items.Add("of Tacati"); diff --git a/Filtration.Parser/Services/ItemFilterBlockTranslator.cs b/Filtration.Parser/Services/ItemFilterBlockTranslator.cs index d7970d9..5d876f8 100644 --- a/Filtration.Parser/Services/ItemFilterBlockTranslator.cs +++ b/Filtration.Parser/Services/ItemFilterBlockTranslator.cs @@ -46,7 +46,7 @@ namespace Filtration.Parser.Services return itemFilterCommentBlock; } - // This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks + // This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks // and reading ItemFilterScripts from a file. public IItemFilterBlock TranslateStringToItemFilterBlock(string inputString, IItemFilterScript parentItemFilterScript, string originalString = "", bool initialiseBlockGroupHierarchyBuilder = false) { @@ -159,6 +159,11 @@ namespace Filtration.Parser.Services AddStringListItemToBlockItems(block, trimmedLine); break; } + case "Prophecy": + { + AddStringListItemToBlockItems(block, trimmedLine); + break; + } case "Corrupted": { AddBooleanItemToBlockItems(block, trimmedLine); @@ -268,7 +273,7 @@ namespace Filtration.Parser.Services RemoveExistingBlockItemsOfType(block); var match = Regex.Match(trimmedLine, @"\S+\s+(\S+)\s?(\d+)?"); - + if (match.Success) { string firstValue = match.Groups[1].Value; @@ -329,12 +334,12 @@ namespace Filtration.Parser.Services { // Only ever use the last Icon item encountered as multiples aren't valid. RemoveExistingBlockItemsOfType(block); - + // TODO: Get size, color, shape values programmatically var match = Regex.Match(trimmedLine, @"\S+\s+(0|1|2)\s+(Red|Green|Blue|Brown|White|Yellow)\s+(Circle|Diamond|Hexagon|Square|Star|Triangle)\s*([#]?)(.*)", RegexOptions.IgnoreCase); - + if (match.Success) { var blockItemValue = new MapIconBlockItem @@ -359,10 +364,10 @@ namespace Filtration.Parser.Services { // Only ever use the last BeamColor item encountered as multiples aren't valid. RemoveExistingBlockItemsOfType(block); - + // TODO: Get colors programmatically var match = Regex.Match(trimmedLine, @"\S+\s+(Red|Green|Blue|Brown|White|Yellow)\s*(Temp)?", RegexOptions.IgnoreCase); - + if (match.Success) { var blockItemValue = new PlayEffectBlockItem @@ -383,7 +388,7 @@ namespace Filtration.Parser.Services RemoveExistingBlockItemsOfType(block); var match = Regex.Match(trimmedLine, @"\S+\s+""([^\*\<\>\?|]+)"""); - + if (match.Success) { var blockItemValue = new CustomSoundBlockItem @@ -510,7 +515,7 @@ namespace Filtration.Parser.Services private static void AddNumericFilterPredicateItemToBlockItems(IItemFilterBlock block, string inputString) where T : NumericFilterPredicateBlockItem { var blockItem = Activator.CreateInstance(); - + SetNumericFilterPredicateFromString(blockItem.FilterPredicate, inputString); block.BlockItems.Add(blockItem); } @@ -637,10 +642,10 @@ namespace Filtration.Parser.Services blockItems.Add(blockItem); break; } - } + } } } - + private void AddBlockGroupToBlock(IItemFilterBlock block, string inputString) { var blockGroupText = GetTextAfterFirstComment(inputString); @@ -725,7 +730,7 @@ namespace Filtration.Parser.Services // Remove trailing newline return commentWithHashes.TrimEnd('\r', '\n'); } - + // This method converts an ItemFilterBlock object into a string. This is used for copying a ItemFilterBlock // to the clipboard, and when saving a ItemFilterScript. // TODO: Private diff --git a/Filtration/UserControls/BlockItemControl.xaml b/Filtration/UserControls/BlockItemControl.xaml index 83deb40..56ab37b 100644 --- a/Filtration/UserControls/BlockItemControl.xaml +++ b/Filtration/UserControls/BlockItemControl.xaml @@ -1,7 +1,7 @@  @@ -46,12 +46,12 @@ False - + - + @@ -70,12 +70,17 @@ - + + + + + + @@ -114,12 +119,12 @@ - + @@ -164,7 +169,7 @@ - + @@ -225,7 +230,7 @@ -