Skip to content

Commit c4e08e3

Browse files
authored
Merge pull request #833 from Sidekick-Poe/feature/waystone-properties
Added missing waystone properties
2 parents d7efca7 + 16856f3 commit c4e08e3

File tree

21 files changed

+374
-25
lines changed

21 files changed

+374
-25
lines changed

Game Localization.xlsm

7.02 KB
Binary file not shown.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System.Text.RegularExpressions;
2+
using Sidekick.Apis.Poe.Items;
3+
using Sidekick.Apis.Poe.Languages;
4+
using Sidekick.Apis.Poe.Trade.Parser.Properties.Filters;
5+
using Sidekick.Apis.Poe.Trade.Trade.Requests;
6+
using Sidekick.Apis.Poe.Trade.Trade.Requests.Filters;
7+
using Sidekick.Apis.Poe.Trade.Trade.Results;
8+
using Sidekick.Common.Settings;
9+
10+
namespace Sidekick.Apis.Poe.Trade.Parser.Properties.Definitions;
11+
12+
public class MagicMonstersProperty(IGameLanguageProvider gameLanguageProvider) : PropertyDefinition
13+
{
14+
private Regex Pattern { get; } = gameLanguageProvider.Language.DescriptionMagicMonsters.ToRegexIntCapture();
15+
16+
private Regex IsAugmentedPattern { get; } = gameLanguageProvider.Language.DescriptionMagicMonsters.ToRegexIsAugmented();
17+
18+
public override List<Category> ValidCategories { get; } = [Category.Map, Category.Contract, Category.Logbook];
19+
20+
public override void Parse(Item item)
21+
{
22+
var propertyBlock = item.Text.Blocks[1];
23+
item.Properties.MagicMonsters = GetInt(Pattern, propertyBlock);
24+
if (item.Properties.MagicMonsters == 0) return;
25+
26+
propertyBlock.Parsed = true;
27+
if (GetBool(IsAugmentedPattern, propertyBlock)) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.MagicMonsters));
28+
}
29+
30+
public override Task<PropertyFilter?> GetFilter(Item item, double normalizeValue, FilterType filterType)
31+
{
32+
if (item.Properties.MagicMonsters <= 0) return Task.FromResult<PropertyFilter?>(null);
33+
34+
var filter = new IntPropertyFilter(this)
35+
{
36+
Text = gameLanguageProvider.Language.DescriptionMagicMonsters,
37+
NormalizeEnabled = true,
38+
NormalizeValue = normalizeValue,
39+
Value = item.Properties.MagicMonsters,
40+
ValuePrefix = "+",
41+
ValueSuffix = "%",
42+
Checked = false,
43+
Type = item.Properties.AugmentedProperties.Contains(nameof(ItemProperties.MagicMonsters)) ? LineContentType.Augmented : LineContentType.Simple,
44+
};
45+
filter.ChangeFilterType(filterType);
46+
return Task.FromResult<PropertyFilter?>(filter);
47+
}
48+
49+
public override void PrepareTradeRequest(Query query, Item item, PropertyFilter filter)
50+
{
51+
if (!filter.Checked || filter is not IntPropertyFilter intFilter) return;
52+
53+
query.Filters.GetOrCreateMapFilters().Filters.MagicMonsters = new StatFilterValue(intFilter);
54+
}
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System.Text.RegularExpressions;
2+
using Sidekick.Apis.Poe.Items;
3+
using Sidekick.Apis.Poe.Languages;
4+
using Sidekick.Apis.Poe.Trade.Parser.Properties.Filters;
5+
using Sidekick.Apis.Poe.Trade.Trade.Requests;
6+
using Sidekick.Apis.Poe.Trade.Trade.Requests.Filters;
7+
using Sidekick.Apis.Poe.Trade.Trade.Results;
8+
using Sidekick.Common.Settings;
9+
10+
namespace Sidekick.Apis.Poe.Trade.Parser.Properties.Definitions;
11+
12+
public class RareMonstersProperty(IGameLanguageProvider gameLanguageProvider) : PropertyDefinition
13+
{
14+
private Regex Pattern { get; } = gameLanguageProvider.Language.DescriptionRareMonsters.ToRegexIntCapture();
15+
16+
private Regex IsAugmentedPattern { get; } = gameLanguageProvider.Language.DescriptionRareMonsters.ToRegexIsAugmented();
17+
18+
public override List<Category> ValidCategories { get; } = [Category.Map, Category.Contract, Category.Logbook];
19+
20+
public override void Parse(Item item)
21+
{
22+
var propertyBlock = item.Text.Blocks[1];
23+
item.Properties.RareMonsters = GetInt(Pattern, propertyBlock);
24+
if (item.Properties.RareMonsters == 0) return;
25+
26+
propertyBlock.Parsed = true;
27+
if (GetBool(IsAugmentedPattern, propertyBlock)) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.RareMonsters));
28+
}
29+
30+
public override Task<PropertyFilter?> GetFilter(Item item, double normalizeValue, FilterType filterType)
31+
{
32+
if (item.Properties.RareMonsters <= 0) return Task.FromResult<PropertyFilter?>(null);
33+
34+
var filter = new IntPropertyFilter(this)
35+
{
36+
Text = gameLanguageProvider.Language.DescriptionRareMonsters,
37+
NormalizeEnabled = true,
38+
NormalizeValue = normalizeValue,
39+
Value = item.Properties.RareMonsters,
40+
ValuePrefix = "+",
41+
ValueSuffix = "%",
42+
Checked = false,
43+
Type = item.Properties.AugmentedProperties.Contains(nameof(ItemProperties.RareMonsters)) ? LineContentType.Augmented : LineContentType.Simple,
44+
};
45+
filter.ChangeFilterType(filterType);
46+
return Task.FromResult<PropertyFilter?>(filter);
47+
}
48+
49+
public override void PrepareTradeRequest(Query query, Item item, PropertyFilter filter)
50+
{
51+
if (!filter.Checked || filter is not IntPropertyFilter intFilter) return;
52+
53+
query.Filters.GetOrCreateMapFilters().Filters.RareMonsters = new StatFilterValue(intFilter);
54+
}
55+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System.Text.RegularExpressions;
2+
using Sidekick.Apis.Poe.Items;
3+
using Sidekick.Apis.Poe.Languages;
4+
using Sidekick.Apis.Poe.Trade.Parser.Properties.Filters;
5+
using Sidekick.Apis.Poe.Trade.Trade.Requests;
6+
using Sidekick.Apis.Poe.Trade.Trade.Requests.Filters;
7+
using Sidekick.Apis.Poe.Trade.Trade.Results;
8+
using Sidekick.Common.Settings;
9+
10+
namespace Sidekick.Apis.Poe.Trade.Parser.Properties.Definitions;
11+
12+
public class RevivesAvailableProperty(IGameLanguageProvider gameLanguageProvider) : PropertyDefinition
13+
{
14+
private Regex Pattern { get; } = gameLanguageProvider.Language.DescriptionRevivesAvailable.ToRegexIntCapture();
15+
16+
private Regex IsAugmentedPattern { get; } = gameLanguageProvider.Language.DescriptionRevivesAvailable.ToRegexIsAugmented();
17+
18+
public override List<Category> ValidCategories { get; } = [Category.Map, Category.Contract, Category.Logbook];
19+
20+
public override void Parse(Item item)
21+
{
22+
var propertyBlock = item.Text.Blocks[1];
23+
item.Properties.RevivesAvailable = GetInt(Pattern, propertyBlock);
24+
if (item.Properties.RevivesAvailable == 0) return;
25+
26+
propertyBlock.Parsed = true;
27+
if (GetBool(IsAugmentedPattern, propertyBlock)) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.RevivesAvailable));
28+
}
29+
30+
public override Task<PropertyFilter?> GetFilter(Item item, double normalizeValue, FilterType filterType)
31+
{
32+
if (item.Properties.RevivesAvailable <= 0) return Task.FromResult<PropertyFilter?>(null);
33+
34+
var filter = new IntPropertyFilter(this)
35+
{
36+
Text = gameLanguageProvider.Language.DescriptionRevivesAvailable,
37+
NormalizeEnabled = false,
38+
NormalizeValue = normalizeValue,
39+
Value = item.Properties.RevivesAvailable,
40+
Checked = false,
41+
Type = item.Properties.AugmentedProperties.Contains(nameof(ItemProperties.RevivesAvailable)) ? LineContentType.Augmented : LineContentType.Simple,
42+
};
43+
filter.ChangeFilterType(filterType);
44+
return Task.FromResult<PropertyFilter?>(filter);
45+
}
46+
47+
public override void PrepareTradeRequest(Query query, Item item, PropertyFilter filter)
48+
{
49+
if (!filter.Checked || filter is not IntPropertyFilter intFilter) return;
50+
51+
query.Filters.GetOrCreateMapFilters().Filters.RevivesAvailable = new StatFilterValue(intFilter);
52+
}
53+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System.Text.RegularExpressions;
2+
using Sidekick.Apis.Poe.Items;
3+
using Sidekick.Apis.Poe.Languages;
4+
using Sidekick.Apis.Poe.Trade.Parser.Properties.Filters;
5+
using Sidekick.Apis.Poe.Trade.Trade.Requests;
6+
using Sidekick.Apis.Poe.Trade.Trade.Requests.Filters;
7+
using Sidekick.Apis.Poe.Trade.Trade.Results;
8+
using Sidekick.Common.Settings;
9+
10+
namespace Sidekick.Apis.Poe.Trade.Parser.Properties.Definitions;
11+
12+
public class WaystoneDropChanceProperty(IGameLanguageProvider gameLanguageProvider) : PropertyDefinition
13+
{
14+
private Regex Pattern { get; } = gameLanguageProvider.Language.DescriptionWaystoneDropChance.ToRegexIntCapture();
15+
16+
private Regex IsAugmentedPattern { get; } = gameLanguageProvider.Language.DescriptionWaystoneDropChance.ToRegexIsAugmented();
17+
18+
public override List<Category> ValidCategories { get; } = [Category.Map, Category.Contract, Category.Logbook];
19+
20+
public override void Parse(Item item)
21+
{
22+
var propertyBlock = item.Text.Blocks[1];
23+
item.Properties.WaystoneDropChance = GetInt(Pattern, propertyBlock);
24+
if (item.Properties.WaystoneDropChance == 0) return;
25+
26+
propertyBlock.Parsed = true;
27+
if (GetBool(IsAugmentedPattern, propertyBlock)) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.WaystoneDropChance));
28+
}
29+
30+
public override Task<PropertyFilter?> GetFilter(Item item, double normalizeValue, FilterType filterType)
31+
{
32+
if (item.Properties.WaystoneDropChance <= 0) return Task.FromResult<PropertyFilter?>(null);
33+
34+
var filter = new IntPropertyFilter(this)
35+
{
36+
Text = gameLanguageProvider.Language.DescriptionWaystoneDropChance,
37+
NormalizeEnabled = true,
38+
NormalizeValue = normalizeValue,
39+
Value = item.Properties.WaystoneDropChance,
40+
ValuePrefix = "+",
41+
ValueSuffix = "%",
42+
Checked = false,
43+
Type = item.Properties.AugmentedProperties.Contains(nameof(ItemProperties.WaystoneDropChance)) ? LineContentType.Augmented : LineContentType.Simple,
44+
};
45+
filter.ChangeFilterType(filterType);
46+
return Task.FromResult<PropertyFilter?>(filter);
47+
}
48+
49+
public override void PrepareTradeRequest(Query query, Item item, PropertyFilter filter)
50+
{
51+
if (!filter.Checked || filter is not IntPropertyFilter intFilter) return;
52+
53+
query.Filters.GetOrCreateMapFilters().Filters.WaystoneDropChance = new StatFilterValue(intFilter);
54+
}
55+
}

