diff --git a/Mage.Client/src/main/resources/card/icons/prepared/hexagon-fill.svg b/Mage.Client/src/main/resources/card/icons/prepared/hexagon-fill.svg
new file mode 100644
index 0000000000..2f310a22d6
--- /dev/null
+++ b/Mage.Client/src/main/resources/card/icons/prepared/hexagon-fill.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/Mage.Common/src/main/java/mage/view/CardView.java b/Mage.Common/src/main/java/mage/view/CardView.java
index 79afbb0a8a..c76b68a24d 100644
--- a/Mage.Common/src/main/java/mage/view/CardView.java
+++ b/Mage.Common/src/main/java/mage/view/CardView.java
@@ -416,7 +416,7 @@ public class CardView extends SimpleCardView {
// card icons for permanents on battlefield
permanent.getAbilities(game).forEach(ability -> {
- this.cardIcons.addAll(ability.getIcons());
+ this.cardIcons.addAll(ability.getIcons(game));
});
} else {
if (card.isCopy()) {
diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java
index 610d878513..c4f6cda350 100644
--- a/Mage/src/main/java/mage/abilities/Ability.java
+++ b/Mage/src/main/java/mage/abilities/Ability.java
@@ -552,8 +552,21 @@ public interface Ability extends Controllable, Serializable {
Ability addHint(Hint hint);
+ /**
+ * For abilities with static icons
+ *
+ * @return
+ */
List getIcons();
+ /**
+ * For abilities with dynamic icons
+ *
+ * @param game can be null for static calls like copies
+ * @return
+ */
+ List getIcons(Game game);
+
Ability addIcon(CardIcon cardIcon);
Ability addCustomOutcome(Outcome customOutcome);
diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java
index 1fc78638a4..a354670438 100644
--- a/Mage/src/main/java/mage/abilities/AbilityImpl.java
+++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java
@@ -1342,7 +1342,12 @@ public abstract class AbilityImpl implements Ability {
}
@Override
- public List getIcons() {
+ final public List getIcons() {
+ return getIcons(null);
+ }
+
+ @Override
+ public List getIcons(Game game) {
return this.icons;
}
diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java b/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java
index 89318cb15a..4ea64fc84a 100644
--- a/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java
+++ b/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java
@@ -1,9 +1,11 @@
package mage.abilities.icon;
+import java.io.Serializable;
+
/**
* @author JayDi85
*/
-public class CardIconImpl implements CardIcon {
+public class CardIconImpl implements CardIcon, Serializable {
private final CardIconType cardIconType;
private final String text;
diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconType.java b/Mage/src/main/java/mage/abilities/icon/CardIconType.java
index c4e8c1111a..42e3b0160e 100644
--- a/Mage/src/main/java/mage/abilities/icon/CardIconType.java
+++ b/Mage/src/main/java/mage/abilities/icon/CardIconType.java
@@ -29,6 +29,7 @@ public enum CardIconType {
ABILITY_INFECT("prepared/flask.svg", CardIconCategory.ABILITY, 100),
ABILITY_INDESTRUCTIBLE("prepared/ankh.svg", CardIconCategory.ABILITY, 100),
ABILITY_VIGILANCE("prepared/eye.svg", CardIconCategory.ABILITY, 100),
+ ABILITY_CLASS_LEVEL("prepared/hexagon-fill.svg", CardIconCategory.ABILITY, 100),
//
SYSTEM_COMBINED("prepared/square-fill.svg", CardIconCategory.SYSTEM, 1000), // inner usage, must use last order
SYSTEM_DEBUG("prepared/link.svg", CardIconCategory.SYSTEM, 1000); // used for test render dialog
diff --git a/Mage/src/main/java/mage/abilities/keyword/ClassReminderAbility.java b/Mage/src/main/java/mage/abilities/keyword/ClassReminderAbility.java
index b9964bf564..b5fd4b85b9 100644
--- a/Mage/src/main/java/mage/abilities/keyword/ClassReminderAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/ClassReminderAbility.java
@@ -2,7 +2,15 @@ package mage.abilities.keyword;
import mage.abilities.StaticAbility;
import mage.abilities.hint.common.ClassLevelHint;
+import mage.abilities.icon.CardIcon;
+import mage.abilities.icon.CardIconImpl;
+import mage.abilities.icon.CardIconType;
import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* @author TheElk801
@@ -27,4 +35,27 @@ public class ClassReminderAbility extends StaticAbility {
public String getRule() {
return "(Gain the next level as a sorcery to add its ability.)";
}
+
+ @Override
+ public List getIcons(Game game) {
+ if (game == null) {
+ return this.icons;
+ }
+
+ // dynamic GUI icon with current level
+ List res = new ArrayList<>();
+ Permanent permanent = this.getSourcePermanentOrLKI(game);
+ if (permanent == null) {
+ return res;
+ }
+
+ CardIcon levelIcon = new CardIconImpl(
+ CardIconType.ABILITY_CLASS_LEVEL,
+ "Current class level: " + permanent.getClassLevel(),
+ String.valueOf(permanent.getClassLevel())
+ );
+ res.add(levelIcon);
+
+ return res;
+ }
}
diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java
index 61a3969b13..3a6585c0bd 100644
--- a/Mage/src/main/java/mage/game/stack/StackAbility.java
+++ b/Mage/src/main/java/mage/game/stack/StackAbility.java
@@ -692,6 +692,11 @@ public class StackAbility extends StackObjectImpl implements Ability {
return this.ability.getIcons();
}
+ @Override
+ public List getIcons(Game game) {
+ return this.ability.getIcons(game);
+ }
+
@Override
public Ability addIcon(CardIcon cardIcon) {
throw new IllegalArgumentException("Stack ability is not supports icon adding");