mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +00:00
Refactor conquest AEther reward structure and filters
This commit is contained in:
@@ -22,7 +22,6 @@ import forge.assets.FSkinImage;
|
|||||||
import forge.card.mana.ManaCost;
|
import forge.card.mana.ManaCost;
|
||||||
import forge.card.mana.ManaCostShard;
|
import forge.card.mana.ManaCostShard;
|
||||||
import forge.error.BugReporter;
|
import forge.error.BugReporter;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|||||||
@@ -16,15 +16,21 @@ import forge.animation.ForgeAnimation;
|
|||||||
import forge.assets.FSkin;
|
import forge.assets.FSkin;
|
||||||
import forge.assets.FSkinColor;
|
import forge.assets.FSkinColor;
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
|
import forge.assets.FSkinProp;
|
||||||
import forge.assets.FSkinTexture;
|
import forge.assets.FSkinTexture;
|
||||||
import forge.assets.TextRenderer;
|
import forge.assets.TextRenderer;
|
||||||
import forge.card.CardRenderer;
|
import forge.card.CardRenderer;
|
||||||
import forge.card.CardZoom;
|
import forge.card.CardZoom;
|
||||||
|
import forge.card.ColorSet;
|
||||||
import forge.card.CardRenderer.CardStackPosition;
|
import forge.card.CardRenderer.CardStackPosition;
|
||||||
|
import forge.card.ColorSetImage;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
|
import forge.planarconquest.ConquestAwardPool;
|
||||||
|
import forge.planarconquest.ConquestCommander;
|
||||||
import forge.planarconquest.ConquestData;
|
import forge.planarconquest.ConquestData;
|
||||||
import forge.planarconquest.ConquestPlane;
|
import forge.planarconquest.ConquestPlane;
|
||||||
|
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||||
import forge.planarconquest.ConquestUtil;
|
import forge.planarconquest.ConquestUtil;
|
||||||
import forge.planarconquest.ConquestUtil.AEtherFilter;
|
import forge.planarconquest.ConquestUtil.AEtherFilter;
|
||||||
import forge.screens.FScreen;
|
import forge.screens.FScreen;
|
||||||
@@ -59,6 +65,7 @@ public class ConquestAEtherScreen extends FScreen {
|
|||||||
|
|
||||||
private PullAnimation activePullAnimation;
|
private PullAnimation activePullAnimation;
|
||||||
private int shardCost;
|
private int shardCost;
|
||||||
|
private ConquestCommander commander;
|
||||||
|
|
||||||
public ConquestAEtherScreen() {
|
public ConquestAEtherScreen() {
|
||||||
super("", ConquestMenu.getMenu());
|
super("", ConquestMenu.getMenu());
|
||||||
@@ -71,6 +78,12 @@ public class ConquestAEtherScreen extends FScreen {
|
|||||||
|
|
||||||
setHeaderCaption(model.getName());
|
setHeaderCaption(model.getName());
|
||||||
|
|
||||||
|
ConquestCommander commander0 = model.getSelectedCommander();
|
||||||
|
if (commander != commander0) {
|
||||||
|
commander = commander0;
|
||||||
|
resetFilters(); //reset filters if commander changed since the last time this screen was opened
|
||||||
|
}
|
||||||
|
|
||||||
pool.clear();
|
pool.clear();
|
||||||
for (PaperCard card : plane.getCardPool().getAllCards()) {
|
for (PaperCard card : plane.getCardPool().getAllCards()) {
|
||||||
if (!model.hasUnlockedCard(card)) {
|
if (!model.hasUnlockedCard(card)) {
|
||||||
@@ -81,6 +94,13 @@ public class ConquestAEtherScreen extends FScreen {
|
|||||||
updateAvailableShards();
|
updateAvailableShards();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void resetFilters() {
|
||||||
|
btnColorFilter.setSelectedOption(ConquestUtil.getColorFilter(commander.getCard().getRules().getColorIdentity()));
|
||||||
|
btnTypeFilter.setSelectedOption(AEtherFilter.CREATURE);
|
||||||
|
btnRarityFilter.setSelectedOption(AEtherFilter.COMMON);
|
||||||
|
btnCMCFilter.setSelectedOption(AEtherFilter.CMC_LOW_MID);
|
||||||
|
}
|
||||||
|
|
||||||
private void updateFilteredPool() {
|
private void updateFilteredPool() {
|
||||||
Predicate<PaperCard> predicate = btnColorFilter.buildFilterPredicate(null);
|
Predicate<PaperCard> predicate = btnColorFilter.buildFilterPredicate(null);
|
||||||
predicate = btnTypeFilter.buildFilterPredicate(predicate);
|
predicate = btnTypeFilter.buildFilterPredicate(predicate);
|
||||||
@@ -102,8 +122,13 @@ public class ConquestAEtherScreen extends FScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateShardCost() {
|
private void updateShardCost() {
|
||||||
shardCost = FModel.getConquest().calculateShardCost(filteredPool, pool.size(),
|
ConquestAwardPool pool = FModel.getConquest().getModel().getCurrentPlane().getAwardPool();
|
||||||
btnColorFilter.selectedOption, btnTypeFilter.selectedOption, btnCMCFilter.selectedOption);
|
if (filteredPool.isEmpty()) {
|
||||||
|
shardCost = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
shardCost = pool.getShardValue(btnRarityFilter.selectedOption.getRarity(), FModel.getConquestPreferences().getPrefInt(CQPref.AETHER_BASE_PULL_COST));
|
||||||
|
}
|
||||||
display.updateMessage();
|
display.updateMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,24 +331,27 @@ public class ConquestAEtherScreen extends FScreen {
|
|||||||
if (selectedOption == selectedOption0) { return; }
|
if (selectedOption == selectedOption0) { return; }
|
||||||
selectedOption = selectedOption0;
|
selectedOption = selectedOption0;
|
||||||
|
|
||||||
if (selectedOption == AEtherFilter.NONE) {
|
FSkinProp skinProp = selectedOption.skinProp;
|
||||||
setIcon(null);
|
if (skinProp != null) {
|
||||||
setText("Filter\n" + caption);
|
setIcon(FSkin.getImages().get(skinProp));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setIcon(FSkin.getImages().get(selectedOption.skinProp));
|
ColorSet color = selectedOption.getColor();
|
||||||
setText("");
|
if (color != null) {
|
||||||
|
setIcon(new ColorSetImage(color));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
System.out.println("No icon for filter " + selectedOption.name());
|
||||||
|
setIcon(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Predicate<PaperCard> buildFilterPredicate(Predicate<PaperCard> predicate) {
|
private Predicate<PaperCard> buildFilterPredicate(Predicate<PaperCard> predicate) {
|
||||||
if (selectedOption != AEtherFilter.NONE) {
|
if (predicate == null) {
|
||||||
if (predicate == null) {
|
return selectedOption.predicate;
|
||||||
return selectedOption.predicate;
|
|
||||||
}
|
|
||||||
return Predicates.and(predicate, selectedOption.predicate);
|
|
||||||
}
|
}
|
||||||
return predicate;
|
return Predicates.and(predicate, selectedOption.predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -52,11 +52,10 @@ public class ConquestPrefsScreen extends FScreen {
|
|||||||
super("Conquest Preferences", ConquestMenu.getMenu());
|
super("Conquest Preferences", ConquestMenu.getMenu());
|
||||||
|
|
||||||
scroller.add(new PrefsHeader("AEther Shards", FSkinImage.AETHER_SHARD, PrefsGroup.BOOSTER));
|
scroller.add(new PrefsHeader("AEther Shards", FSkinImage.AETHER_SHARD, PrefsGroup.BOOSTER));
|
||||||
scroller.add(new PrefsOption("Base Card Value", CQPref.AETHER_BASE_VALUE, PrefsGroup.AETHER));
|
scroller.add(new PrefsOption("Base Duplicate Value", CQPref.AETHER_BASE_DUPLICATE_VALUE, PrefsGroup.AETHER));
|
||||||
scroller.add(new PrefsOption("Markup Percentage", CQPref.AETHER_MARKUP, PrefsGroup.AETHER));
|
scroller.add(new PrefsOption("Base Exile Value", CQPref.AETHER_BASE_EXILE_VALUE, PrefsGroup.AETHER));
|
||||||
scroller.add(new PrefsOption("Color Filter Markup", CQPref.AETHER_COLOR_FILTER_MARKUP, PrefsGroup.AETHER));
|
scroller.add(new PrefsOption("Base Retrieve Cost", CQPref.AETHER_BASE_RETRIEVE_COST, PrefsGroup.AETHER));
|
||||||
scroller.add(new PrefsOption("Type Filter Markup", CQPref.AETHER_TYPE_FILTER_MARKUP, PrefsGroup.AETHER));
|
scroller.add(new PrefsOption("Base Pull Cost", CQPref.AETHER_BASE_PULL_COST, PrefsGroup.AETHER));
|
||||||
scroller.add(new PrefsOption("CMC Filter Markup", CQPref.AETHER_CMC_FILTER_MARKUP, PrefsGroup.AETHER));
|
|
||||||
scroller.add(new PrefsOption("Starting Shards", CQPref.AETHER_START_SHARDS, PrefsGroup.AETHER));
|
scroller.add(new PrefsOption("Starting Shards", CQPref.AETHER_START_SHARDS, PrefsGroup.AETHER));
|
||||||
scroller.add(new PrefsOption("Chaos Wheel Shard Value", CQPref.AETHER_WHEEL_SHARDS, PrefsGroup.AETHER));
|
scroller.add(new PrefsOption("Chaos Wheel Shard Value", CQPref.AETHER_WHEEL_SHARDS, PrefsGroup.AETHER));
|
||||||
|
|
||||||
|
|||||||
@@ -518,6 +518,8 @@ public class FChoiceList<T> extends FList<T> implements ActivateHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
protected class IHasSkinPropRenderer extends DefaultItemRenderer {
|
protected class IHasSkinPropRenderer extends DefaultItemRenderer {
|
||||||
|
private final TextRenderer textRenderer = new TextRenderer(true);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) {
|
public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) {
|
||||||
FSkinProp skinProp = ((IHasSkinProp)value).getSkinProp();
|
FSkinProp skinProp = ((IHasSkinProp)value).getSkinProp();
|
||||||
@@ -531,7 +533,7 @@ public class FChoiceList<T> extends FList<T> implements ActivateHandler {
|
|||||||
x += dx;
|
x += dx;
|
||||||
w -= dx;
|
w -= dx;
|
||||||
}
|
}
|
||||||
super.drawValue(g, value, font, foreColor, pressed, x, y, w, h);
|
textRenderer.drawText(g, value.toString(), font, foreColor, x, y, w, h, y, h, true, HAlignment.LEFT, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -333,6 +333,10 @@ public class FLabel extends FDisplayObject implements IButton {
|
|||||||
else if (iconInBackground || iconScaleAuto) {
|
else if (iconInBackground || iconScaleAuto) {
|
||||||
iconHeight = h * iconScaleFactor;
|
iconHeight = h * iconScaleFactor;
|
||||||
iconWidth = iconHeight * aspectRatio;
|
iconWidth = iconHeight * aspectRatio;
|
||||||
|
if (iconWidth > w && iconInBackground) { //ensure background icon stays with label bounds
|
||||||
|
iconWidth = w;
|
||||||
|
iconHeight = iconWidth / aspectRatio;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float iconOffset = iconWidth + insets.x + getExtraGapBetweenIconAndText();
|
float iconOffset = iconWidth + insets.x + getExtraGapBetweenIconAndText();
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package forge.planarconquest;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import forge.card.CardRarity;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.planarconquest.ConquestPreferences.CQPref;
|
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||||
@@ -10,7 +10,6 @@ import forge.util.Aggregates;
|
|||||||
|
|
||||||
public class ConquestAwardPool {
|
public class ConquestAwardPool {
|
||||||
private final BoosterPool commons, uncommons, rares, mythics;
|
private final BoosterPool commons, uncommons, rares, mythics;
|
||||||
private final int commonValue, uncommonValue, rareValue, mythicValue;
|
|
||||||
|
|
||||||
public ConquestAwardPool(Iterable<PaperCard> cards) {
|
public ConquestAwardPool(Iterable<PaperCard> cards) {
|
||||||
ConquestPreferences prefs = FModel.getConquestPreferences();
|
ConquestPreferences prefs = FModel.getConquestPreferences();
|
||||||
@@ -47,24 +46,24 @@ public class ConquestAwardPool {
|
|||||||
float rareOdds = rares.getOdds(raresPerBooster);
|
float rareOdds = rares.getOdds(raresPerBooster);
|
||||||
float mythicOdds = mythics.getOdds((float)raresPerBooster / (float)prefs.getPrefInt(CQPref.BOOSTERS_PER_MYTHIC));
|
float mythicOdds = mythics.getOdds((float)raresPerBooster / (float)prefs.getPrefInt(CQPref.BOOSTERS_PER_MYTHIC));
|
||||||
|
|
||||||
//determine value of each rarity based on the base value of a common
|
//determine multipliers for each rarity based on ratio of odds
|
||||||
commonValue = prefs.getPrefInt(CQPref.AETHER_BASE_VALUE);
|
commons.multiplier = 1;
|
||||||
uncommonValue = Math.round(commonValue / (uncommonOdds / commonOdds));
|
uncommons.multiplier = commonOdds / uncommonOdds;
|
||||||
rareValue = Math.round(commonValue / (rareOdds / commonOdds));
|
rares.multiplier = commonOdds / rareOdds;
|
||||||
mythicValue = mythics.isEmpty() ? 0 : Math.round(commonValue / (mythicOdds / commonOdds));
|
mythics.multiplier = mythics.isEmpty() ? 0 : commonOdds / mythicOdds;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getShardValue(PaperCard card) {
|
public int getShardValue(CardRarity rarity, int baseValue) {
|
||||||
switch (card.getRarity()) {
|
switch (rarity) {
|
||||||
case Common:
|
case Common:
|
||||||
return commonValue;
|
return baseValue;
|
||||||
case Uncommon:
|
case Uncommon:
|
||||||
return uncommonValue;
|
return Math.round(baseValue * uncommons.multiplier);
|
||||||
case Rare:
|
case Rare:
|
||||||
case Special:
|
case Special:
|
||||||
return rareValue;
|
return Math.round(baseValue * rares.multiplier);
|
||||||
case MythicRare:
|
case MythicRare:
|
||||||
return mythicValue;
|
return Math.round(baseValue * mythics.multiplier);
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -85,6 +84,7 @@ public class ConquestAwardPool {
|
|||||||
|
|
||||||
public class BoosterPool {
|
public class BoosterPool {
|
||||||
private final List<PaperCard> cards = new ArrayList<PaperCard>();
|
private final List<PaperCard> cards = new ArrayList<PaperCard>();
|
||||||
|
private float multiplier;
|
||||||
|
|
||||||
private BoosterPool() {
|
private BoosterPool() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ import forge.item.PaperCard;
|
|||||||
import forge.match.HostedMatch;
|
import forge.match.HostedMatch;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.planarconquest.ConquestPreferences.CQPref;
|
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||||
import forge.planarconquest.ConquestUtil.AEtherFilter;
|
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.player.LobbyPlayerHuman;
|
import forge.player.LobbyPlayerHuman;
|
||||||
import forge.properties.ForgeConstants;
|
import forge.properties.ForgeConstants;
|
||||||
@@ -221,13 +220,14 @@ public class ConquestController {
|
|||||||
//also build list of all rewards including replacement shards for each duplicate card
|
//also build list of all rewards including replacement shards for each duplicate card
|
||||||
//build this list in reverse order so commons appear first
|
//build this list in reverse order so commons appear first
|
||||||
int shards = 0;
|
int shards = 0;
|
||||||
|
int baseDuplicateValue = prefs.getPrefInt(CQPref.AETHER_BASE_DUPLICATE_VALUE);
|
||||||
final List<ConquestReward> allRewards = new ArrayList<ConquestReward>();
|
final List<ConquestReward> allRewards = new ArrayList<ConquestReward>();
|
||||||
for (int i = rewards.size() - 1; i >= 0; i--) {
|
for (int i = rewards.size() - 1; i >= 0; i--) {
|
||||||
int replacementShards = 0;
|
int replacementShards = 0;
|
||||||
PaperCard card = rewards.get(i);
|
PaperCard card = rewards.get(i);
|
||||||
if (model.hasUnlockedCard(card)) {
|
if (model.hasUnlockedCard(card)) {
|
||||||
rewards.remove(i);
|
rewards.remove(i);
|
||||||
replacementShards = pool.getShardValue(card);
|
replacementShards = pool.getShardValue(card.getRarity(), baseDuplicateValue);
|
||||||
shards += replacementShards;
|
shards += replacementShards;
|
||||||
}
|
}
|
||||||
allRewards.add(new ConquestReward(card, replacementShards));
|
allRewards.add(new ConquestReward(card, replacementShards));
|
||||||
@@ -237,33 +237,4 @@ public class ConquestController {
|
|||||||
model.rewardAEtherShards(shards);
|
model.rewardAEtherShards(shards);
|
||||||
return allRewards;
|
return allRewards;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int calculateShardCost(Set<PaperCard> filteredCards, int unfilteredCount, AEtherFilter colorFilter, AEtherFilter typeFilter, AEtherFilter cmcFilter) {
|
|
||||||
if (filteredCards.isEmpty()) { return 0; }
|
|
||||||
|
|
||||||
ConquestAwardPool pool = FModel.getConquest().getModel().getCurrentPlane().getAwardPool();
|
|
||||||
|
|
||||||
//determine average value of filtered cards
|
|
||||||
int totalValue = 0;
|
|
||||||
for (PaperCard card : filteredCards) {
|
|
||||||
totalValue += pool.getShardValue(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConquestPreferences prefs = FModel.getConquestPreferences();
|
|
||||||
float averageValue = totalValue / filteredCards.size();
|
|
||||||
float multiplier = 1f + (float)prefs.getPrefInt(CQPref.AETHER_MARKUP) / 100f;
|
|
||||||
|
|
||||||
//increase multipliers based on applied filters
|
|
||||||
if (colorFilter != AEtherFilter.NONE) {
|
|
||||||
multiplier += (float)prefs.getPrefInt(CQPref.AETHER_COLOR_FILTER_MARKUP) / 100f;
|
|
||||||
}
|
|
||||||
if (typeFilter != AEtherFilter.NONE) {
|
|
||||||
multiplier += (float)prefs.getPrefInt(CQPref.AETHER_TYPE_FILTER_MARKUP) / 100f;
|
|
||||||
}
|
|
||||||
if (cmcFilter != AEtherFilter.NONE) {
|
|
||||||
multiplier += (float)prefs.getPrefInt(CQPref.AETHER_CMC_FILTER_MARKUP) / 100f;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Math.round(averageValue * multiplier);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,11 +29,10 @@ public class ConquestPreferences extends PreferencesStore<ConquestPreferences.CQ
|
|||||||
public static enum CQPref {
|
public static enum CQPref {
|
||||||
CURRENT_CONQUEST("DEFAULT"),
|
CURRENT_CONQUEST("DEFAULT"),
|
||||||
|
|
||||||
AETHER_BASE_VALUE("100"),
|
AETHER_BASE_DUPLICATE_VALUE("100"),
|
||||||
AETHER_MARKUP("40"),
|
AETHER_BASE_EXILE_VALUE("75"),
|
||||||
AETHER_COLOR_FILTER_MARKUP("20"),
|
AETHER_BASE_RETRIEVE_COST("150"),
|
||||||
AETHER_TYPE_FILTER_MARKUP("20"),
|
AETHER_BASE_PULL_COST("200"),
|
||||||
AETHER_CMC_FILTER_MARKUP("20"),
|
|
||||||
AETHER_START_SHARDS("3000"),
|
AETHER_START_SHARDS("3000"),
|
||||||
AETHER_WHEEL_SHARDS("1000"),
|
AETHER_WHEEL_SHARDS("1000"),
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import forge.card.CardRarity;
|
|||||||
import forge.card.CardRules;
|
import forge.card.CardRules;
|
||||||
import forge.card.CardType;
|
import forge.card.CardType;
|
||||||
import forge.card.CardType.CoreType;
|
import forge.card.CardType.CoreType;
|
||||||
|
import forge.card.mana.ManaCostShard;
|
||||||
import forge.card.ColorSet;
|
import forge.card.ColorSet;
|
||||||
import forge.card.MagicColor;
|
import forge.card.MagicColor;
|
||||||
import forge.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
@@ -147,19 +148,39 @@ public class ConquestUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static enum AEtherFilter implements IHasSkinProp {
|
public static enum AEtherFilter implements IHasSkinProp {
|
||||||
NONE (null, null, "(None)"),
|
W (null, new ColorFilter(MagicColor.WHITE), "Playable in {W}"),
|
||||||
|
U (null, new ColorFilter(MagicColor.BLUE), "Playable in {U}"),
|
||||||
|
B (null, new ColorFilter(MagicColor.BLACK), "Playable in {B}"),
|
||||||
|
R (null, new ColorFilter(MagicColor.RED), "Playable in {R}"),
|
||||||
|
G (null, new ColorFilter(MagicColor.GREEN), "Playable in {G}"),
|
||||||
|
|
||||||
WHITE (FSkinProp.IMG_MANA_W, new ColorFilter(MagicColor.WHITE), "White"),
|
WU (null, new ColorFilter(MagicColor.WHITE | MagicColor.BLUE), "Playable in {W}{U}"),
|
||||||
BLUE (FSkinProp.IMG_MANA_U, new ColorFilter(MagicColor.BLUE), "Blue"),
|
WB (null, new ColorFilter(MagicColor.WHITE | MagicColor.BLACK), "Playable in {W}{B}"),
|
||||||
BLACK (FSkinProp.IMG_MANA_B, new ColorFilter(MagicColor.BLACK), "Black"),
|
UB (null, new ColorFilter(MagicColor.BLUE | MagicColor.BLACK), "Playable in {U}{B}"),
|
||||||
RED (FSkinProp.IMG_MANA_R, new ColorFilter(MagicColor.RED), "Red"),
|
UR (null, new ColorFilter(MagicColor.BLUE | MagicColor.RED), "Playable in {U}{R}"),
|
||||||
GREEN (FSkinProp.IMG_MANA_G, new ColorFilter(MagicColor.GREEN), "Green"),
|
BR (null, new ColorFilter(MagicColor.BLACK | MagicColor.RED), "Playable in {B}{R}"),
|
||||||
COLORLESS (FSkinProp.IMG_MANA_COLORLESS, new ColorFilter(MagicColor.COLORLESS), "Colorless"),
|
BG (null, new ColorFilter(MagicColor.BLACK | MagicColor.GREEN), "Playable in {B}{G}"),
|
||||||
|
RG (null, new ColorFilter(MagicColor.RED | MagicColor.GREEN), "Playable in {R}{G}"),
|
||||||
|
RW (null, new ColorFilter(MagicColor.RED | MagicColor.WHITE), "Playable in {R}{W}"),
|
||||||
|
GW (null, new ColorFilter(MagicColor.GREEN | MagicColor.WHITE), "Playable in {G}{W}"),
|
||||||
|
GU (null, new ColorFilter(MagicColor.GREEN | MagicColor.BLUE), "Playable in {G}{U}"),
|
||||||
|
|
||||||
CREATURE (FSkinProp.IMG_CREATURE, new TypeFilter(EnumSet.of(CoreType.Creature)), "Creature"),
|
WUB (null, new ColorFilter(MagicColor.WHITE | MagicColor.BLUE | MagicColor.BLACK), "Playable in {W}{U}{B}"),
|
||||||
ARTIFACT_ENCHANTMENT (FSkinProp.IMG_ENCHANTMENT, new TypeFilter(EnumSet.of(CoreType.Artifact, CoreType.Enchantment, CoreType.Planeswalker)), "Artifact, Enchantment, or Planeswalker"),
|
WBG (null, new ColorFilter(MagicColor.WHITE | MagicColor.BLACK | MagicColor.GREEN), "Playable in {W}{B}{G}"),
|
||||||
INSTANT_SORCERY (FSkinProp.IMG_SORCERY, new TypeFilter(EnumSet.of(CoreType.Instant, CoreType.Sorcery)), "Instant or Sorcery"),
|
UBR (null, new ColorFilter(MagicColor.BLUE | MagicColor.BLACK | MagicColor.RED), "Playable in {U}{B}{R}"),
|
||||||
LAND (FSkinProp.IMG_LAND, new TypeFilter(EnumSet.of(CoreType.Land)), "Land"),
|
URW (null, new ColorFilter(MagicColor.BLUE | MagicColor.RED | MagicColor.WHITE), "Playable in {U}{R}{W}"),
|
||||||
|
BRG (null, new ColorFilter(MagicColor.BLACK | MagicColor.RED | MagicColor.GREEN), "Playable in {B}{R}{G}"),
|
||||||
|
BGU (null, new ColorFilter(MagicColor.BLACK | MagicColor.GREEN | MagicColor.BLUE), "Playable in {B}{G}{U}"),
|
||||||
|
RGW (null, new ColorFilter(MagicColor.RED | MagicColor.GREEN | MagicColor.WHITE), "Playable in {R}{G}{W}"),
|
||||||
|
RWB (null, new ColorFilter(MagicColor.RED | MagicColor.WHITE | MagicColor.BLACK), "Playable in {R}{W}{B}"),
|
||||||
|
GWU (null, new ColorFilter(MagicColor.GREEN | MagicColor.WHITE | MagicColor.BLUE), "Playable in {G}{W}{U}"),
|
||||||
|
GUR (null, new ColorFilter(MagicColor.GREEN | MagicColor.BLUE | MagicColor.RED), "Playable in {G}{U}{R}"),
|
||||||
|
|
||||||
|
WUBRG (null, new ColorFilter(MagicColor.ALL_COLORS), "Playable in {W}{U}{B}{R}{G}"),
|
||||||
|
|
||||||
|
CREATURE (FSkinProp.IMG_CREATURE, new TypeFilter(EnumSet.of(CoreType.Creature)), "Creature"),
|
||||||
|
NONCREATURE_PERMANENT (FSkinProp.IMG_ENCHANTMENT, new TypeFilter(EnumSet.of(CoreType.Artifact, CoreType.Enchantment, CoreType.Planeswalker, CoreType.Land)), "Noncreature Permanent"),
|
||||||
|
INSTANT_SORCERY (FSkinProp.IMG_SORCERY, new TypeFilter(EnumSet.of(CoreType.Instant, CoreType.Sorcery)), "Instant or Sorcery"),
|
||||||
|
|
||||||
COMMON (FSkinProp.IMG_PW_BADGE_COMMON, new RarityFilter(CardRarity.Common), "Common"),
|
COMMON (FSkinProp.IMG_PW_BADGE_COMMON, new RarityFilter(CardRarity.Common), "Common"),
|
||||||
UNCOMMON (FSkinProp.IMG_PW_BADGE_UNCOMMON, new RarityFilter(CardRarity.Uncommon), "Uncommon"),
|
UNCOMMON (FSkinProp.IMG_PW_BADGE_UNCOMMON, new RarityFilter(CardRarity.Uncommon), "Uncommon"),
|
||||||
@@ -186,59 +207,103 @@ public class ConquestUtil {
|
|||||||
return skinProp;
|
return skinProp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ColorSet getColor() {
|
||||||
|
if (predicate instanceof ColorFilter) {
|
||||||
|
return ((ColorFilter)predicate).color;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EnumSet<CoreType> getTypes() {
|
||||||
|
if (predicate instanceof ColorFilter) {
|
||||||
|
return ((TypeFilter)predicate).types;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CardRarity getRarity() {
|
||||||
|
if (predicate instanceof RarityFilter) {
|
||||||
|
return ((RarityFilter)predicate).rarity;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return caption;
|
return caption;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static AEtherFilter getColorFilter(ColorSet color) {
|
||||||
|
String name = "";
|
||||||
|
for (ManaCostShard s : color.getOrderedShards()) {
|
||||||
|
name += s.toString();
|
||||||
|
}
|
||||||
|
name = name.replaceAll("[{}]", ""); //remove all brackets
|
||||||
|
try {
|
||||||
|
return AEtherFilter.valueOf(name);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
System.err.println("No color filter with name " + name);
|
||||||
|
return AEtherFilter.WUBRG; //return 5-color filter as fallback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static final AEtherFilter[] COLOR_FILTERS = new AEtherFilter[] {
|
public static final AEtherFilter[] COLOR_FILTERS = new AEtherFilter[] {
|
||||||
AEtherFilter.NONE,
|
AEtherFilter.W,
|
||||||
AEtherFilter.WHITE,
|
AEtherFilter.U,
|
||||||
AEtherFilter.BLUE,
|
AEtherFilter.B,
|
||||||
AEtherFilter.BLACK,
|
AEtherFilter.R,
|
||||||
AEtherFilter.RED,
|
AEtherFilter.G,
|
||||||
AEtherFilter.GREEN,
|
AEtherFilter.WU,
|
||||||
AEtherFilter.COLORLESS };
|
AEtherFilter.WB,
|
||||||
|
AEtherFilter.UB,
|
||||||
|
AEtherFilter.UR,
|
||||||
|
AEtherFilter.BR,
|
||||||
|
AEtherFilter.BG,
|
||||||
|
AEtherFilter.RG,
|
||||||
|
AEtherFilter.RW,
|
||||||
|
AEtherFilter.GW,
|
||||||
|
AEtherFilter.GU,
|
||||||
|
AEtherFilter.WUB,
|
||||||
|
AEtherFilter.WBG,
|
||||||
|
AEtherFilter.UBR,
|
||||||
|
AEtherFilter.URW,
|
||||||
|
AEtherFilter.BRG,
|
||||||
|
AEtherFilter.BGU,
|
||||||
|
AEtherFilter.RGW,
|
||||||
|
AEtherFilter.RWB,
|
||||||
|
AEtherFilter.GWU,
|
||||||
|
AEtherFilter.GUR,
|
||||||
|
AEtherFilter.WUBRG };
|
||||||
|
|
||||||
public static final AEtherFilter[] TYPE_FILTERS = new AEtherFilter[] {
|
public static final AEtherFilter[] TYPE_FILTERS = new AEtherFilter[] {
|
||||||
AEtherFilter.NONE,
|
|
||||||
AEtherFilter.CREATURE,
|
AEtherFilter.CREATURE,
|
||||||
AEtherFilter.ARTIFACT_ENCHANTMENT,
|
AEtherFilter.NONCREATURE_PERMANENT,
|
||||||
AEtherFilter.INSTANT_SORCERY,
|
AEtherFilter.INSTANT_SORCERY };
|
||||||
AEtherFilter.LAND };
|
|
||||||
|
|
||||||
public static final AEtherFilter[] RARITY_FILTERS = new AEtherFilter[] {
|
public static final AEtherFilter[] RARITY_FILTERS = new AEtherFilter[] {
|
||||||
AEtherFilter.NONE,
|
|
||||||
AEtherFilter.COMMON,
|
AEtherFilter.COMMON,
|
||||||
AEtherFilter.UNCOMMON,
|
AEtherFilter.UNCOMMON,
|
||||||
AEtherFilter.RARE,
|
AEtherFilter.RARE,
|
||||||
AEtherFilter.MYTHIC };
|
AEtherFilter.MYTHIC };
|
||||||
|
|
||||||
public static final AEtherFilter[] CMC_FILTERS = new AEtherFilter[] {
|
public static final AEtherFilter[] CMC_FILTERS = new AEtherFilter[] {
|
||||||
AEtherFilter.NONE,
|
|
||||||
AEtherFilter.CMC_LOW,
|
AEtherFilter.CMC_LOW,
|
||||||
AEtherFilter.CMC_LOW_MID,
|
AEtherFilter.CMC_LOW_MID,
|
||||||
AEtherFilter.CMC_MID_HIGH,
|
AEtherFilter.CMC_MID_HIGH,
|
||||||
AEtherFilter.CMC_HIGH };
|
AEtherFilter.CMC_HIGH };
|
||||||
|
|
||||||
private static class ColorFilter implements Predicate<PaperCard> {
|
private static class ColorFilter implements Predicate<PaperCard> {
|
||||||
private final byte color;
|
private final ColorSet color;
|
||||||
|
|
||||||
private ColorFilter(byte color0) {
|
private ColorFilter(int colorMask0) {
|
||||||
color = color0;
|
color = ColorSet.fromMask(colorMask0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(PaperCard card) {
|
public boolean apply(PaperCard card) {
|
||||||
//use color identity for lands and color for other cards
|
return card.getRules().getColorIdentity().hasNoColorsExcept(color);
|
||||||
CardRules cardRules = card.getRules();
|
|
||||||
ColorSet cardColor = cardRules.getType().isLand() ? cardRules.getColorIdentity() : cardRules.getColor();
|
|
||||||
|
|
||||||
if (color == MagicColor.COLORLESS) {
|
|
||||||
return cardColor.isColorless();
|
|
||||||
}
|
|
||||||
return cardColor.hasAllColors(color);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user