src/Sidekick.Apis.Poe.Trade/Parser/Properties/Definitions/WeaponDamageProperty.cs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,31 +32,33 @@ public override void Parse(Item item)
3232
// Parse damage ranges
3333
foreach (var line in propertyBlock.Lines)
3434
{
35-
var isElemental = line.Text.StartsWith(gameLanguageProvider.Language.DescriptionElementalDamage);
35+
var lineText = line.Text.Replace(".", "").Replace(",", "").Trim();
36+
37+
var isElemental = lineText.StartsWith(gameLanguageProvider.Language.DescriptionElementalDamage);
3638
if (isElemental)
3739
{
38-
ParseElementalDamage(line, item.Properties);
40+
ParseElementalDamage(lineText, item.Properties);
3941
continue;
4042
}
4143

42-
var isPhysical = line.Text.StartsWith(gameLanguageProvider.Language.DescriptionPhysicalDamage);
43-
var isChaos = line.Text.StartsWith(gameLanguageProvider.Language.DescriptionChaosDamage);
44-
var isFire = line.Text.StartsWith(gameLanguageProvider.Language.DescriptionFireDamage);
45-
var isCold = line.Text.StartsWith(gameLanguageProvider.Language.DescriptionColdDamage);
46-
var isLightning = line.Text.StartsWith(gameLanguageProvider.Language.DescriptionLightningDamage);
44+
var isPhysical = lineText.StartsWith(gameLanguageProvider.Language.DescriptionPhysicalDamage);
45+
var isChaos = lineText.StartsWith(gameLanguageProvider.Language.DescriptionChaosDamage);
46+
var isFire = lineText.StartsWith(gameLanguageProvider.Language.DescriptionFireDamage);
47+
var isCold = lineText.StartsWith(gameLanguageProvider.Language.DescriptionColdDamage);
48+
var isLightning = lineText.StartsWith(gameLanguageProvider.Language.DescriptionLightningDamage);
4749

4850
if (!isPhysical && !isChaos && !isFire && !isCold && !isLightning)
4951
{
5052
continue;
5153
}
5254

53-
if (isPhysical && line.Text.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.PhysicalDamage));
54-
if (isChaos && line.Text.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.ChaosDamage));
55-
if (isFire && line.Text.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.FireDamage));
56-
if (isCold && line.Text.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.ColdDamage));
57-
if (isLightning && line.Text.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.LightningDamage));
55+
if (isPhysical && lineText.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.PhysicalDamage));
56+
if (isChaos && lineText.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.ChaosDamage));
57+
if (isFire && lineText.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.FireDamage));
58+
if (isCold && lineText.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.ColdDamage));
59+
if (isLightning && lineText.EndsWith(")")) item.Properties.AugmentedProperties.Add(nameof(ItemProperties.LightningDamage));
5860

