diff --git a/forge-core/src/main/java/forge/token/TokenDb.java b/forge-core/src/main/java/forge/token/TokenDb.java index 7350313806f..032d3241892 100644 --- a/forge-core/src/main/java/forge/token/TokenDb.java +++ b/forge-core/src/main/java/forge/token/TokenDb.java @@ -39,6 +39,18 @@ public class TokenDb implements ITokenDatabase { return getToken(tokenName, CardEdition.UNKNOWN.getName()); } + public void preloadTokens() { + for(CardEdition edition : this.editions) { + for (String name : edition.getTokens().keySet()) { + try { + getToken(name, edition.getCode()); + } catch(Exception e) { + System.out.println(name + "_" + edition.getCode() + " defined in Edition file, but not defined as a token script."); + } + } + } + } + @Override public PaperToken getToken(String tokenName, String edition) { String fullName = String.format("%s_%s", tokenName, edition.toLowerCase()); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/TokenManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/TokenManager.java index 8dc1d15277c..7ce3c6272c9 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/TokenManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/TokenManager.java @@ -2,6 +2,7 @@ package forge.itemmanager; import forge.item.PaperToken; import forge.itemmanager.filters.ItemFilter; +import forge.itemmanager.filters.TokenSearchFilter; import forge.screens.match.controllers.CDetailPicture; import javax.swing.*; @@ -18,7 +19,11 @@ public class TokenManager extends ItemManager { @Override protected ItemFilter createSearchFilter() { - return null; + return createSearchFilter(this); + } + + public static ItemFilter createSearchFilter(final ItemManager itemManager) { + return new TokenSearchFilter(itemManager); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java new file mode 100644 index 00000000000..d7f0b14170d --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java @@ -0,0 +1,124 @@ +package forge.itemmanager.filters; + +import com.google.common.base.Predicate; +import forge.UiCommand; +import forge.item.InventoryItem; +import forge.item.PaperToken; +import forge.itemmanager.ItemManager; +import forge.itemmanager.SFilterUtil; +import forge.toolbox.FComboBoxWrapper; +import forge.toolbox.FLabel; +import forge.toolbox.FTextField; +import forge.toolbox.LayoutHelper; + +import javax.swing.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + + +public class TokenSearchFilter extends TextSearchFilter { + private FComboBoxWrapper cbSearchMode; + private FLabel btnName, btnType, btnText, btnCost; + + public TokenSearchFilter(ItemManager itemManager0) { + super(itemManager0); + } + + @Override + public ItemFilter createCopy() { + TokenSearchFilter copy = new TokenSearchFilter(itemManager); + copy.getWidget(); //initialize widget + copy.txtSearch.setText(this.txtSearch.getText()); + copy.cbSearchMode.setSelectedIndex(this.cbSearchMode.getSelectedIndex()); + copy.btnName.setSelected(this.btnName.isSelected()); + copy.btnType.setSelected(this.btnType.isSelected()); + copy.btnText.setSelected(this.btnText.isSelected()); + copy.btnCost.setSelected(this.btnCost.isSelected()); + return copy; + } + + @Override + public void reset() { + super.reset(); + this.cbSearchMode.setSelectedIndex(0); + this.btnName.setSelected(true); + this.btnType.setSelected(true); + this.btnText.setSelected(true); + this.btnCost.setSelected(false); + } + + @Override + protected final void buildWidget(JPanel widget) { + super.buildWidget(widget); + + cbSearchMode = new FComboBoxWrapper(); + cbSearchMode.addItem("in"); + cbSearchMode.addItem("not in"); + cbSearchMode.addTo(widget); + cbSearchMode.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent arg0) { + if (!txtSearch.isEmpty()) { + applyChange(); + } + } + }); + + btnName = addButton(widget, "Name"); + btnType = addButton(widget, "Type"); + btnText = addButton(widget, "Text"); + btnCost = addButton(widget, "Cost"); + + btnCost.setSelected(false); + + } + + @Override + protected void doWidgetLayout(LayoutHelper helper) { + final int comboBoxWidth = 61; + final int buttonWidth = 51; + + helper.fillLine(txtSearch, FTextField.HEIGHT, comboBoxWidth + buttonWidth * 4 + 16); //leave space for combo box and buttons + helper.include(cbSearchMode.getComponent(), comboBoxWidth, FTextField.HEIGHT); + helper.include(btnName, buttonWidth, FTextField.HEIGHT); + helper.include(btnType, buttonWidth, FTextField.HEIGHT); + helper.include(btnText, buttonWidth, FTextField.HEIGHT); + helper.include(btnCost, buttonWidth, FTextField.HEIGHT); + } + + @SuppressWarnings("serial") + private FLabel addButton(JPanel widget, String text) { + FLabel button = new FLabel.Builder().text(text).hoverable().selectable().selected().build(); + + button.setCommand(new UiCommand() { + @Override + public void run() { + applyChange(); + } + }); + + widget.add(button); + return button; + } + + @Override + protected Predicate buildPredicate() { + // Don't filter anything out for now. + return new Predicate() { + @Override + public boolean apply(PaperToken paperToken) { + return true; + } + }; + } + + @Override + protected boolean showUnsupportedItem(U item) { + //fallback to regular item text filter if item not PaperCard + boolean result = btnName.isSelected() && SFilterUtil.buildItemTextFilter(txtSearch.getText()).apply(item); + if (cbSearchMode.getSelectedIndex() != 0) { //invert result if needed + result = !result; + } + return result; + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java index e7424d9c29c..29bff60b75c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java @@ -20,7 +20,7 @@ public class CEditorTokenViewer extends ACEditorBase { private DragCell deckGenParent = null; private DragCell probsParent = null; - private final List fullCatalogCards = FModel.getMagicDb().getAllTokens().getAllTokens(); + private List fullCatalogCards; // remember changed gui elements private String CCTabLabel = new String(); @@ -38,6 +38,9 @@ public class CEditorTokenViewer extends ACEditorBase { public CEditorTokenViewer(final CDetailPicture cDetailPicture) { super(FScreen.TOKEN_VIEWER, cDetailPicture); + FModel.getMagicDb().getAllTokens().preloadTokens(); + fullCatalogCards = FModel.getMagicDb().getAllTokens().getAllTokens(); + final TokenManager catalogManager = new TokenManager(getCDetailPicture(), false); final TokenManager deckManager = new TokenManager(cDetailPicture, false); catalogManager.setCaption("All Tokens"); @@ -102,8 +105,8 @@ public class CEditorTokenViewer extends ACEditorBase { VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText("All tokens"); this.getBtnAdd().setVisible(false); + this.getBtnAdd4().setVisible(false); this.getBtnRemove().setVisible(false); - this.getBtnAddBasicLands().setVisible(false); VProbabilities.SINGLETON_INSTANCE.getTabLabel().setVisible(false); diff --git a/forge-gui/res/editions/Champions of Kamigawa.txt b/forge-gui/res/editions/Champions of Kamigawa.txt index 90865d9b301..4445324f932 100644 --- a/forge-gui/res/editions/Champions of Kamigawa.txt +++ b/forge-gui/res/editions/Champions of Kamigawa.txt @@ -322,6 +322,6 @@ FoilAlwaysInCommonSlot=False c_1_1_spirit u_5_5_dragon_spirit_flying u_1_1_illusion_flying -b_x_x_rat +b_1_1_rat g_x_x_elemental g_1_1_snake \ No newline at end of file diff --git a/forge-gui/res/editions/Commander 2013.txt b/forge-gui/res/editions/Commander 2013.txt index 27d1bb8f5a2..01367014aac 100644 --- a/forge-gui/res/editions/Commander 2013.txt +++ b/forge-gui/res/editions/Commander 2013.txt @@ -388,5 +388,5 @@ g_0_1_plant g_1_1_saproling gu_2_2_drake_flying br_3_1_graveborn_haste -c_2_2_a_assembly-worker +c_2_2_a_assembly_worker c_1_1_a_myr \ No newline at end of file diff --git a/forge-gui/res/editions/Commander 2014.txt b/forge-gui/res/editions/Commander 2014.txt index 2a3a1debdad..504ab1e2ba7 100644 --- a/forge-gui/res/editions/Commander 2014.txt +++ b/forge-gui/res/editions/Commander 2014.txt @@ -346,7 +346,6 @@ Type=Other 337 L Forest [tokens] -herald_of_the_host stoneforged_blade tuktuk_the_returned w_4_4_angel_flying diff --git a/forge-gui/res/editions/Commander 2015.txt b/forge-gui/res/editions/Commander 2015.txt index bc7b8804b89..24e19afa194 100644 --- a/forge-gui/res/editions/Commander 2015.txt +++ b/forge-gui/res/editions/Commander 2015.txt @@ -351,13 +351,8 @@ Type=Other 340 L Forest [tokens] -banshee_of_the_dread_choir -blade_of_selves -broodbirth_viper -caller_of_the_pack gold lightning_rager -warchief_giant c_1_1_shapeshifter_changeling w_4_4_angel_flying w_2_2_cat diff --git a/forge-gui/res/editions/Commander 2017.txt b/forge-gui/res/editions/Commander 2017.txt index 6ad1828b768..1de50d2c678 100644 --- a/forge-gui/res/editions/Commander 2017.txt +++ b/forge-gui/res/editions/Commander 2017.txt @@ -318,7 +318,6 @@ Type=Other 309 L Forest [tokens] -bloodforged_battle-axe gold c_0_1_eldrazi_spawn_sac w_2_2_cat diff --git a/forge-gui/res/editions/Commander Anthology Vol. II.txt b/forge-gui/res/editions/Commander Anthology Vol. II.txt index cf8a9cc24c7..c9e1154c091 100644 --- a/forge-gui/res/editions/Commander Anthology Vol. II.txt +++ b/forge-gui/res/editions/Commander Anthology Vol. II.txt @@ -319,10 +319,7 @@ Type=Other 312 L Forest [tokens] -herald_of_the_host -lightning_rager tuktuk_the_returned -warchief_giant c_1_1_shapeshifter_changeling w_1_1_bird_flying w_0_1_goat diff --git a/forge-gui/res/editions/Commander Anthology.txt b/forge-gui/res/editions/Commander Anthology.txt index 2afdab268f8..b49e9ad2a65 100644 --- a/forge-gui/res/editions/Commander Anthology.txt +++ b/forge-gui/res/editions/Commander Anthology.txt @@ -328,8 +328,6 @@ Type=Other 320 L Forest [tokens] -banshee_of_the_dread_choir -caller_of_the_pack w_1_1_kithkin_soldier w_2_2_knight_vigilance w_1_1_spirit_flying diff --git a/forge-gui/res/editions/Commander.txt b/forge-gui/res/editions/Commander.txt index ab3e415b7e7..13e73b914f1 100644 --- a/forge-gui/res/editions/Commander.txt +++ b/forge-gui/res/editions/Commander.txt @@ -328,7 +328,6 @@ Type=Other 298 U Zoetic Cavern [tokens] -spawnwrithe c_0_1_eldrazi_spawn_sac c_0_1_eldrazi_spawn_sac w_1_1_kithkin_soldier diff --git a/forge-gui/res/editions/Conflux.txt b/forge-gui/res/editions/Conflux.txt index 8bdd25a3126..85308e5a588 100644 --- a/forge-gui/res/editions/Conflux.txt +++ b/forge-gui/res/editions/Conflux.txt @@ -157,7 +157,6 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand ALA 133 C Zombie Outlander [tokens] -mirror-sigil_sergeant w_4_4_angel_flying w_1_1_soldier b_2_2_zombie diff --git a/forge-gui/res/editions/Conspiracy Take the Crown.txt b/forge-gui/res/editions/Conspiracy Take the Crown.txt index cdf6dfa351c..c82c56ae90e 100644 --- a/forge-gui/res/editions/Conspiracy Take the Crown.txt +++ b/forge-gui/res/editions/Conspiracy Take the Crown.txt @@ -232,7 +232,6 @@ Booster=10 Common:!fromSheet("CN2 Draft Matters"), 3 Uncommon:!fromSheet("CN2 Dr 221 U Shimmering Grotto [tokens] -spitting_slime w_1_1_soldier w_1_2_soldier_defender w_1_1_spirit_flying diff --git a/forge-gui/res/editions/Dissension.txt b/forge-gui/res/editions/Dissension.txt index 08b3f36c16c..34179da950d 100644 --- a/forge-gui/res/editions/Dissension.txt +++ b/forge-gui/res/editions/Dissension.txt @@ -192,7 +192,6 @@ FoilAlwaysInCommonSlot=False 180 C Simic Growth Chamber [tokens] -sprouting_phytohydra r_3_1_elemental r_2_1_goblin_haste g_1_1_saproling diff --git a/forge-gui/res/editions/Dominaria.txt b/forge-gui/res/editions/Dominaria.txt index 39bbce03d6a..1783f00bb0a 100644 --- a/forge-gui/res/editions/Dominaria.txt +++ b/forge-gui/res/editions/Dominaria.txt @@ -293,7 +293,6 @@ BoosterMustContain=Legendary Creature [tokens] karox_bladewing -mishra's_self-replicator w_2_2_knight_vigilance w_2_2_knight_vigilance w_1_1_soldier diff --git a/forge-gui/res/editions/Duel Decks Jace vs. Vraska.txt b/forge-gui/res/editions/Duel Decks Jace vs. Vraska.txt index 2379b50055c..b9e1bfbe2f9 100644 --- a/forge-gui/res/editions/Duel Decks Jace vs. Vraska.txt +++ b/forge-gui/res/editions/Duel Decks Jace vs. Vraska.txt @@ -96,6 +96,5 @@ Type=Duel_Decks 84 L Forest [tokens] -spawnwrithe u_2_2_illusion b_1_1_assassin_lose_con \ No newline at end of file diff --git a/forge-gui/res/editions/Future Sight.txt b/forge-gui/res/editions/Future Sight.txt index 3eb56639387..9d49f14d2f1 100644 --- a/forge-gui/res/editions/Future Sight.txt +++ b/forge-gui/res/editions/Future Sight.txt @@ -192,12 +192,10 @@ Booster=11 Common, 3 Uncommon, 1 Rare [tokens] goldmeadow_harrier -imperial_mask cloud_sprite festering_goblin spark_elemental llanowar_elves -nacatl_war-pride metallic_sliver w_1_1_soldier b_2_2_zombie diff --git a/forge-gui/res/editions/Game Night.txt b/forge-gui/res/editions/Game Night.txt index c4351356742..244af0cc9df 100644 --- a/forge-gui/res/editions/Game Night.txt +++ b/forge-gui/res/editions/Game Night.txt @@ -80,4 +80,4 @@ Type=Other w_2_2_knight_vigilance b_2_2_zombie r_1_1_goblin -c_1_1_thopter_a_flying \ No newline at end of file +c_1_1_a_thopter_flying \ No newline at end of file diff --git a/forge-gui/res/editions/Gatecrash.txt b/forge-gui/res/editions/Gatecrash.txt index efa1c8a65ac..4aa1ef9bf83 100644 --- a/forge-gui/res/editions/Gatecrash.txt +++ b/forge-gui/res/editions/Gatecrash.txt @@ -260,7 +260,6 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand RTR 210 C Zhur-Taa Swine [tokens] -giant_adephage w_4_4_angel_flying w_2_2_knight_vigilance w_2_2_knight_vigilance diff --git a/forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt b/forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt index 6bf6abba55c..a3a8cfecfbf 100644 --- a/forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt +++ b/forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt @@ -145,9 +145,8 @@ g_3_3_centaur g_1_1_saproling g_1_1_saproling g_5_5_wurm_trample -wg_8_8_elemental_vigilance -wg_2_2_elf_knight_vigilance +gw_8_8_elemental_vigilance +gw_2_2_elf_knight_vigilance ub_1_1_horror_flying bg_1_1_insect -wr_1_1_soldier_haste -copy \ No newline at end of file +rw_1_1_soldier_haste \ No newline at end of file diff --git a/forge-gui/res/editions/Guilds of Ravnica.txt b/forge-gui/res/editions/Guilds of Ravnica.txt index 29688f9ee4f..606558dcf9d 100644 --- a/forge-gui/res/editions/Guilds of Ravnica.txt +++ b/forge-gui/res/editions/Guilds of Ravnica.txt @@ -289,5 +289,5 @@ w_4_4_angel_flying_vigilance w_1_1_soldier_lifelink u_1_1_bird_illusion_flying r_1_1_goblin -wg_2_2_elf_knight_vigilance +gw_2_2_elf_knight_vigilance bg_1_1_insect \ No newline at end of file diff --git a/forge-gui/res/editions/Ixalan.txt b/forge-gui/res/editions/Ixalan.txt index 43bf96ccf29..dff41f60fd4 100644 --- a/forge-gui/res/editions/Ixalan.txt +++ b/forge-gui/res/editions/Ixalan.txt @@ -305,7 +305,7 @@ u_2_2_illusion_illusory u_1_1_merfolk_hexproof b_2_2_pirate_menace g_3_3_dinosaur_trample -0_2_plant_defender +g_0_2_plant_defender c_a_treasure_sac c_a_treasure_sac c_a_treasure_sac diff --git a/forge-gui/res/editions/Legendary Cube.txt b/forge-gui/res/editions/Legendary Cube.txt index 106c78f4436..ae74a0b9ec0 100644 --- a/forge-gui/res/editions/Legendary Cube.txt +++ b/forge-gui/res/editions/Legendary Cube.txt @@ -158,14 +158,6 @@ Type=Other 149 R Temple of the False God [tokens] -banshee_of_the_dread_choir -blade_of_selves -broodbirth_viper -caller_of_the_pack -herald_of_the_host -lightning_rager -stoneforged_blade -warchief_giant c_0_1_eldrazi_spawn_sac w_2_2_knight_vigilance w_1_1_kor_soldier diff --git a/forge-gui/res/editions/Planar Chaos.txt b/forge-gui/res/editions/Planar Chaos.txt index 4c32d41b056..68008c9d91e 100644 --- a/forge-gui/res/editions/Planar Chaos.txt +++ b/forge-gui/res/editions/Planar Chaos.txt @@ -176,7 +176,6 @@ Booster=11 Common, 3 Uncommon, 1 Rare 53 C Wistful Thinking [tokens] -chronozoa w_1_1_soldier b_2_2_knight_flanking_pro_white_haste g_3_3_ape diff --git a/forge-gui/res/editions/Return to Ravnica.txt b/forge-gui/res/editions/Return to Ravnica.txt index 1398696bdac..0d0ad645ebb 100644 --- a/forge-gui/res/editions/Return to Ravnica.txt +++ b/forge-gui/res/editions/Return to Ravnica.txt @@ -285,7 +285,6 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 84 U Zanikev Locust [tokens] -pack_rat w_1_1_bird_flying w_2_2_knight_vigilance w_2_2_knight_vigilance diff --git a/forge-gui/res/editions/Rivals of Ixalan.txt b/forge-gui/res/editions/Rivals of Ixalan.txt index d18d2ee0082..6817e6fb5c9 100644 --- a/forge-gui/res/editions/Rivals of Ixalan.txt +++ b/forge-gui/res/editions/Rivals of Ixalan.txt @@ -223,7 +223,7 @@ r_1_1_elemental r_0_1_elemental_rekindling_phoenix g_3_3_dinosaur_trample g_1_1_saproling -g_4_4_a_golem +d_4_4_a_golem c_a_treasure_sac c_a_treasure_sac c_a_treasure_sac diff --git a/forge-gui/res/editions/Scars of Mirrodin.txt b/forge-gui/res/editions/Scars of Mirrodin.txt index 288147a054b..481198839fe 100644 --- a/forge-gui/res/editions/Scars of Mirrodin.txt +++ b/forge-gui/res/editions/Scars of Mirrodin.txt @@ -260,7 +260,6 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 223 M Wurmcoil Engine [tokens] -myr_propagator w_2_2_cat w_1_1_soldier r_1_1_goblin diff --git a/forge-gui/res/editions/Shadowmoor.txt b/forge-gui/res/editions/Shadowmoor.txt index 6f4ca100ebe..9d4999378db 100644 --- a/forge-gui/res/editions/Shadowmoor.txt +++ b/forge-gui/res/editions/Shadowmoor.txt @@ -312,7 +312,6 @@ Booster=11 Common, 3 Uncommon, 1 Rare 157 C Zealous Guardian [tokens] -spawnwrithe w_1_1_kithkin_soldier w_1_1_spirit_flying b_1_1_rat diff --git a/forge-gui/res/editions/Stronghold.txt b/forge-gui/res/editions/Stronghold.txt index f0343e415c1..5af90e1b4a1 100644 --- a/forge-gui/res/editions/Stronghold.txt +++ b/forge-gui/res/editions/Stronghold.txt @@ -159,5 +159,4 @@ hornet c_1_1_sliver b_1_1_rat r_1_1_goblin -g_1_1_spike -volraths_laboratory \ No newline at end of file +g_1_1_spike \ No newline at end of file diff --git a/forge-gui/res/editions/Time Spiral.txt b/forge-gui/res/editions/Time Spiral.txt index 045eb1a22a4..481c1a73040 100644 --- a/forge-gui/res/editions/Time Spiral.txt +++ b/forge-gui/res/editions/Time Spiral.txt @@ -317,11 +317,11 @@ kobolds_of_kher_keep w_1_1_citizen w_2_2_griffin_flying u_1_1_camarid -b_1_2_bat_flying_sengir_nosferatu +b_1_2_bat_flying_nosferatu b_2_4_spider_reach b_1_1_thrull r_1_1_goblin g_1_1_saproling g_x_x_wurm -c_2_2_a_assembly-worker -c_1_1_triskelavite_flying_ammo \ No newline at end of file +c_2_2_a_assembly_worker +c_1_1_a_triskelavite_flying_ammo \ No newline at end of file diff --git a/forge-gui/res/editions/Vanguard.txt b/forge-gui/res/editions/Vanguard.txt index 18fa456bc99..5ad54d473b2 100644 --- a/forge-gui/res/editions/Vanguard.txt +++ b/forge-gui/res/editions/Vanguard.txt @@ -126,7 +126,6 @@ S Volrath S Xantcha [tokens] -arrest c_1_1_sliver w_1_1_spirit_flying r_5_5_dragon_flying