diff --git a/.github/workflows/remove-stale-branches.yml b/.github/workflows/remove-stale-branches.yml new file mode 100644 index 00000000000..8f06accdb9d --- /dev/null +++ b/.github/workflows/remove-stale-branches.yml @@ -0,0 +1,12 @@ +on: + schedule: + - cron: "0 0 * * *" # Everday at midnight + +jobs: + remove-stale-branches: + name: Remove Stale Branches + runs-on: ubuntu-latest + steps: + - uses: fpicalausa/remove-stale-branches@v1.6.0 + with: + dry-run: true # Check out the console output before setting this to false diff --git a/.github/workflows/snapshot-both-pc-android.yml b/.github/workflows/snapshot-both-pc-android.yml index 774e3be2d8f..46b2cf6ceb3 100644 --- a/.github/workflows/snapshot-both-pc-android.yml +++ b/.github/workflows/snapshot-both-pc-android.yml @@ -8,9 +8,6 @@ on: description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' required: false default: false - schedule: - # * is a special character in YAML so you have to quote this string - - cron: '30 18 * * *' jobs: build: diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 4a2e467b986..754ba21e7ba 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -631,6 +631,11 @@ public class CountersPutAi extends CountersAi { return false; // only if next turn and cost is reusable } } + + // Useless since the card already has the keyword (or for another reason) + if (ComputerUtil.isUselessCounter(CounterType.get(type), cards.get(0))) { + return false; + } } boolean immediately = ComputerUtil.playImmediately(ai, sa); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java index aff7ee0b20e..26de05ff366 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java @@ -86,10 +86,7 @@ public class CCombat implements ICDoc { else display.append(Lang.getInstance().getPossesive(controller.getName())).append(" "); } - if (controller == null) - display.append(" is attacked by:\n"); - else - display.append(defender).append(" is attacked by:\n"); + display.append(defender).append(" is attacked by:\n"); // Associate Bands, Attackers Blockers boolean previousBand = false; diff --git a/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java index 568b98fd572..bfd58306a58 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java +++ b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java @@ -173,6 +173,7 @@ public class AdventureDeckEditor extends TabPageScreen { super(ItemManagerConfig.ADVENTURE_EDITOR_POOL, Forge.getLocalizer().getMessage("lblInventory"), CATALOG_ICON); cardManager.setBtnAdvancedSearchOptions(true); cardManager.setCatalogDisplay(true); + cardManager.setShowNFSWatermark(true); } @Override diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index f36a92818fb..25d3754b952 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -176,6 +176,7 @@ public class FSkin { Forge.getAssets().loadTexture(getSkinFile("hd_logo.png")); Forge.getAssets().loadTexture(getDefaultSkinFile("adv_logo.png"), new TextureLoader.TextureParameter()); Forge.getAssets().loadTexture(getDefaultSkinFile("cover.png")); + Forge.getAssets().loadTexture(getDefaultSkinFile("nfs.png")); Forge.getAssets().loadTexture(getDefaultSkinFile("overlay_alpha.png")); Forge.getAssets().loadTexture(getDefaultSkinFile("spiral.png")); Forge.getAssets().loadTexture(getDefaultSkinFile("splatter.png")); diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 66418274d6c..4eed8567261 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -284,18 +284,21 @@ public class FDeckEditor extends TabPageScreen { private final FLabel btnMoreOptions = deckHeader.add(new FLabel.Builder().text("...").font(FSkinFont.get(20)).align(Align.center).pressedColor(Header.getBtnPressedColor()).build()); public FDeckEditor(EditorType editorType0, DeckProxy editDeck, boolean showMainDeck) { - this(editorType0, editDeck.getName(), editDeck.getPath(), null, showMainDeck,null); + this(editorType0, editDeck.getName(), editDeck.getPath(), null, showMainDeck, null); } - public FDeckEditor(EditorType editorType0, String editDeckName, boolean showMainDeck,FEventHandler backButton) { - this(editorType0, editDeckName, "", null, showMainDeck,backButton); + public FDeckEditor(EditorType editorType0, DeckProxy editDeck, boolean showMainDeck, FEventHandler backButton) { + this(editorType0, editDeck.getName(), editDeck.getPath(), null, showMainDeck, backButton); + } + public FDeckEditor(EditorType editorType0, String editDeckName, boolean showMainDeck, FEventHandler backButton) { + this(editorType0, editDeckName, "", null, showMainDeck, backButton); } public FDeckEditor(EditorType editorType0, String editDeckName, boolean showMainDeck) { - this(editorType0, editDeckName, "", null, showMainDeck,null); + this(editorType0, editDeckName, "", null, showMainDeck, null); } public FDeckEditor(EditorType editorType0, Deck newDeck, boolean showMainDeck) { - this(editorType0, "", "", newDeck, showMainDeck,null); + this(editorType0, "", "", newDeck, showMainDeck, null); } - private FDeckEditor(EditorType editorType0, String editDeckName, String editDeckPath, Deck newDeck, boolean showMainDeck,FEventHandler backButton) { + private FDeckEditor(EditorType editorType0, String editDeckName, String editDeckPath, Deck newDeck, boolean showMainDeck, FEventHandler backButton) { super(backButton, getPages(editorType0)); editorType = editorType0; diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index 59e39cadb6f..c430f045561 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -83,6 +83,7 @@ public abstract class ItemManager extends FContainer im private boolean hideFilters = false; private boolean wantUnique = false; private boolean showRanking = false; + private boolean showNFSWatermark = false; private boolean multiSelectMode = false; private FEventHandler selectionChangedHandler, itemActivateHandler; private ContextMenuBuilder contextMenuBuilder; @@ -910,6 +911,10 @@ public abstract class ItemManager extends FContainer im return showRanking; } + public boolean showNFSWatermark() { + return showNFSWatermark; + } + public void setWantUnique(boolean unique) { wantUnique = unique; } @@ -918,6 +923,10 @@ public abstract class ItemManager extends FContainer im showRanking = showRanking0; } + public void setShowNFSWatermark(boolean val) { + showNFSWatermark = val; + } + public void setSelectionSupport(int minSelections0, int maxSelections0) { for (ItemView view : views) { view.setSelectionSupport(minSelections0, maxSelections0); diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index ca347f33524..60097618cc1 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -1127,8 +1127,12 @@ public class ImageView extends ItemView { cardPrice = ((ShopScene) Forge.getCurrentScene()).getCardPrice((PaperCard) item); drawCardLabel(g, "$" + cardPrice, Color.GOLD, x, y ,w ,h); } else { - if (((PaperCard) item).isNoSell()) { - drawCardLabel(g, Forge.getLocalizer().getMessage("lblNoSell"), Color.RED, x, y, w, h); + if (((PaperCard) item).isNoSell() && itemManager.showNFSWatermark()) { + Texture nfs = Forge.getAssets().getTexture(getDefaultSkinFile("nfs.png"), false); + if (nfs != null) + g.drawImage(nfs, x, y, w, h); + else + drawCardLabel(g, Forge.getLocalizer().getMessage("lblNoSell"), Color.RED, x, y, w, h); } } } @@ -1164,7 +1168,7 @@ public class ImageView extends ItemView { //g.drawImage(tr, x + (w - w * scale) / 2, y + (h - h * scale) / 1.5f, w * scale, h * scale); } //draw plastic effect overlay. - g.drawImage(Forge.getAssets().getTexture(getDefaultSkinFile("cover.png")), x + (w - w * scale) / 2, y + (h - h * scale) / 1.5f, w * scale, h * scale); + g.drawImage(Forge.getAssets().getTexture(getDefaultSkinFile("cover.png"), false), x + (w - w * scale) / 2, y + (h - h * scale) / 1.5f, w * scale, h * scale); } //fake labelname shadow g.drawText(item.getName(), GROUP_HEADER_FONT, Color.BLACK, (x + PADDING) - 1f, (y + PADDING * 2) + 1f, w - 2 * PADDING, h - 2 * PADDING, true, Align.center, false); @@ -1192,7 +1196,7 @@ public class ImageView extends ItemView { //temporary fill image g.fillRect(Color.BLACK, x + (w - w * scale) / 2, y + (h - h * scale) / 1.5f, w * scale, h * scale); //draw plastic effect overlay. - g.drawImage(Forge.getAssets().getTexture(getDefaultSkinFile("cover.png")), x + (w - w * scale) / 2, y + (h - h * scale) / 1.5f, w * scale, h * scale); + g.drawImage(Forge.getAssets().getTexture(getDefaultSkinFile("cover.png"), false), x + (w - w * scale) / 2, y + (h - h * scale) / 1.5f, w * scale, h * scale); } } diff --git a/forge-gui-mobile/src/forge/screens/limited/NewSealedScreen.java b/forge-gui-mobile/src/forge/screens/limited/NewSealedScreen.java index aea37d92f95..bca812c1bdd 100644 --- a/forge-gui-mobile/src/forge/screens/limited/NewSealedScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/NewSealedScreen.java @@ -48,8 +48,7 @@ public class NewSealedScreen extends LaunchScreen { FThreads.invokeInEdtLater(() -> { DeckPreferences.setSealedDeck(sealed.getName()); - Forge.openScreen(new FDeckEditor(EditorType.Sealed, sealed.getName(), false)); - Forge.setBackScreen(new LoadSealedScreen(), false); //ensure pressing back goes to load sealed screen + Forge.openScreen(new FDeckEditor(EditorType.Sealed, sealed.getName(), false, e -> Forge.openScreen(new LoadSealedScreen(), false))); }); }); } diff --git a/forge-gui/res/editions/Media Inserts.txt b/forge-gui/res/editions/Media Inserts.txt index bcd6ef0050c..7e1ccefdd7a 100644 --- a/forge-gui/res/editions/Media Inserts.txt +++ b/forge-gui/res/editions/Media Inserts.txt @@ -66,5 +66,6 @@ ScryfallCode=PMEI 62 R Raiyuu, Storm's Edge @Heonhwa Choe 63 R Snuff Out @Mike Ploog 66 R Saryth, the Viper's Fang @Igor Kieryluk +67 R Gush @Kev Walker 211 R Park Heights Pegasus @Randy Gallegos 232 R Liesa, Forgotten Archangel @Dmitry Burmak diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index b6dc746ddcc..5ab1760bcfd 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -796,6 +796,12 @@ F798 M Discord, Lord of Disharmony @Narendra Bintara Adi 827 R Norin the Wary @Jarel Threat 827b R Norin the Wary @Jarel Threat 828 R Keen Duelist @Thanh Tuấn +863 R Masterwork of Ingenuity @David Álvarez +864 R Sculpting Steel @Javier Charro +865 R Unnatural Growth @Justine Cruz +866 R Regrowth @Xabi Gaztelua +867 R Nature's Lore @Nicholas Elias +870 R Abundant Growth @Ryan Yee 871 R Soul-Guide Lantern @Tyler Walpole 872 R Yargle and Multani @Warren Mahy 873 R Dark Deal @Tyler Jacobson diff --git a/forge-gui/res/skins/default/nfs.png b/forge-gui/res/skins/default/nfs.png new file mode 100644 index 00000000000..3ae0ef9e353 Binary files /dev/null and b/forge-gui/res/skins/default/nfs.png differ