From 45edbecd64b66ba0b8d4441457cf1e7f60b5c848 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 9 Jul 2015 22:05:42 +0100 Subject: [PATCH] Initial item filter / loot item processing done --- .../Properties/AssemblyInfo.cs | 36 +++++++ .../Properties/AssemblyInfo.cs | 39 +++++++ .../TestBaseTypeBlockItem.cs | 48 +++++++++ .../BlockItemBaseTypes/TestClassBlockItem.cs | 50 +++++++++ .../TestItemLevelBlockItem.cs | 101 ++++++++++++++++++ .../TestSocketGroupBlockItem.cs | 92 ++++++++++++++++ .../Filtration.ObjectModel.Tests.csproj | 4 + .../BlockItemBaseTypes/ActionBlockItem.cs | 1 + .../BlockItemBaseTypes/BlockItembase.cs | 1 + .../BlockItemBaseTypes/ColorBlockItem.cs | 1 + .../DualIntegerBlockItem.cs | 1 + .../BlockItemBaseTypes/IntegerBlockItem.cs | 1 + .../NumericFilterPredicateBlockItem.cs | 41 +++++++ .../BlockItemBaseTypes/StringListBlockItem.cs | 8 ++ .../BlockItemTypes/BaseTypeBlockItem.cs | 6 ++ .../BlockItemTypes/ClassBlockItem.cs | 6 ++ .../BlockItemTypes/DropLevelBlockItem.cs | 6 ++ .../BlockItemTypes/HeightBlockItem.cs | 6 ++ .../BlockItemTypes/ItemLevelBlockItem.cs | 6 ++ .../BlockItemTypes/LinkedSocketsBlockItem.cs | 9 +- .../BlockItemTypes/QualityBlockItem.cs | 6 ++ .../BlockItemTypes/RarityBlockItem.cs | 6 ++ .../BlockItemTypes/SocketGroupBlockItem.cs | 69 +++++++++++- .../BlockItemTypes/SocketsBlockItem.cs | 9 +- .../BlockItemTypes/WidthBlockItem.cs | 6 ++ .../Filtration.ObjectModel.csproj | 6 +- .../DefaultLootItemAppearanceConstants.cs | 16 +++ .../LootExplosionStudio/LootItem.cs | 25 +++++ .../LootExplosionStudio/LootItemCollection.cs | 9 ++ .../LootExplosionStudio/SocketGroup.cs | 10 ++ Filtration.sln | 12 +++ 31 files changed, 633 insertions(+), 4 deletions(-) create mode 100644 Filtration.LootExplosionStudio.Tests/Properties/AssemblyInfo.cs create mode 100644 Filtration.LootExplosionStudio/Properties/AssemblyInfo.cs create mode 100644 Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestBaseTypeBlockItem.cs create mode 100644 Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestClassBlockItem.cs create mode 100644 Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestItemLevelBlockItem.cs create mode 100644 Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestSocketGroupBlockItem.cs create mode 100644 Filtration.ObjectModel/LootExplosionStudio/DefaultLootItemAppearanceConstants.cs create mode 100644 Filtration.ObjectModel/LootExplosionStudio/LootItem.cs create mode 100644 Filtration.ObjectModel/LootExplosionStudio/LootItemCollection.cs create mode 100644 Filtration.ObjectModel/LootExplosionStudio/SocketGroup.cs diff --git a/Filtration.LootExplosionStudio.Tests/Properties/AssemblyInfo.cs b/Filtration.LootExplosionStudio.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..18a4405 --- /dev/null +++ b/Filtration.LootExplosionStudio.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Filtration.LootExplosionStudio.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Filtration.LootExplosionStudio.Tests")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("24ce1315-7f86-4389-a63c-22a40baa4c6d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Filtration.LootExplosionStudio/Properties/AssemblyInfo.cs b/Filtration.LootExplosionStudio/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1b81db2 --- /dev/null +++ b/Filtration.LootExplosionStudio/Properties/AssemblyInfo.cs @@ -0,0 +1,39 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Filtration.LootExplosionStudio")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Filtration.LootExplosionStudio")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b33dec95-6eec-4e14-81d5-3d8ce0db77d1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] + +[assembly: InternalsVisibleTo("Filtration.LootExplosionStudio.Tests")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file diff --git a/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestBaseTypeBlockItem.cs b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestBaseTypeBlockItem.cs new file mode 100644 index 0000000..20f542c --- /dev/null +++ b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestBaseTypeBlockItem.cs @@ -0,0 +1,48 @@ +using System; +using System.Windows.Media; +using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.LootExplosionStudio; +using NUnit.Framework; + +namespace Filtration.ObjectModel.Tests.BlockItemBaseTypes +{ + [TestFixture] + public class TestBaseTypeBlockItem + { + [Test] + public void MatchesBlockItem_BlankLootItem_ReturnsFalse() + { + // Arrange + + var blockItem = new BaseTypeBlockItem(); + var testInputLootItem = new LootItem(); + + // Act + var result = blockItem.MatchesLootItem(testInputLootItem); + + // Assert + Assert.IsFalse(result); + } + + [Test] + public void MatchesBlockItem_StringMatch_ReturnsTrue() + { + // Arrange + var testInputBaseType = "Test Base Type"; + + var blockItem = new BaseTypeBlockItem(); + blockItem.Items.Add("Testblah"); + blockItem.Items.Add(testInputBaseType); + blockItem.Items.Add("Another Base Type"); + + var testInputLootItem = new LootItem { BaseType = testInputBaseType}; + + // Act + var result = blockItem.MatchesLootItem(testInputLootItem); + + // Assert + Assert.IsTrue(result); + } + } +} diff --git a/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestClassBlockItem.cs b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestClassBlockItem.cs new file mode 100644 index 0000000..854ae3f --- /dev/null +++ b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestClassBlockItem.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.LootExplosionStudio; +using NUnit.Framework; + +namespace Filtration.ObjectModel.Tests.BlockItemBaseTypes +{ + [TestFixture] + public class TestClassBlockItem + { + [Test] + public void MatchesBlockItem_BlankLootItem_ReturnsFalse() + { + // Arrange + + var blockItem = new ClassBlockItem(); + var testInputLootItem = new LootItem(); + + // Act + var result = blockItem.MatchesLootItem(testInputLootItem); + + // Assert + Assert.IsFalse(result); + } + + [Test] + public void MatchesBlockItem_StringMatch_ReturnsTrue() + { + // Arrange + var testInputClass = "Test Class"; + + var blockItem = new ClassBlockItem(); + blockItem.Items.Add("Testblah"); + blockItem.Items.Add(testInputClass); + blockItem.Items.Add("Another Base Type"); + + var testInputLootItem = new LootItem { Class = testInputClass }; + + // Act + var result = blockItem.MatchesLootItem(testInputLootItem); + + // Assert + Assert.IsTrue(result); + } + } +} diff --git a/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestItemLevelBlockItem.cs b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestItemLevelBlockItem.cs new file mode 100644 index 0000000..bf13e2a --- /dev/null +++ b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestItemLevelBlockItem.cs @@ -0,0 +1,101 @@ +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; +using NUnit.Framework; + +namespace Filtration.ObjectModel.Tests.BlockItemBaseTypes +{ + [TestFixture] + public class TestItemLevelBlockItem + { + [Test] + public void MatchesBlockItem_NoMatch_ReturnsFalse() + { + // Arrange + + var blockItem = new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 10); + var lootItem = new LootItem {ItemLevel = 5}; + + // Act + var result = blockItem.MatchesLootItem(lootItem); + + // Assert + Assert.IsFalse(result); + } + + [Test] + public void MatchesBlockItem_EqualsMatch_ReturnsTrue() + { + // Arrange + + var blockItem = new ItemLevelBlockItem(FilterPredicateOperator.Equal, 10); + var lootItem = new LootItem { ItemLevel = 10 }; + + // Act + var result = blockItem.MatchesLootItem(lootItem); + + // Assert + Assert.IsTrue(result); + } + + [Test] + public void MatchesBlockItem_GreaterThanMatch_ReturnsTrue() + { + // Arrange + + var blockItem = new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 10); + var lootItem = new LootItem { ItemLevel = 50 }; + + // Act + var result = blockItem.MatchesLootItem(lootItem); + + // Assert + Assert.IsTrue(result); + } + + [Test] + public void MatchesBlockItem_GreaterThanOrEqualMatch_ReturnsTrue() + { + // Arrange + + var blockItem = new ItemLevelBlockItem(FilterPredicateOperator.GreaterThanOrEqual, 10); + var lootItem = new LootItem { ItemLevel = 50 }; + + // Act + var result = blockItem.MatchesLootItem(lootItem); + + // Assert + Assert.IsTrue(result); + } + + [Test] + public void MatchesBlockItem_LessThan_ReturnsTrue() + { + // Arrange + + var blockItem = new ItemLevelBlockItem(FilterPredicateOperator.LessThan, 10); + var lootItem = new LootItem { ItemLevel = 1 }; + + // Act + var result = blockItem.MatchesLootItem(lootItem); + + // Assert + Assert.IsTrue(result); + } + + [Test] + public void MatchesBlockItem_LessThanOrEqual_ReturnsTrue() + { + // Arrange + + var blockItem = new ItemLevelBlockItem(FilterPredicateOperator.LessThanOrEqual, 10); + var lootItem = new LootItem { ItemLevel = 1 }; + + // Act + var result = blockItem.MatchesLootItem(lootItem); + + // Assert + Assert.IsTrue(result); + } + } +} diff --git a/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestSocketGroupBlockItem.cs b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestSocketGroupBlockItem.cs new file mode 100644 index 0000000..d837f5a --- /dev/null +++ b/Filtration.ObjectModel.Tests/BlockItemBaseTypes/TestSocketGroupBlockItem.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; +using System.Net.Sockets; +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; +using NUnit.Framework; + +namespace Filtration.ObjectModel.Tests.BlockItemBaseTypes +{ + [TestFixture] + public class TestSocketGroupBlockItem + { + [Test] + public void MatchesBlockItem_BlankLootItem_ReturnsFalse() + { + // Arrange + + var blockItem = new SocketGroupBlockItem(); + var testInputLootItem = new LootItem(); + + // Act + var result = blockItem.MatchesLootItem(testInputLootItem); + + // Assert + Assert.IsFalse(result); + } + + [Test] + public void MatchesBlockItem_SocketsMatch_ReturnsTrue() + { + // Arrange + var testInputSocketGroups = new List(); + var testInputSocketGroup1 = new SocketGroup(); + var testInputSocketGroup2 = new SocketGroup(); + testInputSocketGroup1.Sockets = new List {SocketColor.Blue, SocketColor.Red}; + testInputSocketGroup2.Sockets = new List + { + SocketColor.Blue, + SocketColor.Blue, + SocketColor.Blue, + SocketColor.Red + }; + + testInputSocketGroups.Add(testInputSocketGroup1); + testInputSocketGroups.Add(testInputSocketGroup2); + + var blockItem = new SocketGroupBlockItem(); + blockItem.Items.Add("RRG"); + blockItem.Items.Add("BRB"); + + var testInputLootItem = new LootItem {SocketGroups = testInputSocketGroups}; + + // Act + var result = blockItem.MatchesLootItem(testInputLootItem); + + // Assert + Assert.IsTrue(result); + } + + [Test] + public void MatchesBlockItem_SocketsAlmostMatch_ReturnsFalse() + { + // Arrange + var testInputSocketGroups = new List(); + var testInputSocketGroup1 = new SocketGroup(); + var testInputSocketGroup2 = new SocketGroup(); + testInputSocketGroup1.Sockets = new List { SocketColor.Blue, SocketColor.Red }; + testInputSocketGroup2.Sockets = new List + { + SocketColor.Blue, + SocketColor.Blue, + SocketColor.Blue, + SocketColor.Red, + SocketColor.Green + }; + + testInputSocketGroups.Add(testInputSocketGroup1); + testInputSocketGroups.Add(testInputSocketGroup2); + + var blockItem = new SocketGroupBlockItem(); + blockItem.Items.Add("BGBRWB"); + + var testInputLootItem = new LootItem { SocketGroups = testInputSocketGroups }; + + // Act + var result = blockItem.MatchesLootItem(testInputLootItem); + + // Assert + Assert.IsFalse(result); + } + } +} diff --git a/Filtration.ObjectModel.Tests/Filtration.ObjectModel.Tests.csproj b/Filtration.ObjectModel.Tests/Filtration.ObjectModel.Tests.csproj index 1780f73..185a4c9 100644 --- a/Filtration.ObjectModel.Tests/Filtration.ObjectModel.Tests.csproj +++ b/Filtration.ObjectModel.Tests/Filtration.ObjectModel.Tests.csproj @@ -46,6 +46,10 @@ + + + + diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/ActionBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/ActionBlockItem.cs index 8d7d5e1..a4476e8 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/ActionBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/ActionBlockItem.cs @@ -1,6 +1,7 @@ using System.Windows.Media; using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Extensions; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemBaseTypes { diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/BlockItembase.cs b/Filtration.ObjectModel/BlockItemBaseTypes/BlockItembase.cs index 328e193..5dc4d89 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/BlockItembase.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/BlockItembase.cs @@ -2,6 +2,7 @@ using System.Runtime.CompilerServices; using System.Windows.Media; using Filtration.ObjectModel.Annotations; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemBaseTypes { diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs index f0c39b5..2e7c6e8 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/ColorBlockItem.cs @@ -1,5 +1,6 @@ using System; using System.Windows.Media; +using Filtration.ObjectModel.LootExplosionStudio; using Filtration.ObjectModel.ThemeEditor; namespace Filtration.ObjectModel.BlockItemBaseTypes diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/DualIntegerBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/DualIntegerBlockItem.cs index a91ce86..7df6da3 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/DualIntegerBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/DualIntegerBlockItem.cs @@ -1,4 +1,5 @@ using System.Windows.Media; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemBaseTypes { diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/IntegerBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/IntegerBlockItem.cs index 262ad92..26a7e40 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/IntegerBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/IntegerBlockItem.cs @@ -1,4 +1,5 @@ using System.Windows.Media; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemBaseTypes { diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/NumericFilterPredicateBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/NumericFilterPredicateBlockItem.cs index bbc32c4..aa4f586 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/NumericFilterPredicateBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/NumericFilterPredicateBlockItem.cs @@ -1,6 +1,7 @@ using System; using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Extensions; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemBaseTypes { @@ -47,5 +48,45 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes OnPropertyChanged("FilterPredicate"); OnPropertyChanged("SummaryText"); } + + + + public abstract int GetLootItemProperty(LootItem lootItem); + + public virtual bool MatchesLootItem(LootItem lootItem) + { + var lootItemProperty = GetLootItemProperty(lootItem); + var predicateOperand = FilterPredicate.PredicateOperand; + + switch (FilterPredicate.PredicateOperator) + { + case FilterPredicateOperator.Equal: + { + return lootItemProperty == predicateOperand; + } + case FilterPredicateOperator.GreaterThan: + { + return lootItemProperty > predicateOperand; + } + case FilterPredicateOperator.GreaterThanOrEqual: + { + return lootItemProperty >= predicateOperand; + } + case FilterPredicateOperator.LessThan: + { + return lootItemProperty < predicateOperand; + } + case FilterPredicateOperator.LessThanOrEqual: + { + return lootItemProperty <= predicateOperand; + } + case FilterPredicateOperator.NotEqual: + { + return lootItemProperty != predicateOperand; + } + default: + return false; + } + } } } diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/StringListBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/StringListBlockItem.cs index 0e95c5d..a8825df 100644 --- a/Filtration.ObjectModel/BlockItemBaseTypes/StringListBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemBaseTypes/StringListBlockItem.cs @@ -2,6 +2,7 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemBaseTypes { @@ -36,5 +37,12 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes OnPropertyChanged("Items"); OnPropertyChanged("SummaryText"); } + + public abstract string GetLootItemProperty(LootItem lootItem); + + public virtual bool MatchesLootItem(LootItem lootItem) + { + return Items.Any(i => i == GetLootItemProperty(lootItem)); + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/BaseTypeBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/BaseTypeBlockItem.cs index 2dd869f..4b7a480 100644 --- a/Filtration.ObjectModel/BlockItemTypes/BaseTypeBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/BaseTypeBlockItem.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -56,5 +57,10 @@ namespace Filtration.ObjectModel.BlockItemTypes { get { return 11; } } + + public override string GetLootItemProperty(LootItem lootItem) + { + return lootItem.BaseType; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/ClassBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/ClassBlockItem.cs index 9360ccb..2afcd4c 100644 --- a/Filtration.ObjectModel/BlockItemTypes/ClassBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/ClassBlockItem.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -50,5 +51,10 @@ namespace Filtration.ObjectModel.BlockItemTypes { get { return 10; } } + + public override string GetLootItemProperty(LootItem lootItem) + { + return lootItem.Class; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/DropLevelBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/DropLevelBlockItem.cs index a3abc6d..3aaff65 100644 --- a/Filtration.ObjectModel/BlockItemTypes/DropLevelBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/DropLevelBlockItem.cs @@ -1,6 +1,7 @@ using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -68,5 +69,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return 100; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return lootItem.DropLevel; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/HeightBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/HeightBlockItem.cs index 5c75e37..e3ec45f 100644 --- a/Filtration.ObjectModel/BlockItemTypes/HeightBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/HeightBlockItem.cs @@ -1,6 +1,7 @@ using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -65,5 +66,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return 6; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return lootItem.Height; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/ItemLevelBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/ItemLevelBlockItem.cs index 61b94d7..68dca54 100644 --- a/Filtration.ObjectModel/BlockItemTypes/ItemLevelBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/ItemLevelBlockItem.cs @@ -1,6 +1,7 @@ using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -67,5 +68,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return 100; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return lootItem.ItemLevel; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/LinkedSocketsBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/LinkedSocketsBlockItem.cs index abb3157..b496f0e 100644 --- a/Filtration.ObjectModel/BlockItemTypes/LinkedSocketsBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/LinkedSocketsBlockItem.cs @@ -1,6 +1,8 @@ -using System.Windows.Media; +using System.Linq; +using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -68,5 +70,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return 6; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return lootItem.SocketGroups.Where(c => c.Sockets.Count > 1).Sum(socketGroup => socketGroup.Sockets.Count); + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/QualityBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/QualityBlockItem.cs index 4b05703..713303d 100644 --- a/Filtration.ObjectModel/BlockItemTypes/QualityBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/QualityBlockItem.cs @@ -1,6 +1,7 @@ using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -68,5 +69,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return 20; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return lootItem.Quality; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/RarityBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/RarityBlockItem.cs index a7bc010..0d3566c 100644 --- a/Filtration.ObjectModel/BlockItemTypes/RarityBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/RarityBlockItem.cs @@ -2,6 +2,7 @@ using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Extensions; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -85,5 +86,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return (int)ItemRarity.Unique; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return (int)lootItem.Rarity; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs index 4a66b01..72280a5 100644 --- a/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs @@ -1,6 +1,10 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -47,5 +51,68 @@ namespace Filtration.ObjectModel.BlockItemTypes { get { return 9; } } + + public override string GetLootItemProperty(LootItem lootItem) + { + return lootItem.SocketGroups.ToString(); + } + + public override bool MatchesLootItem(LootItem lootItem) + { + foreach (var socketGroupString in Items) + { + var socketColorList = SocketGroupStringToSocketColors(socketGroupString); + if ( + lootItem.SocketGroups.Any( + g => + g.Sockets.Count(s => s == SocketColor.Red) >= + socketColorList.Count(l => l == SocketColor.Red) && + g.Sockets.Count(s => s == SocketColor.Green) >= + socketColorList.Count(l => l == SocketColor.Green) && + g.Sockets.Count(s => s == SocketColor.Blue) >= + socketColorList.Count(l => l == SocketColor.Blue) && + g.Sockets.Count(s => s == SocketColor.White) >= + socketColorList.Count(l => l == SocketColor.White))) + { + return true; + } + } + + return false; + } + + private List SocketGroupStringToSocketColors(string socketGroupString) + { + var socketColorList = new List(); + + foreach (var c in socketGroupString.ToCharArray()) + { + switch (c) + { + case 'R': + { + socketColorList.Add(SocketColor.Red); + break; + } + case 'G': + { + socketColorList.Add(SocketColor.Green); + break; + } + case 'B': + { + socketColorList.Add(SocketColor.Blue); + break; + } + case 'W': + { + socketColorList.Add(SocketColor.White); + break; + } + } + } + + return socketColorList; + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/SocketsBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/SocketsBlockItem.cs index 23e2c5a..359e84c 100644 --- a/Filtration.ObjectModel/BlockItemTypes/SocketsBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/SocketsBlockItem.cs @@ -1,6 +1,8 @@ -using System.Windows.Media; +using System.Linq; +using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -68,5 +70,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return 6; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return lootItem.SocketGroups.Sum(c => c.Sockets.Count()); + } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/WidthBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/WidthBlockItem.cs index aff1e77..714455b 100644 --- a/Filtration.ObjectModel/BlockItemTypes/WidthBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/WidthBlockItem.cs @@ -1,6 +1,7 @@ using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; namespace Filtration.ObjectModel.BlockItemTypes { @@ -68,5 +69,10 @@ namespace Filtration.ObjectModel.BlockItemTypes return 2; } } + + public override int GetLootItemProperty(LootItem lootItem) + { + return lootItem.Width; + } } } diff --git a/Filtration.ObjectModel/Filtration.ObjectModel.csproj b/Filtration.ObjectModel/Filtration.ObjectModel.csproj index be65406..6baac68 100644 --- a/Filtration.ObjectModel/Filtration.ObjectModel.csproj +++ b/Filtration.ObjectModel/Filtration.ObjectModel.csproj @@ -41,7 +41,7 @@ - + @@ -77,6 +77,10 @@ + + + + diff --git a/Filtration.ObjectModel/LootExplosionStudio/DefaultLootItemAppearanceConstants.cs b/Filtration.ObjectModel/LootExplosionStudio/DefaultLootItemAppearanceConstants.cs new file mode 100644 index 0000000..6071292 --- /dev/null +++ b/Filtration.ObjectModel/LootExplosionStudio/DefaultLootItemAppearanceConstants.cs @@ -0,0 +1,16 @@ +using System.Windows.Media; + +namespace Filtration.ObjectModel.LootExplosionStudio +{ + public static class DefaultLootItemAppearanceConstants + { + public readonly static Color NormalTextColor = new Color { A = 255, R = 200, G = 200, B = 200 }; + public readonly static Color MagicTextColor = new Color { A = 255, R = 136, G = 136, B = 255 }; + public readonly static Color RareTextColor = new Color { A = 255, R = 255, G = 255, B = 119 }; + public readonly static Color UniqueTextColor = new Color { A = 255, R = 175, G = 96, B = 37 }; + public readonly static Color QuestItemTextColor = new Color { A = 255, R = 74, G = 230, B = 58 }; + public static readonly Color BackgroundColor = new Color {A = 255, R = 0, G = 0, B = 0}; + public static readonly Color BorderColor = new Color { A = 255, R = 0, G = 0, B = 0 }; + public static readonly int FontSize = 35; + } +} diff --git a/Filtration.ObjectModel/LootExplosionStudio/LootItem.cs b/Filtration.ObjectModel/LootExplosionStudio/LootItem.cs new file mode 100644 index 0000000..4e4c4e1 --- /dev/null +++ b/Filtration.ObjectModel/LootExplosionStudio/LootItem.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Windows.Media; +using Filtration.ObjectModel.Enums; + +namespace Filtration.ObjectModel.LootExplosionStudio +{ + public class LootItem + { + public string Name { get; set; } + public int ItemLevel { get; set; } + public int DropLevel { get; set; } + public int Quality { get; set; } + public ItemRarity Rarity { get; set; } + public string Class { get; set; } + public string BaseType { get; set; } + public List SocketGroups { get; set; } + public int Width { get; set; } + public int Height { get; set; } + + public Color TextColor { get; set; } + public Color BackgroundColor { get; set; } + public Color BorderColor { get; set; } + public int FontSize { get; set; } + } +} diff --git a/Filtration.ObjectModel/LootExplosionStudio/LootItemCollection.cs b/Filtration.ObjectModel/LootExplosionStudio/LootItemCollection.cs new file mode 100644 index 0000000..e1326de --- /dev/null +++ b/Filtration.ObjectModel/LootExplosionStudio/LootItemCollection.cs @@ -0,0 +1,9 @@ +using System.Collections.ObjectModel; + +namespace Filtration.ObjectModel.LootExplosionStudio +{ + public class LootItemCollection : Collection + { + + } +} diff --git a/Filtration.ObjectModel/LootExplosionStudio/SocketGroup.cs b/Filtration.ObjectModel/LootExplosionStudio/SocketGroup.cs new file mode 100644 index 0000000..0d7e582 --- /dev/null +++ b/Filtration.ObjectModel/LootExplosionStudio/SocketGroup.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using Filtration.ObjectModel.Enums; + +namespace Filtration.ObjectModel.LootExplosionStudio +{ + public class SocketGroup + { + public List Sockets { get; set; } + } +} \ No newline at end of file diff --git a/Filtration.sln b/Filtration.sln index b7c2601..3b623ae 100644 --- a/Filtration.sln +++ b/Filtration.sln @@ -21,6 +21,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.Common", "Filtra EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.Common.Tests", "Filtration.Common.Tests\Filtration.Common.Tests.csproj", "{1E42A658-45C4-4DD9-83C5-2A10728DBDFA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.LootExplosionStudio", "Filtration.LootExplosionStudio\Filtration.LootExplosionStudio.csproj", "{C8009B11-14D0-4421-94F0-9EF4603CB363}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filtration.LootExplosionStudio.Tests", "Filtration.LootExplosionStudio.Tests\Filtration.LootExplosionStudio.Tests.csproj", "{56D0887E-B10D-4F9C-A88E-09CF8E8E06E3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -63,6 +67,14 @@ Global {1E42A658-45C4-4DD9-83C5-2A10728DBDFA}.Debug|Any CPU.Build.0 = Debug|Any CPU {1E42A658-45C4-4DD9-83C5-2A10728DBDFA}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E42A658-45C4-4DD9-83C5-2A10728DBDFA}.Release|Any CPU.Build.0 = Release|Any CPU + {C8009B11-14D0-4421-94F0-9EF4603CB363}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8009B11-14D0-4421-94F0-9EF4603CB363}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8009B11-14D0-4421-94F0-9EF4603CB363}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8009B11-14D0-4421-94F0-9EF4603CB363}.Release|Any CPU.Build.0 = Release|Any CPU + {56D0887E-B10D-4F9C-A88E-09CF8E8E06E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56D0887E-B10D-4F9C-A88E-09CF8E8E06E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56D0887E-B10D-4F9C-A88E-09CF8E8E06E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56D0887E-B10D-4F9C-A88E-09CF8E8E06E3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE