diff --git a/gemp-lotr/db/extract-tourney-replays.sql b/gemp-lotr/db/extract-tourney-replays.sql
index a7b6a1229..2a7066783 100644
--- a/gemp-lotr/db/extract-tourney-replays.sql
+++ b/gemp-lotr/db/extract-tourney-replays.sql
@@ -33,7 +33,7 @@
-SET @player = 'sempolPL', @rank=0;
+SET @player = 'basmelis', @rank=0;
SELECT
@player AS player
@@ -42,6 +42,11 @@ SELECT
WHEN winner = @player THEN CONCAT(REPLACE(winner, '_', '%5F'), '$', win_recording_id)
ELSE CONCAT(REPLACE(loser, '_', '%5F'), '$', lose_recording_id)
END, ']', @rank:=@rank+1,'[/url] • ') AS URL
+ ,CONCAT('https://play.lotrtcgpc.net/share/deck?id=',
+ CASE
+ WHEN winner = @player THEN TO_BASE64(CONCAT(winner, '|', winner_deck_name))
+ ELSE TO_BASE64(CONCAT(loser, '|', loser_deck_name))
+ END) AS DeckURL
FROM game_history gh
INNER JOIN player p
ON p.name = @player
diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cards/CardFilter.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cards/CardFilter.js
index 90a234afe..704e654fa 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cards/CardFilter.js
+++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cards/CardFilter.js
@@ -267,6 +267,8 @@ var CardFilter = Class.extend({
this.itemClassLabel = $("");
this.itemClassSelect = $("");
diff --git a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/PossessionClass.java b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/PossessionClass.java
index d94f7de2a..32088a6f6 100644
--- a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/PossessionClass.java
+++ b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/PossessionClass.java
@@ -3,7 +3,7 @@ package com.gempukku.lotro.common;
public enum PossessionClass implements Filterable {
HAND_WEAPON("Hand Weapon"), ARMOR("Armor"), HELM("Helm"), MOUNT("Mount"), RANGED_WEAPON("Ranged Weapon"),
CLOAK("Cloak"), PIPE("Pipe"), SHIELD("Shield"), BRACERS("Bracers"), STAFF("Staff"), RING("Ring"),
- BROOCH("Brooch"), GAUNTLETS("Gauntlets"), BOX("Box"), PALANTIR("Palantir"), PHIAL("Phial"), HORN("Horn"),
+ BROOCH("Brooch"), GAUNTLETS("Gauntlets"), BOX("Box"), PALANTIR("Palantir"), PHIAL("Phial"),
CLASSLESS("Classless"),
//PC Classes
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java
index 6bd9e0933..657896530 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java
@@ -32,7 +32,7 @@ public class SortAndFilterCards {
var textWords = getWords(params.get("gametext"), false);
var keywords = getEnumFilter(Keyword.values(), Keyword.class, params.get("keyword"), true);
- var phases = getEnumFilter(Keyword.values(),Keyword.class, params.get("phase"), true);
+ var phases = getEnumFilter(Timeword.values(),Timeword.class, params.get("phase"), true);
var races = getEnumFilter(Race.values(), Race.class, params.get("race"), true);
var itemClasses = getEnumFilter(PossessionClass.values(), PossessionClass.class, params.get("itemclass"), true);
@@ -56,7 +56,7 @@ public class SortAndFilterCards {
//In this giant loop, we will go through every item handed to us and see if it matches all of the above filter
// conditions. Whenever we fail a filter, we hit "continue" and move on to the next item to check.
- for (T item : items) {
+ cardValidation: for (T item : items) {
String blueprintId = item.getBlueprintId();
String strippedId = BlueprintUtils.stripModifiers(blueprintId);
@@ -174,8 +174,18 @@ public class SortAndFilterCards {
continue;
if(!phases.isEmpty()) {
- if(card.getCardType() != CardType.EVENT || !containsAnyKeywords(card, phases))
- continue;
+ if(card.getCardType() == CardType.EVENT) {
+ if(!containsAnyTimewords(card, phases))
+ continue;
+ }
+ else {
+ for(var timeword : phases) {
+ String timephrase = StringUtils.capitalize(timeword.toString().toLowerCase() + ":");
+ if(!containsAllWords(GameUtils.getFullText(card), Collections.singletonList(timephrase)))
+ continue cardValidation;
+ }
+ }
+
}
if(!itemClasses.isEmpty() && !containsAnyClasses(card, itemClasses))
@@ -345,6 +355,14 @@ public class SortAndFilterCards {
return false;
}
+ private boolean containsAnyTimewords(LotroCardBlueprint blueprint, Set timewords) {
+ for (Timeword timeword : timewords) {
+ if (blueprint.hasTimeword(timeword))
+ return true;
+ }
+ return false;
+ }
+
private boolean containsAnyClasses(LotroCardBlueprint blueprint, Set itemClassFilters) {
if (blueprint == null)
return false;