59-
var matches = RangePattern.Matches(line.Text);
61+
var matches = RangePattern.Matches(lineText);
6062
if (matches.Count <= 0 || matches[0].Groups.Count < 3) continue;
6163

6264
int.TryParse(matches[0].Groups[1].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var min);
@@ -71,9 +73,9 @@ public override void Parse(Item item)
7173
}
7274
}
7375

74-
private static void ParseElementalDamage(TextLine line, ItemProperties itemProperties)
76+
private static void ParseElementalDamage(string line, ItemProperties itemProperties)
7577
{
76-
var matches = new Regex(@"([\d,\.]+)-([\d,\.]+) \((fire|cold|lightning)\)").Matches(line.Text);
78+
var matches = new Regex(@"([\d,\.]+)-([\d,\.]+) \((fire|cold|lightning)\)").Matches(line);
7779
foreach (Match match in matches)
7880
{
7981
if (match.Groups.Count < 4)
@@ -109,7 +111,8 @@ public override void ParseAfterModifiers(Item item)
109111
var isElemental = line.Text.StartsWith(gameLanguageProvider.Language.DescriptionElementalDamage);
110112
if (!isElemental) continue;
111113

112-
var matches = new Regex(@"([\d,\.]+)-([\d,\.]+) \(augmented\)").Matches(line.Text);
114+
var lineText = line.Text.Replace(".", "").Replace(",", "").Trim();
115+
var matches = new Regex(@"([\d,\.]+)-([\d,\.]+) \(augmented\)").Matches(lineText);
113116
var matchIndex = 0;
114117
foreach (Match match in matches)
115118
{

src/Sidekick.Apis.Poe.Trade/Parser/Properties/PropertyParser.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,13 @@ public async Task Initialize()
5454

5555
new MapTierProperty(gameLanguageProvider),
5656
new RewardProperty(gameLanguageProvider, game, apiItemProvider),
57+
new RevivesAvailableProperty(gameLanguageProvider),
58+
new MonsterPackSizeProperty(gameLanguageProvider),
59+
new MagicMonstersProperty(gameLanguageProvider),
60+
new RareMonstersProperty(gameLanguageProvider),
5761
new ItemQuantityProperty(gameLanguageProvider),
5862
new ItemRarityProperty(gameLanguageProvider),
59-
new MonsterPackSizeProperty(gameLanguageProvider),
63+
new WaystoneDropChanceProperty(gameLanguageProvider),
6064
new AreaLevelProperty(gameLanguageProvider),
6165
new BlightedProperty(gameLanguageProvider),
6266
new BlightRavagedProperty(gameLanguageProvider),

src/Sidekick.Apis.Poe.Trade/Trade/Requests/Filters/MapFilters.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ namespace Sidekick.Apis.Poe.Trade.Trade.Requests.Filters;
44

55
public class MapFilters
66
{
7+
[JsonPropertyName("map_revives")]
8+
public StatFilterValue? RevivesAvailable { get; set; }
9+
710
[JsonPropertyName("map_iiq")]
811
public StatFilterValue? ItemQuantity { get; set; }
912

@@ -22,6 +25,15 @@ public class MapFilters
2225
[JsonPropertyName("map_packsize")]
2326
public StatFilterValue? MonsterPackSize { get; set; }
2427

28+
[JsonPropertyName("map_magic_monsters")]
29+
public StatFilterValue? MagicMonsters { get; set; }
30+
31+
[JsonPropertyName("map_rare_monsters")]
32+
public StatFilterValue? RareMonsters { get; set; }
33+
34+
[JsonPropertyName("map_bonus")]
35+
public StatFilterValue? WaystoneDropChance { get; set; }
36+
2537
[JsonPropertyName("map_blighted")]
2638
public SearchFilterOption? Blighted { get; set; }
2739

src/Sidekick.Apis.Poe/Items/ItemProperties.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,19 @@ public class ItemProperties
3838

3939
public int AreaLevel { get; set; }
4040

41+
public int RevivesAvailable { get; set; }
42+
43+
public int MonsterPackSize { get; set; }
44+
45+
public int MagicMonsters { get; set; }
46+
47+
public int RareMonsters { get; set; }
48+
4149
public int ItemQuantity { get; set; }
4250

4351
public int ItemRarity { get; set; }
4452

45-
public int MonsterPackSize { get; set; }
53+
public int WaystoneDropChance { get; set; }
4654

4755
public bool Blighted { get; set; }
4856

@@ -53,13 +61,13 @@ public class ItemProperties
5361
public List<Socket>? Sockets { get; set; }
5462

5563
public int RequiresLevel { get; set; }
56-
64+
5765
public int RequiresStrength { get; set; }
58-
66+
5967
public int RequiresDexterity { get; set; }
60-
68+
6169
public int RequiresIntelligence { get; set; }
62-
70+
6371
public double CriticalHitChance { get; set; }
6472

6573
public double AttacksPerSecond { get; set; }

src/Sidekick.Apis.Poe/Languages/IGameLanguage.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ public interface IGameLanguage
5353

5454
string DescriptionMonsterPackSize { get; }
5555

56+
string DescriptionMagicMonsters { get; }
57+
58+
string DescriptionRareMonsters { get; }
59+
60+
string DescriptionRevivesAvailable { get; }
61+
62+
string DescriptionWaystoneDropChance { get; }
63+
5664
string DescriptionExperience { get; }
5765

5866
string DescriptionPhysicalDamage { get; }
@@ -98,7 +106,7 @@ public interface IGameLanguage
98106
string DescriptionRequiresLevel { get; }
99107

100108
string DescriptionRequiresStr { get; }
101-
109+
102110
string DescriptionRequiresDex { get; }
103111

104112
string DescriptionRequiresInt { get; }

0 commit comments

Comments
 (0)