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 @@
-