From ff041d9c4ddf208af89bd171dc8404e22a51204f Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Aug 2019 16:22:49 +0300 Subject: [PATCH 01/68] - Added puzzle PS_M207. --- forge-gui/res/puzzle/PS_M207.pzl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_M207.pzl diff --git a/forge-gui/res/puzzle/PS_M207.pzl b/forge-gui/res/puzzle/PS_M207.pzl new file mode 100644 index 00000000000..33a36d6b642 --- /dev/null +++ b/forge-gui/res/puzzle/PS_M207.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Magic Core Set 2020 #07 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/08/126.-M207.jpg +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Your Dauntless Bodyguard chose Shanna, Sisay's Legacy when it entered the battlefield. +[state] +humanlife=20 +ailife=7 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Strength of the Pack;Depose // Deploy;Storm the Citadel;Masterful Replication;Short Sword +humanbattlefield=Gideon Blackblade|Counters:LOYALTY=6;Blackblade Reforged;Omnispell Adept;Shanna, Sisay's Legacy|Id:9;Sigiled Sword of Valeron|AttachedTo:9;Dauntless Bodyguard|ChosenCards:9|Id:10|NoETBTrigs;Forebear's Blade|AttachedTo:10;Hallowed Fountain|NoETBTrigs;Hallowed Fountain|NoETBTrigs;Hallowed Fountain|NoETBTrigs;Temple Garden|NoETBTrigs;Temple Garden|NoETBTrigs;Temple Garden|NoETBTrigs +aibattlefield=Charity Extractor;Looming Altisaur;Gate Colossus;Looming Altisaur;Charity Extractor From dfd8c619cbf621012f92bb591b3fd62203632397 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 1 Sep 2019 08:41:36 +0800 Subject: [PATCH 02/68] Adjust conguest rewards column count for widescreen display --- .../planarconquest/ConquestRewardDialog.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java index 2cf70553e1a..bf614981766 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java @@ -5,6 +5,7 @@ import java.util.List; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.utils.Align; +import forge.Forge; import forge.Graphics; import forge.ImageKeys; import forge.animation.ForgeAnimation; @@ -60,10 +61,18 @@ public class ConquestRewardDialog extends FScrollPane { columnCount = 1; } else if (cardCount < 5) { - columnCount = 2; + if (Forge.extrawide.equals("default")) + columnCount = 2; + else + columnCount = 5; } else { - columnCount = 3; + if (Forge.extrawide.equals("extrawide")) + columnCount = 5; + else if (Forge.extrawide.equals("wide")) + columnCount = 4; + else + columnCount = 3; } animation = new CardRevealAnimation(); From c30f8847e8d9ced23720a814a774c6af3a3f13a0 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 1 Sep 2019 08:43:07 +0800 Subject: [PATCH 03/68] Add translucent dark overlay for Planchase BG --- forge-gui-mobile/src/forge/Graphics.java | 9 + .../src/forge/screens/match/MatchScreen.java | 158 +++++++++--------- 2 files changed, 88 insertions(+), 79 deletions(-) diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index b2a99f88617..64ca50b75a7 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -535,7 +535,16 @@ public class Graphics { } public void drawImage(FImage image, float x, float y, float w, float h) { + drawImage(image, x, y, w, h, false); + } + public void drawImage(FImage image, float x, float y, float w, float h, boolean withDarkOverlay) { image.draw(this, x, y, w, h); + if(withDarkOverlay){ + float oldalpha = alphaComposite; + setAlphaComposite(0.4f); + fillRect(Color.BLACK, x, y, w, h); + setAlphaComposite(oldalpha); + } } public void drawImage(Texture image, float x, float y, float w, float h) { batch.draw(image, adjustX(x), adjustY(y, h), w, h); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 3f08f076fd0..20c46b0c33a 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -669,9 +669,9 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE1, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE1, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } - break; + break; case "Agyrem": { planeFullWidth = planeHeight * FSkinTexture.BG_PLANE2.getWidth() / FSkinTexture.BG_PLANE2.getHeight(); if (planeFullWidth < w) { @@ -679,7 +679,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE2, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE2, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Akoum": { @@ -689,7 +689,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE3, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE3, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Aretopolis": { @@ -699,7 +699,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE4, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE4, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Astral Arena": { @@ -709,7 +709,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE5, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE5, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Bant": { @@ -719,7 +719,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE6, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE6, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Bloodhill Bastion": { @@ -729,7 +729,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE7, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE7, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Cliffside Market": { @@ -739,7 +739,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE8, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE8, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Edge of Malacol": { @@ -749,7 +749,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE9, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE9, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Eloren Wilds": { @@ -759,7 +759,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE10, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE10, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Feeding Grounds": { @@ -769,7 +769,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE11, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE11, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Fields of Summer": { @@ -779,7 +779,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE12, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE12, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Furnace Layer": { @@ -789,7 +789,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE13, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE13, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Gavony": { @@ -799,7 +799,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE14, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE14, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Glen Elendra": { @@ -809,7 +809,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE15, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE15, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Glimmervoid Basin": { @@ -819,7 +819,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE16, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE16, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Goldmeadow": { @@ -829,7 +829,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE17, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE17, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Grand Ossuary": { @@ -839,7 +839,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE18, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE18, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Grixis": { @@ -849,7 +849,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE19, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE19, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Grove of the Dreampods": { @@ -859,7 +859,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE20, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE20, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Hedron Fields of Agadeem": { @@ -869,7 +869,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE21, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE21, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Immersturm": { @@ -879,7 +879,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE22, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE22, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Isle of Vesuva": { @@ -889,7 +889,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE23, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE23, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Izzet Steam Maze": { @@ -899,7 +899,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE24, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE24, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Jund": { @@ -909,7 +909,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE25, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE25, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Kessig": { @@ -919,7 +919,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE26, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE26, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Kharasha Foothills": { @@ -929,7 +929,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE27, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE27, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Kilnspire District": { @@ -939,7 +939,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE28, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE28, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Krosa": { @@ -949,7 +949,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE29, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE29, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Lair of the Ashen Idol": { @@ -959,7 +959,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE30, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE30, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Lethe Lake": { @@ -969,7 +969,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE31, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE31, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Llanowar": { @@ -979,7 +979,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE32, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE32, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Minamo": { @@ -989,7 +989,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE33, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE33, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Mount Keralia": { @@ -999,7 +999,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE34, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE34, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Murasa": { @@ -1009,7 +1009,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE35, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE35, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Naar Isle": { @@ -1019,7 +1019,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE36, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE36, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Naya": { @@ -1029,7 +1029,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE37, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE37, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Nephalia": { @@ -1039,7 +1039,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE38, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE38, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Norn's Dominion": { @@ -1049,7 +1049,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE39, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE39, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Onakke Catacomb": { @@ -1059,7 +1059,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE40, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE40, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Orochi Colony": { @@ -1069,7 +1069,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE41, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE41, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Orzhova": { @@ -1079,7 +1079,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE42, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE42, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Otaria": { @@ -1089,7 +1089,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE43, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE43, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Panopticon": { @@ -1099,7 +1099,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE44, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE44, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Pools of Becoming": { @@ -1109,7 +1109,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE45, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE45, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Prahv": { @@ -1119,7 +1119,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE46, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE46, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Quicksilver Sea": { @@ -1129,7 +1129,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE47, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE47, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Raven's Run": { @@ -1139,7 +1139,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE48, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE48, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Sanctum of Serra": { @@ -1149,7 +1149,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE49, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE49, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Sea of Sand": { @@ -1159,7 +1159,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE50, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE50, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Selesnya Loft Gardens": { @@ -1169,7 +1169,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE51, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE51, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Shiv": { @@ -1179,7 +1179,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE52, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE52, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Skybreen": { @@ -1189,7 +1189,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE53, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE53, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Sokenzan": { @@ -1199,7 +1199,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE54, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE54, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Stairs to Infinity": { @@ -1209,7 +1209,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE55, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE55, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Stensia": { @@ -1219,7 +1219,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE56, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE56, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Stronghold Furnace": { @@ -1229,7 +1229,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE57, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE57, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Takenuma": { @@ -1239,7 +1239,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE58, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE58, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Tazeem": { @@ -1249,7 +1249,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE59, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE59, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Aether Flues": { @@ -1259,7 +1259,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE60, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE60, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Dark Barony": { @@ -1269,7 +1269,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE61, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE61, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Eon Fog": { @@ -1279,7 +1279,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE62, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE62, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Fourth Sphere": { @@ -1289,7 +1289,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE63, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE63, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Great Forest": { @@ -1299,7 +1299,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE64, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE64, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Hippodrome": { @@ -1309,7 +1309,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE65, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE65, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Maelstrom": { @@ -1319,7 +1319,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE66, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE66, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "The Zephyr Maze": { @@ -1329,7 +1329,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE67, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE67, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Trail of the Mage-Rings": { @@ -1339,7 +1339,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE68, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE68, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Truga Jungle": { @@ -1349,7 +1349,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE69, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE69, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Turri Island": { @@ -1359,7 +1359,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE70, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE70, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Undercity Reaches": { @@ -1369,7 +1369,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE71, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE71, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Velis Vel": { @@ -1379,7 +1379,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE72, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE72, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Windriddle Palaces": { @@ -1389,7 +1389,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE73, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE73, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Tember City": { @@ -1399,7 +1399,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE74, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE74, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Celestine Reef": { @@ -1409,7 +1409,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE75, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE75, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Horizon Boughs": { @@ -1419,7 +1419,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE76, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE76, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Mirrored Depths": { @@ -1429,7 +1429,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE77, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE77, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; case "Talon Gates": { @@ -1439,7 +1439,7 @@ public class MatchScreen extends FScreen { planeFullWidth = w; planeHeight = scaledPlaneHeight; } - g.drawImage(FSkinTexture.BG_PLANE78, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); + g.drawImage(FSkinTexture.BG_PLANE78, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); } break; From a1adbedad1c0864058a73e833cd0a837ab6c6d6a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 1 Sep 2019 08:54:15 +0800 Subject: [PATCH 04/68] Adjust column count --- .../screens/planarconquest/ConquestRewardDialog.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java index bf614981766..c308699bab2 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java @@ -63,8 +63,12 @@ public class ConquestRewardDialog extends FScrollPane { else if (cardCount < 5) { if (Forge.extrawide.equals("default")) columnCount = 2; - else - columnCount = 5; + else { + if(cardCount == 4) + columnCount = 4; + else + columnCount = 3; + } } else { if (Forge.extrawide.equals("extrawide")) From c698c034cae287756f923d36c50fd3a374e7f80c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 1 Sep 2019 10:13:06 +0800 Subject: [PATCH 05/68] Adjust column count --- .../src/forge/screens/planarconquest/ConquestRewardDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java index c308699bab2..b9b73e88d3d 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java @@ -64,7 +64,7 @@ public class ConquestRewardDialog extends FScrollPane { if (Forge.extrawide.equals("default")) columnCount = 2; else { - if(cardCount == 4) + if (cardCount == 4) columnCount = 4; else columnCount = 3; From 21076e2c0151703cadad4a392b7fe49eedfc6728 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 1 Sep 2019 11:48:43 +0800 Subject: [PATCH 06/68] Adjust card scrollIntoView for widescreen display --- .../forge/screens/planarconquest/ConquestRewardDialog.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java index b9b73e88d3d..da194996ee3 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java @@ -243,7 +243,10 @@ public class ConquestRewardDialog extends FScrollPane { //ensure current card in view if (getScrollHeight() > getHeight() && index < cardCount) { CardRevealer currentCard = cardRevealers.get(index); - scrollIntoView(currentCard, currentCard.getHeight() / 2 + PADDING); //show half of the card below + if (!Forge.extrawide.equals("default")) + scrollIntoView(currentCard, currentCard.getHeight() / (columnCount * PADDING) / 2); + else + scrollIntoView(currentCard, currentCard.getHeight() / 2 + PADDING); //show half of the card below } } From c04ccdaf7cde998cefdce3100e1a60df0715abf8 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 1 Sep 2019 05:39:09 +0000 Subject: [PATCH 07/68] Card: combine PT boost into one Map using timestamp --- .../main/java/forge/ai/ComputerUtilCard.java | 13 +-- .../java/forge/ai/simulation/GameCopier.java | 5 +- .../ai/simulation/GameStateEvaluator.java | 11 --- .../main/java/forge/game/StaticEffect.java | 61 +----------- .../game/ability/effects/PumpAllEffect.java | 6 +- .../game/ability/effects/PumpEffect.java | 12 +-- .../src/main/java/forge/game/card/Card.java | 97 +++++++------------ .../main/java/forge/game/card/CardUtil.java | 4 +- .../StaticAbilityContinuous.java | 11 +-- 9 files changed, 54 insertions(+), 166 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index f562e7a3a01..843bc7c4e37 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1601,8 +1601,8 @@ public class ComputerUtilCard { } pumped.addNewPT(c.getCurrentPower(), c.getCurrentToughness(), timestamp); - pumped.addTempPowerBoost(c.getTempPowerBoost() + power + berserkPower); - pumped.addTempToughnessBoost(c.getTempToughnessBoost() + toughness); + pumped.setPTBoost(c.getPTBoostMap()); + pumped.addPTBoost(power + berserkPower, toughness, timestamp); pumped.addChangedCardKeywords(kws, null, false, false, timestamp); Set types = c.getCounters().keySet(); for(CounterType ct : types) { @@ -1648,6 +1648,8 @@ public class ComputerUtilCard { } list.add(vCard); // account for the static abilities that may be present on the card itself for (final Card c : list) { + // remove old boost that might be copied + vCard.removePTBoost(c.getTimestamp()); for (final StaticAbility stAb : c.getStaticAbilities()) { final Map params = stAb.getMapParams(); if (!params.get("Mode").equals("Continuous")) { @@ -1663,26 +1665,25 @@ public class ComputerUtilCard { if (!vCard.isValid(valid, c.getController(), c, null)) { continue; } + int att = 0; if (params.containsKey("AddPower")) { String addP = params.get("AddPower"); - int att = 0; if (addP.equals("AffectedX")) { att = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addP)); } else { att = AbilityUtils.calculateAmount(c, addP, stAb); } - vCard.addTempPowerBoost(att); } + int def = 0; if (params.containsKey("AddToughness")) { String addT = params.get("AddToughness"); - int def = 0; if (addT.equals("AffectedY")) { def = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addT)); } else { def = AbilityUtils.calculateAmount(c, addT, stAb); } - vCard.addTempToughnessBoost(def); } + vCard.addPTBoost(att, def, c.getTimestamp()); } } } diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index b04ba570a51..8cd20c54a26 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -277,10 +277,7 @@ public class GameCopier { // TODO: Copy the full list with timestamps. newCard.addNewPT(setPower, setToughness, newGame.getNextTimestamp()); } - newCard.addTempPowerBoost(c.getTempPowerBoost()); - newCard.setSemiPermanentPowerBoost(c.getSemiPermanentPowerBoost()); - newCard.addTempToughnessBoost(c.getTempToughnessBoost()); - newCard.setSemiPermanentToughnessBoost(c.getSemiPermanentToughnessBoost()); + newCard.setPTBoost(c.getPTBoostMap()); newCard.setDamage(c.getDamage()); newCard.setChangedCardTypes(c.getChangedCardTypesMap()); diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java index e32de189652..3ee4521d4ba 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java @@ -161,17 +161,6 @@ public class GameStateEvaluator { } return super.addValue(value, text); } - - @Override - protected int getEffectivePower(final Card c) { - Card.StatBreakdown breakdown = c.getNetCombatDamageBreakdown(); - return breakdown.getTotal() - breakdown.tempBoost; - } - @Override - protected int getEffectiveToughness(final Card c) { - Card.StatBreakdown breakdown = c.getNetToughnessBreakdown(); - return breakdown.getTotal() - breakdown.tempBoost; - } } public static class Score { diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index 9f4be831e8f..1d2d7b73151 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -53,7 +53,6 @@ public class StaticEffect { private int xValue = 0; private int yValue = 0; private long timestamp = -1; - private Map xValueMap = Maps.newTreeMap(); private String chosenType; private Map mapParams = Maps.newTreeMap(); @@ -95,7 +94,6 @@ public class StaticEffect { copy.xValue = this.xValue; copy.yValue = this.yValue; copy.timestamp = this.timestamp; - copy.xValueMap = this.xValueMap; copy.chosenType = this.chosenType; copy.mapParams = this.mapParams; copy.overwriteTypes = this.overwriteTypes; @@ -740,29 +738,6 @@ public class StaticEffect { return this.yValue; } - /** - * Store xValue relative to a specific card. - * @param affectedCard the card affected - * @param xValue the xValue - */ - public final void addXMapValue(final Card affectedCard, final Integer xValue) { - if (this.xValueMap.containsKey(affectedCard)) { - if (!this.xValueMap.get(affectedCard).equals(xValue)) { - this.xValueMap.remove(affectedCard); - } - } - this.xValueMap.put(affectedCard, xValue); - } - - /** - * Get the xValue for specific card. - * @param affectedCard the affected card - * @return an int. - */ - public int getXMapValue(Card affectedCard) { - return this.xValueMap.get(affectedCard); - } - /** * setParams. TODO Write javadoc for this method. * @@ -813,10 +788,6 @@ public class StaticEffect { String changeColorWordsTo = null; - int powerBonus = 0; - String addP = ""; - int toughnessBonus = 0; - String addT = ""; int keywordMultiplier = 1; boolean setPT = false; String[] addHiddenKeywords = null; @@ -834,28 +805,6 @@ public class StaticEffect { setPT = true; } - if (params.containsKey("AddPower")) { - addP = params.get("AddPower"); - if (addP.matches("[0-9][0-9]?")) { - powerBonus = Integer.valueOf(addP); - } else if (addP.equals("AffectedX")) { - // gets calculated at runtime - } else { - powerBonus = getXValue(); - } - } - - if (params.containsKey("AddToughness")) { - addT = params.get("AddToughness"); - if (addT.matches("[0-9][0-9]?")) { - toughnessBonus = Integer.valueOf(addT); - } else if (addT.equals("AffectedX")) { - // gets calculated at runtime - } else { - toughnessBonus = getYValue(); - } - } - if (params.containsKey("KeywordMultiplier")) { String multiplier = params.get("KeywordMultiplier"); if (multiplier.equals("X")) { @@ -934,15 +883,9 @@ public class StaticEffect { } // remove P/T bonus - if (addP.startsWith("AffectedX")) { - powerBonus = getXMapValue(affectedCard); - } - if (addT.startsWith("AffectedX")) { - toughnessBonus = getXMapValue(affectedCard); - } + affectedCard.removePTBoost(getTimestamp()); + // the view is updated in GameAction#checkStaticAbilities to avoid flickering - affectedCard.addSemiPermanentPowerBoost(powerBonus * -1, false); - affectedCard.addSemiPermanentToughnessBoost(toughnessBonus * -1, false); // remove keywords // TODO regular keywords currently don't try to use keyword multiplier diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index c149b976412..2498893019e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -49,8 +49,7 @@ public class PumpAllEffect extends SpellAbilityEffect { continue; } - tgtC.addTempPowerBoost(a); - tgtC.addTempToughnessBoost(d); + tgtC.addPTBoost(a, d, timestamp); tgtC.addChangedCardKeywords(kws, null, false, false, timestamp); for (String kw : hiddenkws) { @@ -68,8 +67,7 @@ public class PumpAllEffect extends SpellAbilityEffect { @Override public void run() { - tgtC.addTempPowerBoost(-1 * a); - tgtC.addTempToughnessBoost(-1 * d); + tgtC.removePTBoost(timestamp); tgtC.removeChangedCardKeywords(timestamp); for (String kw : hiddenkws) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 68936a2f7ae..06a52878346 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -55,8 +55,7 @@ public class PumpEffect extends SpellAbilityEffect { } } - gameCard.addTempPowerBoost(a); - gameCard.addTempToughnessBoost(d); + gameCard.addPTBoost(a, d,timestamp); gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); if (redrawPT) { gameCard.updatePowerToughnessForView(); @@ -73,23 +72,18 @@ public class PumpEffect extends SpellAbilityEffect { @Override public void run() { - gameCard.addTempPowerBoost(-1 * a); - gameCard.addTempToughnessBoost(-1 * d); + gameCard.removePTBoost(timestamp); if (keywords.size() > 0) { - boolean redrawPT = false; for (String kw : keywords) { - redrawPT |= kw.contains("CARDNAME's power and toughness are switched"); if (kw.startsWith("HIDDEN")) { gameCard.removeHiddenExtrinsicKeyword(kw); - if (redrawPT) { - gameCard.updatePowerToughnessForView(); - } } } gameCard.removeChangedCardKeywords(timestamp); } + gameCard.updatePowerToughnessForView(); game.fireEvent(new GameEventCardStatsChanged(gameCard)); } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 8e08f99c1bb..366eb1c8680 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -195,6 +195,8 @@ public class Card extends GameEntity implements Comparable { // stack of set power/toughness private Map> newPT = Maps.newTreeMap(); private Map> newPTCharacterDefining = Maps.newTreeMap(); + private Map> boostPT = Maps.newTreeMap(); + private String basePowerString = null; private String baseToughnessString = null; private String oracleText = ""; @@ -208,12 +210,6 @@ public class Card extends GameEntity implements Comparable { private int turnInZone; - private int tempPowerBoost = 0; - private int tempToughnessBoost = 0; - - private int semiPermanentPowerBoost = 0; - private int semiPermanentToughnessBoost = 0; - private int xManaCostPaid = 0; private Map xManaCostPaidByColor; @@ -3343,7 +3339,7 @@ public class Card extends GameEntity implements Comparable { } public final StatBreakdown getUnswitchedPowerBreakdown() { - return new StatBreakdown(getCurrentPower(), getTempPowerBoost(), getSemiPermanentPowerBoost(), getPowerBonusFromCounters()); + return new StatBreakdown(getCurrentPower(), getTempPowerBoost(), getPowerBonusFromCounters()); } public final int getUnswitchedPower() { return getUnswitchedPowerBreakdown().getTotal(); @@ -3380,31 +3376,28 @@ public class Card extends GameEntity implements Comparable { public static class StatBreakdown { public final int currentValue; public final int tempBoost; - public final int semiPermanentBoost; public final int bonusFromCounters; public StatBreakdown() { this.currentValue = 0; this.tempBoost = 0; - this.semiPermanentBoost = 0; this.bonusFromCounters = 0; } - public StatBreakdown(int currentValue, int tempBoost, int semiPermanentBoost, int bonusFromCounters){ + public StatBreakdown(int currentValue, int tempBoost, int bonusFromCounters){ this.currentValue = currentValue; this.tempBoost = tempBoost; - this.semiPermanentBoost = semiPermanentBoost; this.bonusFromCounters = bonusFromCounters; } public int getTotal() { - return currentValue + tempBoost + semiPermanentBoost + bonusFromCounters; + return currentValue + tempBoost + bonusFromCounters; } @Override public String toString() { - return TextUtil.concatWithSpace("c:"+String.valueOf(currentValue),"tb:"+String.valueOf(tempBoost), "spb:"+String.valueOf(semiPermanentBoost),"bfc:"+String.valueOf(bonusFromCounters)); + return TextUtil.concatWithSpace("c:"+String.valueOf(currentValue),"tb:"+String.valueOf(tempBoost),"bfc:"+String.valueOf(bonusFromCounters)); } } public final StatBreakdown getUnswitchedToughnessBreakdown() { - return new StatBreakdown(getCurrentToughness(), getTempToughnessBoost(), getSemiPermanentToughnessBoost(), getToughnessBonusFromCounters()); + return new StatBreakdown(getCurrentToughness(), getTempToughnessBoost(), getToughnessBonusFromCounters()); } public final int getUnswitchedToughness() { return getUnswitchedToughnessBreakdown().getTotal(); @@ -3465,62 +3458,44 @@ public class Card extends GameEntity implements Comparable { // for cards like Giant Growth, etc. public final int getTempPowerBoost() { - return tempPowerBoost; + int result = 0; + for (Pair pair : boostPT.values()) { + if (pair.getLeft() != null) { + result += pair.getLeft(); + } + } + return result; } public final int getTempToughnessBoost() { - return tempToughnessBoost; - } - - public final void addTempPowerBoost(final int n) { - if (n == 0) { return; } - tempPowerBoost += n; - currentState.getView().updatePower(this); - } - - public final void addTempToughnessBoost(final int n) { - if (n == 0) { return; } - tempToughnessBoost += n; - currentState.getView().updateToughness(this); - } - - // for cards like Glorious Anthem, etc. - public final int getSemiPermanentPowerBoost() { - return semiPermanentPowerBoost; - } - - public final int getSemiPermanentToughnessBoost() { - return semiPermanentToughnessBoost; - } - - public final void addSemiPermanentPowerBoost(final int n, final boolean updateViewImmediately) { - if (n == 0) { return; } - semiPermanentPowerBoost += n; - if (updateViewImmediately) { - currentState.getView().updatePower(this); + int result = 0; + for (Pair pair : boostPT.values()) { + if (pair.getRight() != null) { + result += pair.getRight(); + } } + return result; } - public final void addSemiPermanentToughnessBoost(final int n, final boolean updateViewImmediately) { - if (n == 0) { return; } - semiPermanentToughnessBoost += n; - if (updateViewImmediately) { - currentState.getView().updateToughness(this); + public void addPTBoost(final Integer power, final Integer toughness, final long timestamp) { + boostPT.put(timestamp, Pair.of(power, toughness)); + } + + public void removePTBoost(final long timestamp) { + boostPT.remove(timestamp); + } + + public Map> getPTBoostMap() { + return ImmutableMap.copyOf(boostPT); + } + + public void setPTBoost(Map> map) { + this.boostPT.clear(); + for (Map.Entry> e : map.entrySet()) { + this.boostPT.put(e.getKey(), Pair.of(e.getValue().getLeft(), e.getValue().getRight())); } } - public final void setSemiPermanentPowerBoost(final int n) { - if (semiPermanentPowerBoost == n) { return; } - semiPermanentPowerBoost = n; - currentState.getView().updatePower(this); - } - - public final void setSemiPermanentToughnessBoost(final int n) { - if (semiPermanentToughnessBoost == n) { return; } - semiPermanentToughnessBoost = n; - currentState.getView().updateToughness(this); - } - public final boolean isUntapped() { return !tapped; } diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index f96d0f8af38..014515eb063 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -251,8 +251,8 @@ public final class CardUtil { } // lock in the current P/T without bonus from counters - newCopy.setBasePower(in.getCurrentPower() + in.getTempPowerBoost() + in.getSemiPermanentPowerBoost()); - newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost() + in.getSemiPermanentToughnessBoost()); + newCopy.setBasePower(in.getCurrentPower() + in.getTempPowerBoost()); + newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost()); newCopy.setCounters(Maps.newEnumMap(in.getCounters())); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 3d53912f961..4126ddca865 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -179,17 +179,11 @@ public final class StaticAbilityContinuous { if (layer == StaticAbilityLayer.MODIFYPT && params.containsKey("AddPower")) { addP = params.get("AddPower"); powerBonus = AbilityUtils.calculateAmount(hostCard, addP, stAb, true); - if (!StringUtils.isNumeric(addP) && !addP.equals("AffectedX")) { - se.setXValue(powerBonus); - } } if (layer == StaticAbilityLayer.MODIFYPT && params.containsKey("AddToughness")) { addT = params.get("AddToughness"); toughnessBonus = AbilityUtils.calculateAmount(hostCard, addT, stAb, true); - if (!StringUtils.isNumeric(addT) && !addT.equals("AffectedX")) { - se.setYValue(toughnessBonus); - } } if (params.containsKey("KeywordMultiplier")) { @@ -547,14 +541,11 @@ public final class StaticAbilityContinuous { if (layer == StaticAbilityLayer.MODIFYPT) { if (addP.startsWith("AffectedX")) { powerBonus = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, addP)); - se.addXMapValue(affectedCard, powerBonus); } if (addT.startsWith("AffectedX")) { toughnessBonus = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, addT)); - se.addXMapValue(affectedCard, toughnessBonus); } - affectedCard.addSemiPermanentPowerBoost(powerBonus, false); - affectedCard.addSemiPermanentToughnessBoost(toughnessBonus, false); + affectedCard.addPTBoost(powerBonus, toughnessBonus, se.getTimestamp()); } // add keywords From 7a760bb37f6bbe98b41d2ba57e89ee05aa4c5220 Mon Sep 17 00:00:00 2001 From: NikolayHD Date: Sun, 1 Sep 2019 14:58:54 +0300 Subject: [PATCH 08/68] Support overlapped reproducing of same AudioClip when playing same sound in a batch, like auto-tapping N lands or drawing 7 cards in mulligane --- .../src/main/java/forge/sound/AudioClip.java | 208 +++++++++++------- 1 file changed, 133 insertions(+), 75 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java index 831dc2806c6..105dadd8882 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java @@ -24,6 +24,8 @@ import forge.properties.ForgeConstants; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.MissingResourceException; import java.util.function.Supplier; @@ -35,9 +37,10 @@ import java.util.function.Supplier; * @author Agetian */ public class AudioClip implements IAudioClip { - private Clip clip; - private boolean started; - private boolean looping; + private final int maxSize = 16; + private String filename; + private List clips; + private boolean failed; public static boolean fileExists(String fileName) { File fSound = new File(ForgeConstants.SOUND_DIR, fileName); @@ -45,100 +48,62 @@ public class AudioClip implements IAudioClip { } public AudioClip(final String filename) { - File fSound = new File(ForgeConstants.SOUND_DIR, filename); - if (!fSound.exists()) { - throw new IllegalArgumentException("Sound file " + fSound.toString() + " does not exist, cannot make a clip of it"); - } - - try { - AudioInputStream stream = AudioSystem.getAudioInputStream(fSound); - AudioFormat format = stream.getFormat(); - DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), ((int) stream.getFrameLength() * format.getFrameSize())); - clip = (Clip) AudioSystem.getLine(info); - clip.addLineListener(this::lineStatusChanged); - clip.open(stream); - return; - - } catch (IOException ex) { - System.err.println("Unable to load sound file: " + filename); - } catch (LineUnavailableException ex) { - System.err.println("Error initializing sound system: " + ex); - } catch (UnsupportedAudioFileException ex) { - System.err.println("Unsupported file type of the sound file: " + fSound.toString() + " - " + ex.getMessage()); - clip = null; - return; - } - throw new MissingResourceException("Sound clip failed to load", this.getClass().getName(), filename); + this.filename = filename; + clips = new ArrayList<>(maxSize); + addClip(); } @Override public final void play() { - if (null == clip) { - return; - } - synchronized (this) { - if (clip.isRunning()) { - // introduce small delay to make a batch sounds more granular, - // e.g. when you auto-tap 4 lands the 4 tap sounds should - // not become completely merged - waitSoundSystemDelay(); - } - clip.setMicrosecondPosition(0); - if (!this.looping && clip.isRunning()) { - return; - } - this.started = false; - clip.start(); - wait(() -> this.started); + if (clips.stream().anyMatch(ClipWrapper::isRunning)) { + // introduce small delay to make a batch sounds more granular, + // e.g. when you auto-tap 4 lands the 4 tap sounds should + // not become completely merged + waitSoundSystemDelay(); } + getIdleClip().start(); } @Override public final void loop() { - if (null == clip) { - return; - } - synchronized (this) { - clip.setMicrosecondPosition(0); - if (this.looping && clip.isRunning()) { - return; - } - this.started = false; - clip.loop(Clip.LOOP_CONTINUOUSLY); - wait(() -> this.started); - this.looping = true; - } + getIdleClip().loop(); } @Override public final void stop() { - if (null == clip) { - return; - } - synchronized (this) { + for (ClipWrapper clip: clips) { clip.stop(); - this.looping = false; } } @Override public final boolean isDone() { - if (null == clip) { - return false; - } - return !clip.isRunning(); + return clips.stream().noneMatch(ClipWrapper::isRunning); } - private void wait(Supplier completed) { - final int attempts = 5; - for (int i = 0; i < attempts; i++) { - if (completed.get() || !waitSoundSystemDelay()) { - break; + private ClipWrapper getIdleClip() { + return clips.stream() + .filter(clip -> !clip.isRunning()) + .findFirst() + .orElseGet(this::addClip); + } + + private ClipWrapper addClip() { + if (clips.size() < maxSize && !failed) { + ClipWrapper clip = new ClipWrapper(filename); + if (clip.isFailed()) { + failed = true; + } else { + clips.add(clip); } + return clip; } + return ClipWrapper.Dummy; } - private boolean waitSoundSystemDelay() { + + + private static boolean waitSoundSystemDelay() { try { Thread.sleep(SoundSystem.DELAY); return true; @@ -148,8 +113,101 @@ public class AudioClip implements IAudioClip { } } - private void lineStatusChanged(LineEvent line) { - LineEvent.Type status = line.getType(); - this.started |= status == LineEvent.Type.START; + static class ClipWrapper { + private final Clip clip; + private boolean started; + static final ClipWrapper Dummy = new ClipWrapper(); + + private ClipWrapper() { + clip = null; + } + + ClipWrapper(String filename) { + clip = createClip(filename); + if (clip != null) { + clip.addLineListener(this::clipStateChanged); + } + } + + boolean isFailed() { + return null == clip; + } + + void start() { + if (null == clip) { + return; + } + synchronized (this) { + clip.setMicrosecondPosition(0); + this.started = false; + clip.start(); + // with JRE 1.8.0_211 if another thread called clip.setMicrosecondPosition + // just now, it would deadlock. To prevent this we synchronize this method + // and wait + wait(() -> this.started); + } + } + + void loop() { + if (null == clip) { + return; + } + synchronized (this) { + clip.setMicrosecondPosition(0); + this.started = false; + clip.loop(Clip.LOOP_CONTINUOUSLY); + wait(() -> this.started); + } + } + + void stop() { + if (null == clip) { + return; + } + synchronized (this) { + clip.stop(); + } + } + + boolean isRunning() { + return clip != null && (clip.isRunning() || clip.isActive()); + } + + private Clip createClip(String filename) { + File fSound = new File(ForgeConstants.SOUND_DIR, filename); + if (!fSound.exists()) { + throw new IllegalArgumentException("Sound file " + fSound.toString() + " does not exist, cannot make a clip of it"); + } + + try { + AudioInputStream stream = AudioSystem.getAudioInputStream(fSound); + AudioFormat format = stream.getFormat(); + DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), ((int) stream.getFrameLength() * format.getFrameSize())); + Clip clip = (Clip) AudioSystem.getLine(info); + clip.open(stream); + return clip; + } catch (IOException ex) { + System.err.println("Unable to load sound file: " + filename); + } catch (LineUnavailableException ex) { + System.err.println("Error initializing sound system: " + ex); + } catch (UnsupportedAudioFileException ex) { + System.err.println("Unsupported file type of the sound file: " + fSound.toString() + " - " + ex.getMessage()); + return null; + } + throw new MissingResourceException("Sound clip failed to load", this.getClass().getName(), filename); + } + + private void clipStateChanged(LineEvent lineEvent) { + started |= lineEvent.getType() == LineEvent.Type.START; + } + + private void wait(Supplier completed) { + final int attempts = 5; + for (int i = 0; i < attempts; i++) { + if (completed.get() || !waitSoundSystemDelay()) { + break; + } + } + } } } From c55ec0668856748b1c42a3c649ca0677844aaab8 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 2 Sep 2019 04:49:08 +0000 Subject: [PATCH 09/68] PumpEffect: fix PT update for view --- .../forge/game/ability/effects/PumpAllEffect.java | 11 ++++++++++- .../java/forge/game/ability/effects/PumpEffect.java | 6 +++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index 2498893019e..ea9dcb5f80a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -49,8 +49,17 @@ public class PumpAllEffect extends SpellAbilityEffect { continue; } - tgtC.addPTBoost(a, d, timestamp); + boolean redrawPT = false; + + if (a > 0 || d > 0) { + tgtC.addPTBoost(a, d, timestamp); + redrawPT = true; + } + tgtC.addChangedCardKeywords(kws, null, false, false, timestamp); + if (redrawPT) { + tgtC.updatePowerToughnessForView(); + } for (String kw : hiddenkws) { tgtC.addHiddenExtrinsicKeyword(kw); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 06a52878346..591dcf525ad 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -55,7 +55,11 @@ public class PumpEffect extends SpellAbilityEffect { } } - gameCard.addPTBoost(a, d,timestamp); + if (a > 0 || d > 0) { + gameCard.addPTBoost(a, d, timestamp); + redrawPT = true; + } + gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); if (redrawPT) { gameCard.updatePowerToughnessForView(); From a7ee697d0f3c6cdd6af0f765d48c9e856a63e346 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 2 Sep 2019 10:28:50 +0300 Subject: [PATCH 10/68] - Move a test outside the loop where it makes more sense --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index ae728a26dc7..91041b9767a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -1218,10 +1218,10 @@ public class AttachAi extends SpellAbilityAi { if (isUsefulAttachKeyword(keyword, c, sa, pow)) { return true; } - if (c.hasKeyword(Keyword.INFECT) && pow >= 2) { - // consider +2 power a significant bonus on Infect creatures - return true; - } + } + if (c.hasKeyword(Keyword.INFECT) && pow >= 2) { + // consider +2 power a significant bonus on Infect creatures + return true; } return false; } From c38bae910a01dd7f0c30738cb834aa6d4ca85bdc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 2 Sep 2019 18:08:56 +0800 Subject: [PATCH 11/68] Refactor/Code Cleanup --- forge-ai/src/main/java/forge/ai/AIOption.java | 2 +- .../java/forge/ai/AiAttackController.java | 13 +- .../main/java/forge/ai/AiBlockController.java | 14 +- .../src/main/java/forge/ai/AiCardMemory.java | 4 +- .../src/main/java/forge/ai/AiController.java | 31 +- .../main/java/forge/ai/AiCostDecision.java | 8 +- .../main/java/forge/ai/AiPlayDecision.java | 2 +- .../src/main/java/forge/ai/ComputerUtil.java | 85 +- .../main/java/forge/ai/ComputerUtilCard.java | 14 +- .../java/forge/ai/ComputerUtilCombat.java | 36 +- .../main/java/forge/ai/ComputerUtilCost.java | 4 +- .../main/java/forge/ai/ComputerUtilMana.java | 6 +- .../src/main/java/forge/ai/GameState.java | 4 +- .../java/forge/ai/PlayerControllerAi.java | 6 +- .../src/main/java/forge/ai/SpecialCardAi.java | 82 +- .../main/java/forge/ai/SpellAbilityAi.java | 5 +- .../forge/ai/ability/ActivateAbilityAi.java | 5 +- .../main/java/forge/ai/ability/AddTurnAi.java | 6 +- .../main/java/forge/ai/ability/AmassAi.java | 9 +- .../main/java/forge/ai/ability/AnimateAi.java | 18 +- .../java/forge/ai/ability/AnimateAllAi.java | 6 +- .../main/java/forge/ai/ability/AttachAi.java | 145 ++-- .../java/forge/ai/ability/ChangeZoneAi.java | 57 +- .../forge/ai/ability/ChangeZoneAllAi.java | 31 +- .../java/forge/ai/ability/ChooseCardAi.java | 30 +- .../java/forge/ai/ability/ChooseColorAi.java | 5 +- .../forge/ai/ability/ChooseDirectionAi.java | 4 +- .../ai/ability/ChooseGenericEffectAi.java | 4 +- .../java/forge/ai/ability/ChooseSourceAi.java | 9 +- .../main/java/forge/ai/ability/CloneAi.java | 5 +- .../java/forge/ai/ability/ControlGainAi.java | 13 +- .../java/forge/ai/ability/CountersMoveAi.java | 33 +- .../forge/ai/ability/CountersMultiplyAi.java | 19 +- .../ai/ability/CountersProliferateAi.java | 7 +- .../java/forge/ai/ability/CountersPutAi.java | 22 +- .../forge/ai/ability/CountersRemoveAi.java | 2 +- .../java/forge/ai/ability/DamageAiBase.java | 4 +- .../java/forge/ai/ability/DamageAllAi.java | 16 +- .../java/forge/ai/ability/DamageDealAi.java | 18 +- .../main/java/forge/ai/ability/DebuffAi.java | 2 +- .../forge/ai/ability/DelayedTriggerAi.java | 2 +- .../main/java/forge/ai/ability/DestroyAi.java | 23 +- .../java/forge/ai/ability/DestroyAllAi.java | 14 +- .../java/forge/ai/ability/DrainManaAi.java | 5 +- .../main/java/forge/ai/ability/DrawAi.java | 24 +- .../main/java/forge/ai/ability/EffectAi.java | 12 +- .../main/java/forge/ai/ability/FightAi.java | 12 +- .../java/forge/ai/ability/FlipACoinAi.java | 4 +- .../main/java/forge/ai/ability/GameWinAi.java | 5 +- .../ai/ability/LifeExchangeVariantAi.java | 4 +- .../java/forge/ai/ability/LifeGainAi.java | 22 +- .../java/forge/ai/ability/LifeLoseAi.java | 20 +- .../java/forge/ai/ability/ManaEffectAi.java | 9 +- .../java/forge/ai/ability/ManifestAi.java | 13 +- .../main/java/forge/ai/ability/MillAi.java | 26 +- .../forge/ai/ability/PeekAndRevealAi.java | 4 +- .../java/forge/ai/ability/PermanentAi.java | 9 +- .../forge/ai/ability/PermanentCreatureAi.java | 14 +- .../ai/ability/PermanentNoncreatureAi.java | 11 +- .../main/java/forge/ai/ability/PhasesAi.java | 4 +- .../main/java/forge/ai/ability/PlayAi.java | 6 +- .../main/java/forge/ai/ability/PoisonAi.java | 24 +- .../main/java/forge/ai/ability/ProtectAi.java | 11 +- .../main/java/forge/ai/ability/PumpAi.java | 45 +- .../java/forge/ai/ability/PumpAiBase.java | 310 +++----- .../main/java/forge/ai/ability/PumpAllAi.java | 5 +- .../forge/ai/ability/RemoveFromCombatAi.java | 4 +- .../main/java/forge/ai/ability/RepeatAi.java | 4 +- .../java/forge/ai/ability/RepeatEachAi.java | 8 +- .../main/java/forge/ai/ability/RevealAi.java | 6 +- .../java/forge/ai/ability/RevealHandAi.java | 6 +- .../forge/ai/ability/RollPlanarDiceAi.java | 2 +- .../java/forge/ai/ability/SacrificeAi.java | 4 +- .../main/java/forge/ai/ability/ScryAi.java | 4 +- .../java/forge/ai/ability/SetStateAi.java | 23 +- .../java/forge/ai/ability/SkipTurnAi.java | 5 +- .../main/java/forge/ai/ability/SurveilAi.java | 4 +- .../src/main/java/forge/ai/ability/TapAi.java | 9 +- .../main/java/forge/ai/ability/TapAiBase.java | 14 +- .../main/java/forge/ai/ability/TapAllAi.java | 4 +- .../main/java/forge/ai/ability/TokenAi.java | 20 +- .../java/forge/ai/ability/UnattachAllAi.java | 4 +- .../main/java/forge/ai/ability/UntapAi.java | 34 +- .../ai/simulation/PossibleTargetSelector.java | 2 +- .../SpellAbilityChoicesIterator.java | 2 +- .../ai/simulation/SpellAbilityPicker.java | 4 +- .../main/java/forge/CardStorageReader.java | 2 +- forge-core/src/main/java/forge/ImageKeys.java | 6 +- .../src/main/java/forge/LobbyPlayer.java | 9 +- .../src/main/java/forge/card/CardDb.java | 4 +- .../src/main/java/forge/card/CardEdition.java | 2 +- .../src/main/java/forge/card/CardFace.java | 4 +- .../java/forge/card/CardFacePredicates.java | 7 +- .../src/main/java/forge/card/CardRarity.java | 2 +- .../java/forge/card/CardRulesPredicates.java | 4 +- .../main/java/forge/card/CardSplitType.java | 2 +- .../src/main/java/forge/card/CardType.java | 7 +- .../src/main/java/forge/card/ICardFace.java | 2 +- .../src/main/java/forge/card/MagicColor.java | 2 +- .../main/java/forge/card/mana/ManaAtom.java | 2 +- .../main/java/forge/card/mana/ManaCost.java | 2 +- .../java/forge/card/mana/ManaCostShard.java | 4 +- .../src/main/java/forge/deck/DeckFormat.java | 11 +- .../main/java/forge/deck/DeckRecognizer.java | 5 +- .../src/main/java/forge/deck/DeckSection.java | 2 +- .../deck/generation/DeckGeneratorBase.java | 2 +- .../src/main/java/forge/item/PaperCard.java | 12 +- .../src/main/java/forge/util/Base64Coder.java | 5 +- .../main/java/forge/util/ComparableOp.java | 2 +- .../src/main/java/forge/util/ImageUtil.java | 3 +- forge-core/src/main/java/forge/util/Lang.java | 2 +- .../util/LocalizationChangeObserver.java | 2 +- .../src/main/java/forge/util/Localizer.java | 16 +- .../java/forge/util/storage/StorageBase.java | 2 +- .../src/main/java/forge/GameCommand.java | 2 +- .../main/java/forge/game/CardTraitBase.java | 8 +- .../src/main/java/forge/game/ForgeScript.java | 122 +-- forge-game/src/main/java/forge/game/Game.java | 2 +- .../src/main/java/forge/game/GameAction.java | 4 +- .../main/java/forge/game/GameActionUtil.java | 2 +- .../src/main/java/forge/game/GameEntity.java | 6 +- .../src/main/java/forge/game/GameFormat.java | 2 +- .../java/forge/game/GameLogEntryType.java | 2 +- .../java/forge/game/GameLogFormatter.java | 8 +- .../src/main/java/forge/game/GameStage.java | 2 +- .../src/main/java/forge/game/GameType.java | 4 +- .../java/forge/game/GlobalRuleChange.java | 2 +- .../main/java/forge/game/IIdentifiable.java | 4 +- .../forge/game/ability/AbilityFactory.java | 2 +- .../java/forge/game/ability/AbilityUtils.java | 9 +- .../effects/ActivateAbilityEffect.java | 2 +- .../ability/effects/AssignGroupEffect.java | 2 +- .../game/ability/effects/BidLifeEffect.java | 2 +- .../ability/effects/ChangeTextEffect.java | 4 +- .../ability/effects/ChangeZoneEffect.java | 2 +- .../ability/effects/ChooseCardEffect.java | 2 +- .../ability/effects/ChooseGenericEffect.java | 4 +- .../game/ability/effects/CloneEffect.java | 2 +- .../ability/effects/ControlGainEffect.java | 2 +- .../ability/effects/CopyPermanentEffect.java | 2 +- .../ability/effects/CountersRemoveEffect.java | 2 +- .../ability/effects/DelayedTriggerEffect.java | 4 +- .../effects/ImmediateTriggerEffect.java | 4 +- .../game/ability/effects/LifeLoseEffect.java | 4 +- .../ability/effects/ProtectAllEffect.java | 2 +- .../game/ability/effects/ProtectEffect.java | 2 +- .../game/ability/effects/PumpEffect.java | 10 +- .../src/main/java/forge/game/card/Card.java | 53 +- .../java/forge/game/card/CardFactory.java | 10 +- .../java/forge/game/card/CardFactoryUtil.java | 36 +- .../java/forge/game/card/CardPlayOption.java | 2 +- .../java/forge/game/card/CardPredicates.java | 4 +- .../java/forge/game/card/CardProperty.java | 733 +++++------------- .../main/java/forge/game/card/CardState.java | 4 +- .../main/java/forge/game/card/CardUtil.java | 12 +- .../main/java/forge/game/card/CardView.java | 14 +- .../java/forge/game/card/token/TokenInfo.java | 2 +- .../forge/game/combat/AttackConstraints.java | 8 +- .../forge/game/combat/AttackRequirement.java | 4 +- .../main/java/forge/game/combat/Combat.java | 12 +- .../java/forge/game/combat/CombatLki.java | 2 +- .../java/forge/game/combat/CombatUtil.java | 23 +- .../game/combat/GlobalAttackRestrictions.java | 2 +- .../java/forge/game/cost/CostAdjustment.java | 11 +- .../java/forge/game/cost/CostDiscard.java | 15 +- .../main/java/forge/game/cost/CostExert.java | 4 +- .../main/java/forge/game/cost/CostExile.java | 4 +- .../forge/game/cost/CostExileFromStack.java | 6 +- .../java/forge/game/cost/CostGainControl.java | 5 +- .../forge/game/cost/CostPartWithList.java | 2 +- .../java/forge/game/cost/CostPayLife.java | 6 +- .../forge/game/cost/CostPutCardToLib.java | 4 +- .../java/forge/game/cost/CostPutCounter.java | 9 +- .../forge/game/cost/CostRemoveCounter.java | 8 +- .../main/java/forge/game/cost/CostReturn.java | 9 +- .../main/java/forge/game/cost/CostReveal.java | 11 +- .../java/forge/game/cost/CostSacrifice.java | 9 +- .../java/forge/game/cost/CostTapType.java | 6 +- .../java/forge/game/cost/CostUnattach.java | 13 +- .../java/forge/game/cost/CostUntapType.java | 5 +- .../java/forge/game/cost/ICostVisitor.java | 58 +- .../game/event/GameEventCardDamaged.java | 2 +- .../game/event/GameEventCardStatsChanged.java | 2 +- .../forge/game/event/IGameEventVisitor.java | 2 +- .../main/java/forge/game/keyword/Keyword.java | 6 +- .../forge/game/keyword/KeywordInstance.java | 8 +- .../forge/game/keyword/KeywordInterface.java | 24 +- .../game/keyword/KeywordWithCostAndType.java | 2 +- .../java/forge/game/keyword/Ninjutsu.java | 2 +- .../main/java/forge/game/mana/ManaPool.java | 7 +- .../forge/game/mulligan/MulliganService.java | 2 +- .../java/forge/game/phase/PhaseHandler.java | 2 +- .../main/java/forge/game/phase/PhaseType.java | 4 +- .../src/main/java/forge/game/phase/Untap.java | 17 +- .../main/java/forge/game/player/Player.java | 62 +- .../forge/game/player/PlayerController.java | 4 +- .../forge/game/player/PlayerProperty.java | 170 +--- .../game/replacement/ReplaceAddCounter.java | 4 +- .../game/replacement/ReplaceCounter.java | 4 +- .../game/replacement/ReplaceDestroy.java | 4 +- .../game/replacement/ReplaceDiscard.java | 4 +- .../forge/game/replacement/ReplaceDraw.java | 8 +- .../game/replacement/ReplaceDrawCards.java | 4 +- .../game/replacement/ReplaceGainLife.java | 4 +- .../game/replacement/ReplaceGameLoss.java | 4 +- .../forge/game/replacement/ReplaceMoved.java | 4 +- .../game/replacement/ReplaceProduceMana.java | 4 +- .../game/replacement/ReplaceSetInMotion.java | 4 +- .../game/replacement/ReplaceSurveil.java | 4 +- .../forge/game/replacement/ReplaceToken.java | 4 +- .../game/replacement/ReplaceTurnFaceUp.java | 4 +- .../forge/game/replacement/ReplaceUntap.java | 4 +- .../game/replacement/ReplacementResult.java | 2 +- .../game/replacement/ReplacementType.java | 2 +- .../game/spellability/AbilityManaPart.java | 11 +- .../forge/game/spellability/SpellAbility.java | 17 +- .../spellability/SpellAbilityCondition.java | 4 +- .../spellability/SpellAbilityRestriction.java | 22 +- .../SpellAbilityStackInstance.java | 2 +- .../game/spellability/SpellPermanent.java | 2 +- .../game/spellability/TargetRestrictions.java | 4 +- .../game/staticability/StaticAbility.java | 12 +- .../StaticAbilityCantAttach.java | 4 +- .../StaticAbilityCantAttackBlock.java | 6 +- .../StaticAbilityCantBeCast.java | 20 +- .../StaticAbilityCantPutCounter.java | 22 +- .../StaticAbilityCantTarget.java | 2 +- .../StaticAbilityContinuous.java | 2 +- .../staticability/StaticAbilityETBTapped.java | 8 +- .../main/java/forge/game/trigger/Trigger.java | 22 +- .../forge/game/trigger/TriggerAbandoned.java | 6 +- .../java/forge/game/trigger/TriggerAdapt.java | 6 +- .../forge/game/trigger/TriggerAttached.java | 4 +- .../game/trigger/TriggerAttackerBlocked.java | 4 +- .../TriggerAttackerBlockedByCreature.java | 8 +- .../trigger/TriggerAttackerUnblocked.java | 6 +- .../trigger/TriggerAttackerUnblockedOnce.java | 6 +- .../trigger/TriggerAttackersDeclared.java | 4 +- .../forge/game/trigger/TriggerAttacks.java | 4 +- .../game/trigger/TriggerBecomeMonarch.java | 6 +- .../game/trigger/TriggerBecomeMonstrous.java | 6 +- .../game/trigger/TriggerBecomeRenowned.java | 6 +- .../game/trigger/TriggerBecomesTarget.java | 4 +- .../trigger/TriggerBecomesTargetOnce.java | 4 +- .../forge/game/trigger/TriggerBlocks.java | 6 +- .../forge/game/trigger/TriggerChampioned.java | 6 +- .../trigger/TriggerChangesController.java | 6 +- .../game/trigger/TriggerChangesZoneAll.java | 6 +- .../forge/game/trigger/TriggerClashed.java | 4 +- .../game/trigger/TriggerCounterAdded.java | 4 +- .../game/trigger/TriggerCounterAddedAll.java | 6 +- .../game/trigger/TriggerCounterAddedOnce.java | 6 +- .../game/trigger/TriggerCounterRemoved.java | 4 +- .../trigger/TriggerCounterRemovedOnce.java | 4 +- .../forge/game/trigger/TriggerCountered.java | 4 +- .../forge/game/trigger/TriggerCycled.java | 6 +- .../game/trigger/TriggerDamageDealtOnce.java | 4 +- .../game/trigger/TriggerDamageDoneOnce.java | 4 +- .../forge/game/trigger/TriggerDestroyed.java | 4 +- .../forge/game/trigger/TriggerDevoured.java | 6 +- .../forge/game/trigger/TriggerDiscarded.java | 4 +- .../java/forge/game/trigger/TriggerDrawn.java | 6 +- .../forge/game/trigger/TriggerEvolved.java | 6 +- .../forge/game/trigger/TriggerExerted.java | 6 +- .../forge/game/trigger/TriggerExiled.java | 6 +- .../forge/game/trigger/TriggerExploited.java | 6 +- .../forge/game/trigger/TriggerExplores.java | 6 +- .../java/forge/game/trigger/TriggerFight.java | 6 +- .../game/trigger/TriggerFlippedCoin.java | 4 +- .../forge/game/trigger/TriggerHandler.java | 6 +- .../game/trigger/TriggerInvestigated.java | 4 +- .../forge/game/trigger/TriggerLandPlayed.java | 4 +- .../forge/game/trigger/TriggerLifeGained.java | 4 +- .../forge/game/trigger/TriggerLifeLost.java | 4 +- .../forge/game/trigger/TriggerLosesGame.java | 6 +- .../trigger/TriggerPayCumulativeUpkeep.java | 6 +- .../forge/game/trigger/TriggerPayEcho.java | 6 +- .../forge/game/trigger/TriggerPayLife.java | 4 +- .../java/forge/game/trigger/TriggerPhase.java | 6 +- .../forge/game/trigger/TriggerPhaseIn.java | 6 +- .../forge/game/trigger/TriggerPhaseOut.java | 10 +- .../forge/game/trigger/TriggerPlanarDice.java | 4 +- .../game/trigger/TriggerRegenerated.java | 4 +- .../forge/game/trigger/TriggerRevealed.java | 4 +- .../forge/game/trigger/TriggerSacrificed.java | 3 +- .../java/forge/game/trigger/TriggerScry.java | 6 +- .../game/trigger/TriggerSearchedLibrary.java | 4 +- .../game/trigger/TriggerSetInMotion.java | 8 +- .../forge/game/trigger/TriggerShuffled.java | 4 +- .../game/trigger/TriggerSpellAbilityCast.java | 4 +- .../game/trigger/TriggerSpellAbilityCopy.java | 6 +- .../forge/game/trigger/TriggerSurveil.java | 4 +- .../java/forge/game/trigger/TriggerTaps.java | 8 +- .../game/trigger/TriggerTapsForMana.java | 4 +- .../game/trigger/TriggerTransformed.java | 6 +- .../forge/game/trigger/TriggerTurnBegin.java | 6 +- .../forge/game/trigger/TriggerTurnFaceUp.java | 6 +- .../java/forge/game/trigger/TriggerType.java | 2 +- .../forge/game/trigger/TriggerUnattach.java | 6 +- .../forge/game/trigger/TriggerUntaps.java | 6 +- .../main/java/forge/game/zone/MagicStack.java | 2 +- .../main/java/forge/game/zone/PlayerZone.java | 5 +- .../src/main/java/forge/game/zone/Zone.java | 8 +- .../main/java/forge/game/zone/ZoneType.java | 4 +- .../forge/trackable/TrackableProperty.java | 4 +- .../src/main/java/forge/util/MessageUtil.java | 2 +- .../deckeditor/controllers/CEditorQuest.java | 2 +- .../controllers/CEditorQuestCardShop.java | 8 +- .../controllers/CEditorTokenViewer.java | 8 +- .../home/gauntlet/ContestGauntletLister.java | 4 +- .../home/gauntlet/QuickGauntletLister.java | 4 +- .../screens/home/quest/VSubmenuQuestData.java | 2 +- .../forge/screens/home/quest/ViewItem.java | 2 +- .../java/forge/screens/match/CMatchUI.java | 1 - .../forge/screens/match/VAssignDamage.java | 2 +- .../forge/toolbox/imaging/FImagePanel.java | 2 +- .../toolbox/special/PlayerDetailsPanel.java | 2 +- .../java/forge/view/arcane/CardPanel.java | 2 +- .../PlanarConquestCommanderGeneraterGA.java | 2 +- .../PlanarConquestGeneraterGA.java | 6 +- forge-gui-mobile-dev/src/forge/app/Main.java | 2 +- .../src/forge/animation/AbilityEffect.java | 2 +- .../src/forge/animation/GifDecoder.java | 4 +- .../src/forge/assets/BitmapFontWriter.java | 4 +- forge-gui-mobile/src/forge/card/CardZoom.java | 2 +- .../src/forge/deck/FDeckEditor.java | 2 +- .../src/forge/itemmanager/ItemManager.java | 5 +- .../src/forge/menu/FDropDown.java | 5 +- .../src/forge/menu/FDropDownMenu.java | 5 +- .../screens/constructed/PlayerPanel.java | 2 +- .../screens/gauntlet/NewGauntletScreen.java | 6 +- .../src/forge/screens/home/LoadGameMenu.java | 2 +- .../src/forge/screens/home/NewGameMenu.java | 2 +- .../src/forge/screens/match/views/VStack.java | 2 +- .../src/forge/screens/online/OnlineMenu.java | 2 +- .../src/forge/sound/AudioClip.java | 5 +- .../src/forge/toolbox/FDialog.java | 6 +- .../src/forge/toolbox/FEvent.java | 2 +- .../src/forge/toolbox/FScrollPane.java | 4 +- .../achievement/AchievementCollection.java | 4 +- .../achievement/ChallengeAchievements.java | 9 +- .../forge/achievement/MatchWinStreak.java | 5 +- .../java/forge/achievement/VariantWins.java | 4 +- .../src/main/java/forge/assets/FSkinProp.java | 2 +- .../main/java/forge/card/CardDetailUtil.java | 2 +- .../forge/card/CardReaderExperiments.java | 2 +- .../java/forge/card/CardScriptParser.java | 20 +- .../forge/deck/CardArchetypeLDAGenerator.java | 2 +- .../deck/CardRelationMatrixGenerator.java | 6 +- .../src/main/java/forge/deck/DeckType.java | 2 +- .../forge/download/GuiDownloadZipService.java | 2 +- .../java/forge/error/ExceptionHandler.java | 2 +- .../java/forge/gauntlet/GauntletData.java | 2 +- .../java/forge/interfaces/IDevModeCheats.java | 2 +- .../java/forge/interfaces/IMayViewCards.java | 2 +- .../forge/itemmanager/AdvancedSearch.java | 6 +- .../forge/itemmanager/ItemColumnConfig.java | 2 +- .../forge/itemmanager/ItemManagerConfig.java | 2 +- .../forge/itemmanager/ItemManagerModel.java | 2 +- .../forge/itemmanager/SItemManagerUtil.java | 4 +- .../main/java/forge/limited/BoosterDraft.java | 2 +- .../CardThemedConquestDeckBuilder.java | 2 +- .../forge/limited/CardThemedDeckBuilder.java | 2 +- .../java/forge/limited/LimitedPoolType.java | 2 +- .../src/main/java/forge/match/GameLobby.java | 6 +- .../main/java/forge/match/HostedMatch.java | 4 +- .../src/main/java/forge/match/LobbySlot.java | 2 +- .../main/java/forge/match/LobbySlotType.java | 2 +- .../src/main/java/forge/match/LocalLobby.java | 5 +- .../java/forge/match/NextGameDecision.java | 2 +- .../java/forge/match/input/InputLockUI.java | 2 +- .../src/main/java/forge/model/CardBlock.java | 5 +- .../src/main/java/forge/model/FModel.java | 2 +- .../src/main/java/forge/model/MetaSet.java | 2 +- .../src/main/java/forge/net/OfflineLobby.java | 5 +- .../main/java/forge/net/ProtocolMethod.java | 10 +- .../forge/net/client/GameClientHandler.java | 2 +- .../java/forge/net/server/FServerManager.java | 2 +- .../forge/net/server/ServerGameLobby.java | 5 +- .../planarconquest/ConquestCommander.java | 5 +- .../planarconquest/ConquestPreferences.java | 2 +- .../forge/planarconquest/ConquestUtil.java | 7 +- .../java/forge/player/GamePlayerUtil.java | 2 +- .../java/forge/player/HumanCostDecision.java | 4 +- .../src/main/java/forge/player/HumanPlay.java | 8 +- .../forge/player/HumanPlaySpellAbility.java | 2 +- .../forge/player/PlayerControllerHuman.java | 19 +- .../java/forge/player/PlayerZoneUpdates.java | 2 +- .../java/forge/properties/ForgeConstants.java | 2 +- .../forge/properties/ForgePreferences.java | 2 +- .../properties/ForgeProfileProperties.java | 2 +- .../src/main/java/forge/puzzle/Puzzle.java | 2 +- .../java/forge/quest/QuestController.java | 2 +- .../java/forge/quest/QuestDraftUtils.java | 6 +- .../forge/quest/QuestEventDifficulty.java | 2 +- .../java/forge/quest/QuestEventDraft.java | 1 - .../forge/quest/QuestEventDuelManager.java | 2 +- .../forge/quest/QuestEventLDADuelManager.java | 2 +- .../java/forge/quest/QuestRewardCard.java | 4 +- .../src/main/java/forge/quest/QuestUtil.java | 2 +- .../java/forge/quest/QuestUtilUnlockSets.java | 2 +- .../src/main/java/forge/quest/SellRules.java | 6 +- .../java/forge/quest/StartingPoolType.java | 2 +- .../forge/quest/bazaar/QuestItemType.java | 4 +- .../java/forge/quest/data/StarRating.java | 6 +- .../java/forge/sound/EventVisualizer.java | 2 +- .../src/main/java/forge/sound/IAudioClip.java | 8 +- .../main/java/forge/sound/MusicPlaylist.java | 2 +- .../java/forge/tournament/TournamentData.java | 2 +- .../tournament/system/TournamentSwiss.java | 2 +- .../main/java/forge/util/ImageFetcher.java | 4 +- 411 files changed, 1354 insertions(+), 3010 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AIOption.java b/forge-ai/src/main/java/forge/ai/AIOption.java index 3eea52dfc7e..66925e7f6b8 100644 --- a/forge-ai/src/main/java/forge/ai/AIOption.java +++ b/forge-ai/src/main/java/forge/ai/AIOption.java @@ -1,5 +1,5 @@ package forge.ai; public enum AIOption { - USE_SIMULATION; + USE_SIMULATION } diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 1a374d80660..35b2d140432 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -602,11 +602,7 @@ public class AiAttackController { return true; } - if (totalPoisonDamage >= 10 - opp.getPoisonCounters()) { - return true; - } - - return false; + return totalPoisonDamage >= 10 - opp.getPoisonCounters(); } private final GameEntity chooseDefender(final Combat c, final boolean bAssault) { @@ -1021,7 +1017,7 @@ public class AiAttackController { } // stay at home to block if ( LOG_AI_ATTACKS ) - System.out.println(String.valueOf(this.aiAggression) + " = ai aggression"); + System.out.println(this.aiAggression + " = ai aggression"); // **************** // Evaluation the end @@ -1454,10 +1450,7 @@ public class AiAttackController { if (color != null) { return color; } - if (artifact != null) { - return artifact; - } - return null; //should never get here + return artifact;//should never get here } private void doLightmineFieldAttackLogic(List attackersLeft, int numForcedAttackers, boolean playAggro) { diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index e948d3cebfc..82df82ef46f 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -859,7 +859,7 @@ public class AiBlockController { damageToPW += ComputerUtilCombat.predictDamageTo((Card) def, pwatkr.getNetCombatDamage(), pwatkr, true); } } - if ((!onlyIfLethal && damageToPW > 0) || damageToPW >= ((Card) def).getCounters(CounterType.LOYALTY)) { + if ((!onlyIfLethal && damageToPW > 0) || damageToPW >= def.getCounters(CounterType.LOYALTY)) { threatenedPWs.add((Card) def); } } @@ -879,7 +879,7 @@ public class AiBlockController { if (!chumpPWDefenders.isEmpty()) { for (final Card attacker : attackers) { GameEntity def = combat.getDefenderByAttacker(attacker); - if (def instanceof Card && threatenedPWs.contains((Card) def)) { + if (def instanceof Card && threatenedPWs.contains(def)) { if (attacker.hasKeyword(Keyword.TRAMPLE)) { // don't bother trying to chump a trampling creature continue; @@ -914,7 +914,7 @@ public class AiBlockController { pwDefenders.addAll(combat.getBlockers(pwAtk)); } else { isFullyBlocked = false; - damageToPW += ComputerUtilCombat.predictDamageTo((Card) pw, pwAtk.getNetCombatDamage(), pwAtk, true); + damageToPW += ComputerUtilCombat.predictDamageTo(pw, pwAtk.getNetCombatDamage(), pwAtk, true); } } if (!isFullyBlocked && damageToPW >= pw.getCounters(CounterType.LOYALTY)) { @@ -1329,13 +1329,9 @@ public class AiBlockController { && ((Card) combat.getDefenderByAttacker(attacker)).isPlaneswalker(); boolean wantToTradeDownToSavePW = chanceToTradeDownToSaveWalker > 0; - if (((evalBlk <= evalAtk + 1) || (wantToSavePlaneswalker && wantToTradeDownToSavePW)) // "1" accounts for tapped. + return ((evalBlk <= evalAtk + 1) || (wantToSavePlaneswalker && wantToTradeDownToSavePW)) // "1" accounts for tapped. && powerParityOrHigher && (creatureParityOrAllowedDiff || wantToTradeWithCreatInHand) - && (MyRandom.percentTrue(chance) || wantToSavePlaneswalker)) { - return true; - } - - return false; + && (MyRandom.percentTrue(chance) || wantToSavePlaneswalker); } } diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index e0794076723..9e203710dd9 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -137,7 +137,7 @@ public class AiCardMemory { Set memorySet = getMemorySet(set); - return memorySet == null ? false : memorySet.contains(c); + return memorySet != null && memorySet.contains(c); } /** @@ -291,7 +291,7 @@ public class AiCardMemory { * @return true, if the given memory set contains no remembered cards. */ public boolean isMemorySetEmpty(MemorySet set) { - return set == null ? true : getMemorySet(set).isEmpty(); + return set == null || getMemorySet(set).isEmpty(); } /** diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index bc548e7079f..3a10b030309 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1516,13 +1516,9 @@ public class AiController { // Hopefully there's not much to do with the extra mana immediately, can wait for Main 2 return true; } - if ((predictedMana <= totalCMCInHand && canCastWithLandDrop) || (hasRelevantAbsOTB && !isTapLand) || hasLandBasedEffect) { - // Might need an extra land to cast something, or for some kind of an ETB ability with a cost or an - // alternative cost (if we cast it in Main 1), or to use an activated ability on the battlefield - return false; - } - - return true; + // Might need an extra land to cast something, or for some kind of an ETB ability with a cost or an + // alternative cost (if we cast it in Main 1), or to use an activated ability on the battlefield + return (predictedMana > totalCMCInHand || !canCastWithLandDrop) && (!hasRelevantAbsOTB || isTapLand) && !hasLandBasedEffect; } private final SpellAbility getSpellAbilityToPlay() { @@ -1641,12 +1637,8 @@ public class AiController { return SpellApiToAi.Converter.get(spell.getApi()).doTriggerAI(player, spell, mandatory); if (spell instanceof WrappedAbility) return doTrigger(((WrappedAbility)spell).getWrappedAbility(), mandatory); - if (spell.getPayCosts() == Cost.Zero && spell.getTargetRestrictions() == null) { - // For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about - return true; - } - - return false; + // For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about + return spell.getPayCosts() == Cost.Zero && spell.getTargetRestrictions() == null; } /** @@ -1690,16 +1682,11 @@ public class AiController { left = AbilityUtils.calculateAmount(hostCard, svarToCheck, sa); } System.out.println("aiShouldRun?" + left + comparator + compareTo); - if (Expressions.compare(left, comparator, compareTo)) { - return true; - } + return Expressions.compare(left, comparator, compareTo); } else if (effect.getMapParams().containsKey("AICheckDredge")) { return player.getCardsIn(ZoneType.Library).size() > 8 || player.isCardInPlay("Laboratory Maniac"); - } else if (sa != null && doTrigger(sa, false)) { - return true; - } + } else return sa != null && doTrigger(sa, false); - return false; } public List chooseSaToActivateFromOpeningHand(List usableFromOpeningHand) { @@ -2078,9 +2065,7 @@ public class AiController { // AI-specific restrictions specified as activation parameters in spell abilities if (sa.hasParam("AILifeThreshold")) { - if (player.getLife() <= Integer.parseInt(sa.getParam("AILifeThreshold"))) { - return false; - } + return player.getLife() > Integer.parseInt(sa.getParam("AILifeThreshold")); } return true; diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index c5ae2738f94..47dfbbd4d4b 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -56,7 +56,7 @@ public class AiCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(CostChooseCreatureType cost) { String choice = player.getController().chooseSomeType("Creature", ability, CardType.getAllCreatureTypes(), - Lists.newArrayList()); + Lists.newArrayList()); return PaymentDecision.type(choice); } @@ -475,7 +475,7 @@ public class AiCostDecision extends CostDecisionMakerBase { if (ability.getPayCosts().hasTapCost() && typeList.contains(ability.getHostCard())) { c--; } - source.setSVar("ChosenX", "Number$" + Integer.toString(c)); + source.setSVar("ChosenX", "Number$" + c); } else { if (!isVehicle) { c = AbilityUtils.calculateAmount(source, amount, ability); @@ -809,7 +809,7 @@ public class AiCostDecision extends CostDecisionMakerBase { final String sVar = ability.getSVar(amount); if (sVar.equals("XChoice")) { c = AbilityUtils.calculateAmount(source, "ChosenX", ability); - source.setSVar("ChosenX", "Number$" + String.valueOf(c)); + source.setSVar("ChosenX", "Number$" + c); } else if (amount.equals("All")) { c = source.getCounters(cost.counter); } else if (sVar.equals("Targeted$CardManaCost")) { @@ -865,7 +865,7 @@ public class AiCostDecision extends CostDecisionMakerBase { } typeList = CardLists.filter(typeList, Presets.TAPPED); c = typeList.size(); - source.setSVar("ChosenX", "Number$" + Integer.toString(c)); + source.setSVar("ChosenX", "Number$" + c); } else { c = AbilityUtils.calculateAmount(source, amount, ability); } diff --git a/forge-ai/src/main/java/forge/ai/AiPlayDecision.java b/forge-ai/src/main/java/forge/ai/AiPlayDecision.java index c3c41cd20ba..692badb6bd8 100644 --- a/forge-ai/src/main/java/forge/ai/AiPlayDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiPlayDecision.java @@ -17,5 +17,5 @@ public enum AiPlayDecision { WouldBecomeZeroToughnessCreature, WouldDestroyWorldEnchantment, BadEtbEffects, - CurseEffects; + CurseEffects } \ No newline at end of file diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index baf97df8181..ffc4d8815dd 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -423,7 +423,7 @@ public class ComputerUtil { int mana = ComputerUtilMana.getAvailableManaEstimate(ai, false); boolean cantAffordSoon = activate.getCMC() > mana + 1; - boolean wrongColor = !activate.determineColor().hasNoColorsExcept(ColorSet.fromNames(ComputerUtilCost.getAvailableManaColors(ai, ImmutableList.of())).getColor()); + boolean wrongColor = !activate.determineColor().hasNoColorsExcept(ColorSet.fromNames(ComputerUtilCost.getAvailableManaColors(ai, ImmutableList.of())).getColor()); // Only do this for spells, not activated abilities // We can't pay for this spell even if we play another land, or have wrong colors @@ -524,7 +524,7 @@ public class ComputerUtil { typeList = CardLists.filter(typeList, CardPredicates.canBeSacrificedBy(ability)); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { typeList.remove(target); // don't sacrifice the card we're pumping } @@ -554,7 +554,7 @@ public class ComputerUtil { final Card target, final int amount) { CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate, null); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { typeList.remove(target); // don't exile the card we're pumping } @@ -575,7 +575,7 @@ public class ComputerUtil { final Card target, final int amount) { CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate, null); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { typeList.remove(target); // don't move the card we're pumping } @@ -704,7 +704,7 @@ public class ComputerUtil { public static CardCollection chooseReturnType(final Player ai, final String type, final Card activate, final Card target, final int amount) { final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate, null); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { // don't bounce the card we're pumping typeList.remove(target); } @@ -794,12 +794,8 @@ public class ComputerUtil { if (c.hasSVar("SacMe") || ComputerUtilCard.evaluateCreature(c) < sacThreshold) { return true; } - - if (ComputerUtilCard.hasActiveUndyingOrPersist(c)) { - return true; - } - - return false; + + return ComputerUtilCard.hasActiveUndyingOrPersist(c); } }); } @@ -1107,10 +1103,8 @@ public class ComputerUtil { creatures2.add(creatures.get(i)); } } - if (((creatures2.size() + CardUtil.getThisTurnCast("Creature.YouCtrl", vengevines.get(0)).size()) > 1) - && card.isCreature() && card.getManaCost().getCMC() <= 3) { - return true; - } + return ((creatures2.size() + CardUtil.getThisTurnCast("Creature.YouCtrl", vengevines.get(0)).size()) > 1) + && card.isCreature() && card.getManaCost().getCMC() <= 3; } return false; } @@ -1161,30 +1155,25 @@ public class ComputerUtil { final int highestCMC = Math.max(6, Aggregates.max(nonLandsInHand, CardPredicates.Accessors.fnGetCmc)); final int discardCMC = discard.getCMC(); if (discard.isLand()) { - if (landsInPlay.size() >= highestCMC + // Don't need more land. + return landsInPlay.size() >= highestCMC || (landsInPlay.size() + landsInHand.size() > 6 && landsInHand.size() > 1) - || (landsInPlay.size() > 3 && nonLandsInHand.size() == 0)) { - // Don't need more land. - return true; - } + || (landsInPlay.size() > 3 && nonLandsInHand.size() == 0); } else { //non-land if (discardCMC > landsInPlay.size() + landsInHand.size() + 2) { // not castable for some time. return true; - } else if (!game.getPhaseHandler().isPlayerTurn(ai) + } else // Probably don't need small stuff now. + if (!game.getPhaseHandler().isPlayerTurn(ai) && game.getPhaseHandler().getPhase().isAfter(PhaseType.MAIN2) && discardCMC > landsInPlay.size() + landsInHand.size() && discardCMC > landsInPlay.size() + 1 && nonLandsInHand.size() > 1) { // not castable for at least one other turn. return true; - } else if (landsInPlay.size() > 5 && discard.getCMC() <= 1 - && !discard.hasProperty("hasXCost", ai, null, null)) { - // Probably don't need small stuff now. - return true; - } + } else return landsInPlay.size() > 5 && discard.getCMC() <= 1 + && !discard.hasProperty("hasXCost", ai, null, null); } - return false; } // returns true if it's better to wait until blockers are declared @@ -1925,16 +1914,12 @@ public class ComputerUtil { if (predictThreatenedObjects(ai, null).contains(source)) { return true; } - if (game.getPhaseHandler().inCombat() && - ComputerUtilCombat.combatantWouldBeDestroyed(ai, source, game.getCombat())) { - return true; - } + return game.getPhaseHandler().inCombat() && + ComputerUtilCombat.combatantWouldBeDestroyed(ai, source, game.getCombat()); } else if (zone.getZoneType() == ZoneType.Exile && sa.getMayPlay() != null) { // play cards in exile that can only be played that turn if (game.getPhaseHandler().getPhase() == PhaseType.MAIN2) { - if (source.mayPlay(sa.getMayPlay()) != null) { - return true; - } + return source.mayPlay(sa.getMayPlay()) != null; } } return false; @@ -1967,11 +1952,8 @@ public class ComputerUtil { final CardCollectionView lands = CardLists.filter(handList, new Predicate() { @Override public boolean apply(final Card c) { - if (c.getManaCost().getCMC() > 0 || c.hasSVar("NeedsToPlay") - || (!c.getType().isLand() && !c.getType().isArtifact())) { - return false; - } - return true; + return c.getManaCost().getCMC() <= 0 && !c.hasSVar("NeedsToPlay") + && (c.getType().isLand() || c.getType().isArtifact()); } }); @@ -1986,10 +1968,7 @@ public class ComputerUtil { final CardCollectionView castables = CardLists.filter(handList, new Predicate() { @Override public boolean apply(final Card c) { - if (c.getManaCost().getCMC() > 0 && c.getManaCost().getCMC() <= landSize) { - return false; - } - return true; + return c.getManaCost().getCMC() <= 0 || c.getManaCost().getCMC() > landSize; } }); @@ -2186,10 +2165,7 @@ public class ComputerUtil { CardCollection goodChoices = CardLists.filter(validCards, new Predicate() { @Override public boolean apply(final Card c) { - if (c.hasSVar("DiscardMeByOpp") || c.hasSVar("DiscardMe")) { - return false; - } - return true; + return !c.hasSVar("DiscardMeByOpp") && !c.hasSVar("DiscardMe"); } }); if (goodChoices.isEmpty()) { @@ -2225,7 +2201,7 @@ public class ComputerUtil { public static String chooseSomeType(Player ai, String kindOfType, String logic, List invalidTypes) { if (invalidTypes == null) { - invalidTypes = ImmutableList.of(); + invalidTypes = ImmutableList.of(); } final Game game = ai.getGame(); @@ -2546,8 +2522,7 @@ public class ComputerUtil { @Override public boolean apply(final Card c) { if (c.getController() == ai) { - if (c.getSVar("Targeting").equals("Dies") || c.getSVar("Targeting").equals("Counter")) - return false; + return !c.getSVar("Targeting").equals("Dies") && !c.getSVar("Targeting").equals("Counter"); } return true; } @@ -2872,11 +2847,8 @@ public class ComputerUtil { return false; } else if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "LoseLife"))) { return false; - } else if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "LichDraw"))) { - return false; - } + } else return !Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "LichDraw")); - return true; } public static boolean lifegainNegative(final Player player, final Card source) { @@ -3074,10 +3046,7 @@ public class ComputerUtil { if ((serious) && (ComputerUtilCombat.lifeInSeriousDanger(ai, combat, payment))) { return true; } - if ((!serious) && (ComputerUtilCombat.lifeInDanger(ai, combat, payment))) { - return true; - } - return false; + return (!serious) && (ComputerUtilCombat.lifeInDanger(ai, combat, payment)); } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 843bc7c4e37..b00dccd66b5 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -368,7 +368,7 @@ public class ComputerUtilCard { } if (hasEnchantmants || hasArtifacts) { - final List ae = CardLists.filter(list, Predicates.and(Predicates.or(CardPredicates.Presets.ARTIFACTS, CardPredicates.Presets.ENCHANTMENTS), new Predicate() { + final List ae = CardLists.filter(list, Predicates.and(Predicates.or(CardPredicates.Presets.ARTIFACTS, CardPredicates.Presets.ENCHANTMENTS), new Predicate() { @Override public boolean apply(Card card) { return !card.hasSVar("DoNotDiscardIfAble"); @@ -1301,7 +1301,7 @@ public class ComputerUtilCard { combatTrick = true; final List kws = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); for (String kw : kws) { if (!kw.equals("Trample") && !kw.equals("First Strike") && !kw.equals("Double Strike")) { combatTrick = false; @@ -1742,20 +1742,14 @@ public class ComputerUtilCard { if (!c.isCreature()) { return false; } - if (c.hasKeyword("CARDNAME can't attack or block.") || (c.hasKeyword("CARDNAME doesn't untap during your untap step.") && c.isTapped()) || (c.getOwner() == ai && ai.getOpponents().contains(c.getController()))) { - return true; - } - return false; + return c.hasKeyword("CARDNAME can't attack or block.") || (c.hasKeyword("CARDNAME doesn't untap during your untap step.") && c.isTapped()) || (c.getOwner() == ai && ai.getOpponents().contains(c.getController())); } public static boolean hasActiveUndyingOrPersist(final Card c) { if (c.hasKeyword(Keyword.UNDYING) && c.getCounters(CounterType.P1P1) == 0) { return true; } - if (c.hasKeyword(Keyword.PERSIST) && c.getCounters(CounterType.M1M1) == 0) { - return true; - } - return false; + return c.hasKeyword(Keyword.PERSIST) && c.getCounters(CounterType.M1M1) == 0; } public static boolean isPresentOnBattlefield(final Game game, final String cardName) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 4a38704d130..5c56a8f84a6 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -84,7 +84,7 @@ public class ComputerUtilCombat { return Iterables.any(defenders, new Predicate() { @Override public boolean apply(final GameEntity input) { return ComputerUtilCombat.canAttackNextTurn(attacker, input); - }; + } }); } // canAttackNextTurn(Card) @@ -119,11 +119,7 @@ public class ComputerUtilCombat { } // The creature won't untap next turn - if (atacker.isTapped() && !Untap.canUntap(atacker)) { - return false; - } - - return true; + return !atacker.isTapped() || Untap.canUntap(atacker); } // canAttackNextTurn(Card, GameEntity) /** @@ -889,12 +885,10 @@ public class ComputerUtilCombat { || CardTraitBase.matchesValid(attacker, trigParams.get("ValidTarget").split(","), source))) { return true; } - if (CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), source) + return CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), source) && attacker.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(defender, trigParams.get("ValidTarget").split(","), source))) { - return true; - } + || CardTraitBase.matchesValid(defender, trigParams.get("ValidTarget").split(","), source)); } return false; } @@ -1414,7 +1408,7 @@ public class ComputerUtilCombat { if (att.matches("[0-9][0-9]?") || att.matches("-" + "[0-9][0-9]?")) { power += Integer.parseInt(att); } else { - String bonus = new String(source.getSVar(att)); + String bonus = source.getSVar(att); if (bonus.contains("TriggerCount$NumBlockers")) { bonus = TextUtil.fastReplace(bonus, "TriggerCount$NumBlockers", "Number$1"); } else if (bonus.contains("TriggeredPlayersDefenders$Amount")) { // for Melee @@ -1655,7 +1649,7 @@ public class ComputerUtilCombat { if (def.matches("[0-9][0-9]?") || def.matches("-" + "[0-9][0-9]?")) { toughness += Integer.parseInt(def); } else { - String bonus = new String(source.getSVar(def)); + String bonus = source.getSVar(def); if (bonus.contains("TriggerCount$NumBlockers")) { bonus = TextUtil.fastReplace(bonus, "TriggerCount$NumBlockers", "Number$1"); } else if (bonus.contains("TriggeredPlayersDefenders$Amount")) { // for Melee @@ -1795,11 +1789,7 @@ public class ComputerUtilCombat { } // all damage will be prevented - if (attacker.hasKeyword("PreventAllDamageBy Creature.blockingSource")) { - return true; - } - - return false; + return attacker.hasKeyword("PreventAllDamageBy Creature.blockingSource"); } // can the blocker destroy the attacker? @@ -1922,9 +1912,7 @@ public class ComputerUtilCombat { return false; } } - if (attackerLife <= 2 * defenderDamage) { - return true; - } + return attackerLife <= 2 * defenderDamage; } // defender double strike else { // no double strike for defender @@ -1948,7 +1936,7 @@ public class ComputerUtilCombat { return defenderDamage >= attackerLife; } // defender no double strike - return false; // should never arrive here + // should never arrive here } // canDestroyAttacker // For AI safety measures like Regeneration @@ -2169,9 +2157,7 @@ public class ComputerUtilCombat { return false; } } - if (defenderLife <= 2 * attackerDamage) { - return true; - } + return defenderLife <= 2 * attackerDamage; } // attacker double strike else { // no double strike for attacker @@ -2195,7 +2181,7 @@ public class ComputerUtilCombat { return attackerDamage >= defenderLife; } // attacker no double strike - return false; // should never arrive here + // should never arrive here } // canDestroyBlocker diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 43c942f94a2..bdbf2abf61c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -424,7 +424,7 @@ public class ComputerUtilCost { continue; } final int remainingLife = ai.getLife(); - final int lifeCost = ((CostPayLife) part).convertAmount(); + final int lifeCost = part.convertAmount(); if ((remainingLife - lifeCost) < 10) { return false; //Don't pay life if it would put AI under 10 life } else if ((remainingLife / lifeCost) < 4) { @@ -552,7 +552,7 @@ public class ComputerUtilCost { final Card source = sa.getHostCard(); final String aiLogic = sa.getParam("UnlessAI"); boolean payForOwnOnly = "OnlyOwn".equals(aiLogic); - boolean payOwner = sa.hasParam("UnlessAI") ? aiLogic.startsWith("Defined") : false; + boolean payOwner = sa.hasParam("UnlessAI") && aiLogic.startsWith("Defined"); boolean payNever = "Never".equals(aiLogic); boolean shockland = "Shockland".equals(aiLogic); boolean isMine = sa.getActivatingPlayer().equals(payer); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 7aae37dc721..5ac65671de7 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -905,10 +905,8 @@ public class ComputerUtilMana { AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2); } else { - if (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2)) { - // This mana source is held elsewhere for a Main Phase 2 spell. - return true; - } + // This mana source is held elsewhere for a Main Phase 2 spell. + return AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2); } return false; diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index a7477639ce4..deb1a7d021b 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1061,7 +1061,7 @@ public abstract class GameState { } private void applyCountersToGameEntity(GameEntity entity, String counterString) { - entity.setCounters(Maps.newEnumMap(CounterType.class)); + entity.setCounters(Maps.newEnumMap(CounterType.class)); String[] allCounterStrings = counterString.split(","); for (final String counterPair : allCounterStrings) { String[] pair = counterPair.split("=", 2); @@ -1107,7 +1107,7 @@ public abstract class GameState { Map counters = c.getCounters(); // Note: Not clearCounters() since we want to keep the counters // var as-is. - c.setCounters(Maps.newEnumMap(CounterType.class)); + c.setCounters(Maps.newEnumMap(CounterType.class)); if (c.isAura()) { // dummy "enchanting" to indicate that the card will be force-attached elsewhere // (will be overridden later, so the actual value shouldn't matter) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 529df9a08c8..7e4923d8c9d 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -492,7 +492,7 @@ public class PlayerControllerAi extends PlayerController { Card toDiscard = Aggregates.itemWithMin(cardsOfType, CardPredicates.Accessors.fnGetCmc); return new CardCollection(toDiscard); } - return getAi().getCardsToDiscard(num, (String[])null, sa); + return getAi().getCardsToDiscard(num, null, sa); } @@ -612,7 +612,7 @@ public class PlayerControllerAi extends PlayerController { @Override public CardCollection chooseCardsToDiscardToMaximumHandSize(int numDiscard) { - return brains.getCardsToDiscard(numDiscard, (String[])null, null); + return brains.getCardsToDiscard(numDiscard, null, null); } @Override @@ -669,7 +669,7 @@ public class PlayerControllerAi extends PlayerController { throw new InvalidParameterException("SA is not api-based, this is not supported yet"); } return SpellApiToAi.Converter.get(api).chooseNumber(player, sa, min, max, params); - }; + } @Override public int chooseNumber(SpellAbility sa, String title, List options, Player relatedPlayer) { diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 1b3afb1d8c1..6124365e7f8 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -94,12 +94,8 @@ public class SpecialCardAi { int minCMC = isLowCMCDeck ? 3 : 4; // probably not worth wasting a lotus on a low-CMC spell (<4 CMC), except in low-CMC decks, where 3 CMC may be fine int paidCMC = cost.getConvertedManaCost(); if (paidCMC < minCMC) { - if (paidCMC == 3 && numManaSrcs < 3) { - // if it's a CMC 3 spell and we're more than one mana source short for it, might be worth it anyway - return true; - } - - return false; + // if it's a CMC 3 spell and we're more than one mana source short for it, might be worth it anyway + return paidCMC == 3 && numManaSrcs < 3; } return true; @@ -218,11 +214,7 @@ public class SpecialCardAi { } } - if (ai.getLife() <= sa.getHostCard().getNetPower() && !hasUsefulBlocker) { - return true; - } else { - return false; - } + return ai.getLife() <= sa.getHostCard().getNetPower() && !hasUsefulBlocker; } public static int getSacThreshold() { @@ -335,7 +327,7 @@ public class SpecialCardAi { boolean canTrample = source.hasKeyword(Keyword.TRAMPLE); if (!isBlocking && combat.getDefenderByAttacker(source) instanceof Card) { - int loyalty = ((Card)combat.getDefenderByAttacker(source)).getCounters(CounterType.LOYALTY); + int loyalty = combat.getDefenderByAttacker(source).getCounters(CounterType.LOYALTY); int totalDamageToPW = 0; for (Card atk : (combat.getAttackersOf(combat.getDefenderByAttacker(source)))) { if (combat.isUnblocked(atk)) { @@ -385,15 +377,12 @@ public class SpecialCardAi { // Already enough to kill the blockers and survive, don't overpump return false; } - if (oppCantDie && !source.hasKeyword(Keyword.TRAMPLE) && !source.hasKeyword(Keyword.WITHER) - && !source.hasKeyword(Keyword.INFECT) && predictedPT.getLeft() <= oppT) { - // Can't kill or cripple anyone, as well as can't Trample over, so don't pump - return false; - } + // Can't kill or cripple anyone, as well as can't Trample over, so don't pump + return !oppCantDie || source.hasKeyword(Keyword.TRAMPLE) || source.hasKeyword(Keyword.WITHER) + || source.hasKeyword(Keyword.INFECT) || predictedPT.getLeft() > oppT; // If we got here, it should be a favorable combat pump, resulting in at least one // opposing creature dying, and hopefully with the Pummeler surviving combat. - return true; } public static boolean predictOverwhelmingDamage(final Player ai, final SpellAbility sa) { @@ -411,11 +400,7 @@ public class SpecialCardAi { Pair predictedPT = getPumpedPT(ai, source.getNetCombatDamage(), source.getNetToughness()); int oppT = Aggregates.sum(potentialBlockers, CardPredicates.Accessors.fnGetNetToughness); - if (potentialBlockers.isEmpty() || (source.hasKeyword(Keyword.TRAMPLE) && predictedPT.getLeft() - oppT >= oppLife)) { - return true; - } - - return false; + return potentialBlockers.isEmpty() || (source.hasKeyword(Keyword.TRAMPLE) && predictedPT.getLeft() - oppT >= oppLife); } public static Pair getPumpedPT(Player ai, int power, int toughness) { @@ -486,15 +471,13 @@ public class SpecialCardAi { } if (isExileMode) { + // We probably need a low-CMC card to exile to it, exiling a higher CMC spell may be suboptimal + // since the AI does not prioritize/value cards vs. permission at the moment. if (blueCards.size() < 2) { // Need to have something else in hand that is blue in addition to Force of Will itself, // otherwise the AI will fail to play the card and the card will disappear from the pool return false; - } else if (CardLists.filter(blueCards, CardPredicates.lessCMC(3)).isEmpty()) { - // We probably need a low-CMC card to exile to it, exiling a higher CMC spell may be suboptimal - // since the AI does not prioritize/value cards vs. permission at the moment. - return false; - } + } else return !CardLists.filter(blueCards, CardPredicates.lessCMC(3)).isEmpty(); } return true; @@ -522,7 +505,7 @@ public class SpecialCardAi { best.add(sp); // these SAs are prioritized since the AI sees a reason to play them now } final List keywords = sp.hasParam("KW") ? Arrays.asList(sp.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); for (String kw : keywords) { if (!tgtCard.hasKeyword(kw)) { if ("Indestructible".equals(kw) && ai.getOpponents().getCreaturesInPlay().isEmpty()) { @@ -568,10 +551,7 @@ public class SpecialCardAi { @Override public boolean apply(final Card c) { // Don't enchant creatures that can survive - if (!c.canBeDestroyed() || c.getNetCombatDamage() < c.getNetToughness() || c.isEnchantedBy("Guilty Conscience")) { - return false; - } - return true; + return c.canBeDestroyed() && c.getNetCombatDamage() >= c.getNetToughness() && !c.isEnchantedBy("Guilty Conscience"); } }); chosen = ComputerUtilCard.getBestCreatureAI(creatures); @@ -912,15 +892,12 @@ public class SpecialCardAi { } else if (blackViseOTB && computerHandSize + exiledWithNecro - 1 >= 4) { // try not to overdraw in presence of Black Vise return false; - } else if (computerHandSize + exiledWithNecro - 1 >= maxHandSize) { + } else // Only activate in AI's own turn (sans the exception above) + if (computerHandSize + exiledWithNecro - 1 >= maxHandSize) { // Only draw until we reach max hand size return false; - } else if (!ph.isPlayerTurn(ai) || !ph.is(PhaseType.MAIN2)) { - // Only activate in AI's own turn (sans the exception above) - return false; - } + } else return ph.isPlayerTurn(ai) && ph.is(PhaseType.MAIN2); - return true; } } @@ -941,11 +918,7 @@ public class SpecialCardAi { } // Maybe use it for some important high-impact spells even if there are more cards in hand? - if (ai.getCardsIn(ZoneType.Hand).size() > 1 && !hasEnsnaringBridgeEffect) { - return false; - } - - return true; + return ai.getCardsIn(ZoneType.Hand).size() <= 1 || hasEnsnaringBridgeEffect; } } @@ -1310,12 +1283,8 @@ public class SpecialCardAi { } } - if (aiHandSize < HAND_SIZE_THRESHOLD || maxOppHandSize - aiHandSize > HAND_SIZE_THRESHOLD) { - // use in case we're getting low on cards or if we're significantly behind our opponent in cards in hand - return true; - } - - return false; + // use in case we're getting low on cards or if we're significantly behind our opponent in cards in hand + return aiHandSize < HAND_SIZE_THRESHOLD || maxOppHandSize - aiHandSize > HAND_SIZE_THRESHOLD; } } @@ -1342,9 +1311,7 @@ public class SpecialCardAi { if (topGY == null || !topGY.isCreature() || ComputerUtilCard.evaluateCreature(creatHand) > ComputerUtilCard.evaluateCreature(topGY) + 80) { - if (numCreatsInHand > 1 || !ComputerUtilMana.canPayManaCost(creatHand.getSpellPermanent(), ai, 0)) { - return true; - } + return numCreatsInHand > 1 || !ComputerUtilMana.canPayManaCost(creatHand.getSpellPermanent(), ai, 0); } } @@ -1459,15 +1426,12 @@ public class SpecialCardAi { } else if (blackViseOTB && computerHandSize + 1 > 4) { // try not to overdraw in presence of Black Vise return false; - } else if (computerHandSize + 1 > maxHandSize) { + } else // Only activate in AI's own turn (sans the exception above) + if (computerHandSize + 1 > maxHandSize) { // Only draw until we reach max hand size return false; - } else if (!ph.isPlayerTurn(ai)) { - // Only activate in AI's own turn (sans the exception above) - return false; - } + } else return ph.isPlayerTurn(ai); - return true; } } diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index d86989d87a8..b2f95d717fe 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -133,10 +133,7 @@ public abstract class SpellAbilityAi { if (!ComputerUtilCost.checkSacrificeCost(ai, cost, source, sa)) { return false; } - if (!ComputerUtilCost.checkRemoveCounterCost(cost, source, sa)) { - return false; - } - return true; + return ComputerUtilCost.checkRemoveCounterCost(cost, source, sa); } /** diff --git a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java index 44780ec2e94..18029dd4d7f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java @@ -56,12 +56,9 @@ public class ActivateAbilityAi extends SpellAbilityAi { } else { final List defined = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa); - if (!defined.contains(opp)) { - return false; - } + return defined.contains(opp); } - return true; } else { sa.resetTargets(); sa.getTargets().add(opp); diff --git a/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java b/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java index 243edf2c3f7..f20a3f2f7fd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java @@ -67,10 +67,8 @@ public class AddTurnAi extends SpellAbilityAi { return false; } } - if (!StringUtils.isNumeric(sa.getParam("NumTurns"))) { - // TODO: improve ai for Sage of Hours - return false; - } + // TODO: improve ai for Sage of Hours + return StringUtils.isNumeric(sa.getParam("NumTurns")); // not sure if the AI should be playing with cards that give the // Human more turns. } diff --git a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java index 0c98f2b65c6..7699259abd1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java @@ -23,9 +23,7 @@ public class AmassAi extends SpellAbilityAi { final Game game = ai.getGame(); if (!aiArmies.isEmpty()) { - if (CardLists.count(aiArmies, CardPredicates.canReceiveCounters(CounterType.P1P1)) <= 0) { - return false; - } + return CardLists.count(aiArmies, CardPredicates.canReceiveCounters(CounterType.P1P1)) > 0; } else { final String tokenScript = "b_0_0_zombie_army"; final int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Num", "1"), sa); @@ -57,12 +55,9 @@ public class AmassAi extends SpellAbilityAi { //reset static abilities game.getAction().checkStaticAbilities(false); - if (!result) { - return false; - } + return result; } - return true; } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 0ba446e250e..5270bea95d1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -117,12 +117,9 @@ public class AnimateAi extends SpellAbilityAi { boolean activateAsPotentialBlocker = sa.hasParam("UntilYourNextTurn") && ai.getGame().getPhaseHandler().getNextTurn() != ai && source.isPermanent(); - if (ph.isPlayerTurn(ai) && ai.getLife() < 6 && opponent.getLife() > 6 - && Iterables.any(opponent.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES) - && !sa.hasParam("AILogic") && !sa.hasParam("Permanent") && !activateAsPotentialBlocker) { - return false; - } - return true; + return !ph.isPlayerTurn(ai) || ai.getLife() >= 6 || opponent.getLife() <= 6 + || !Iterables.any(opponent.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES) + || sa.hasParam("AILogic") || sa.hasParam("Permanent") || activateAsPotentialBlocker; } @Override @@ -207,21 +204,16 @@ public class AnimateAi extends SpellAbilityAi { return bFlag; // All of the defined stuff is animated, not very useful } else { sa.resetTargets(); - if (!animateTgtAI(sa)) { - return false; - } + return animateTgtAI(sa); } - return true; } @Override public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) { if (sa.usesTargeting()) { sa.resetTargets(); - if (!animateTgtAI(sa)) { - return false; - } + return animateTgtAI(sa); } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java index 8e126db8ae8..79770568fd3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java @@ -8,11 +8,7 @@ public class AnimateAllAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - if ("Always".equals(sa.getParam("AILogic"))) { - return true; - } - - return false; + return "Always".equals(sa.getParam("AILogic")); } // end animateAllCanPlayAI() @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index ae728a26dc7..cb723ad515c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -123,9 +123,7 @@ public class AttachAi extends SpellAbilityAi { return !(c.hasProtectionFrom(source) || c.hasKeyword(Keyword.SHROUD) || c.hasKeyword(Keyword.HEXPROOF)); } }); - if (targets.isEmpty()) { - return false; - } + return !targets.isEmpty(); } return true; @@ -239,9 +237,7 @@ public class AttachAi extends SpellAbilityAi { return false; } - if (!(combat.isAttacking(attachTarget) || combat.isBlocking(attachTarget))) { - return false; - } + return combat.isAttacking(attachTarget) || combat.isBlocking(attachTarget); } return true; @@ -987,9 +983,7 @@ public class AttachAi extends SpellAbilityAi { return false; } // don't equip creatures that don't gain anything - if (card.hasSVar("NonStackingAttachEffect") && newTarget.isEquippedBy(card.getName())) { - return false; - } + return !card.hasSVar("NonStackingAttachEffect") || !newTarget.isEquippedBy(card.getName()); } } @@ -1353,7 +1347,7 @@ public class AttachAi extends SpellAbilityAi { CardCollection prefList = list; // Filter AI-specific targets if provided - prefList = ComputerUtil.filterAITgts(sa, aiPlayer, (CardCollection)list, true); + prefList = ComputerUtil.filterAITgts(sa, aiPlayer, list, true); Card c = attachGeneralAI(aiPlayer, sa, prefList, mandatory, attachSource, sa.getParam("AILogic")); @@ -1557,86 +1551,55 @@ public class AttachAi extends SpellAbilityAi { } if (evasive) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card) - || !canBeBlocked) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card) + && canBeBlocked; } else if (keyword.equals("Haste")) { - if (!card.hasSickness() || !ph.isPlayerTurn(sa.getActivatingPlayer()) || card.isTapped() - || card.getNetCombatDamage() + powerBonus <= 0 - || card.hasKeyword("CARDNAME can attack as though it had haste.") - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.hasSickness() && ph.isPlayerTurn(sa.getActivatingPlayer()) && !card.isTapped() + && card.getNetCombatDamage() + powerBonus > 0 + && !card.hasKeyword("CARDNAME can attack as though it had haste.") + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.endsWith("Indestructible")) { return true; } else if (keyword.endsWith("Deathtouch") || keyword.endsWith("Wither")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || ((!canBeBlocked || !ComputerUtilCombat.canAttackNextTurn(card)) - && !CombatUtil.canBlock(card, true))) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ((canBeBlocked && ComputerUtilCombat.canAttackNextTurn(card)) + || CombatUtil.canBlock(card, true)); } else if (keyword.equals("Double Strike") || keyword.equals("Lifelink")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || (!ComputerUtilCombat.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && (ComputerUtilCombat.canAttackNextTurn(card) || CombatUtil.canBlock(card, true)); } else if (keyword.equals("First Strike")) { - if (card.getNetCombatDamage() + powerBonus <= 0 || card.hasKeyword(Keyword.DOUBLE_STRIKE) - || (!ComputerUtilCombat.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 && !card.hasKeyword(Keyword.DOUBLE_STRIKE) + && (ComputerUtilCombat.canAttackNextTurn(card) || CombatUtil.canBlock(card, true)); } else if (keyword.startsWith("Flanking")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card) - || !canBeBlocked) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card) + && canBeBlocked; } else if (keyword.startsWith("Bushido")) { - if ((!canBeBlocked || !ComputerUtilCombat.canAttackNextTurn(card)) - && !CombatUtil.canBlock(card, true)) { - return false; - } + return (canBeBlocked && ComputerUtilCombat.canAttackNextTurn(card)) + || CombatUtil.canBlock(card, true); } else if (keyword.equals("Trample")) { - if (card.getNetCombatDamage() + powerBonus <= 1 - || !canBeBlocked - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 1 + && canBeBlocked + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.equals("Infect")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.equals("Vigilance")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card) - || !CombatUtil.canBlock(card, true)) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card) + && CombatUtil.canBlock(card, true); } else if (keyword.equals("Reach")) { - if (card.hasKeyword(Keyword.FLYING) || !CombatUtil.canBlock(card, true)) { - return false; - } + return !card.hasKeyword(Keyword.FLYING) && CombatUtil.canBlock(card, true); } else if (keyword.endsWith("CARDNAME can block an additional creature each combat.")) { - if (!CombatUtil.canBlock(card, true) || card.hasKeyword("CARDNAME can block any number of creatures.") - || card.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat.")) { - return false; - } + return CombatUtil.canBlock(card, true) && !card.hasKeyword("CARDNAME can block any number of creatures.") + && !card.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat."); } else if (keyword.equals("CARDNAME can attack as though it didn't have defender.")) { - if (!card.hasKeyword(Keyword.DEFENDER) || card.getNetCombatDamage() + powerBonus <= 0) { - return false; - } + return card.hasKeyword(Keyword.DEFENDER) && card.getNetCombatDamage() + powerBonus > 0; } else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) { - if (card.hasKeyword(Keyword.SHROUD) || card.hasKeyword(Keyword.HEXPROOF)) { - return false; - } - } else if (keyword.equals("Defender")) { - return false; - } - return true; + return !card.hasKeyword(Keyword.SHROUD) && !card.hasKeyword(Keyword.HEXPROOF); + } else return !keyword.equals("Defender"); } /** @@ -1657,17 +1620,11 @@ public class AttachAi extends SpellAbilityAi { if (keyword.endsWith("CARDNAME can't attack.") || keyword.equals("Defender") || keyword.endsWith("CARDNAME can't attack or block.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 1) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 1; } else if (keyword.endsWith("CARDNAME attacks each turn if able.") || keyword.endsWith("CARDNAME attacks each combat if able.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || !CombatUtil.canBlock(card, true) || ai.getCreaturesInPlay().isEmpty()) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && CombatUtil.canBlock(card, true) && !ai.getCreaturesInPlay().isEmpty(); } else if (keyword.endsWith("CARDNAME can't block.") || keyword.contains("CantBlock")) { - if (!CombatUtil.canBlock(card, true)) { - return false; - } + return CombatUtil.canBlock(card, true); } else if (keyword.endsWith("CARDNAME's activated abilities can't be activated.")) { for (SpellAbility ability : card.getSpellAbilities()) { if (ability.isAbility()) { @@ -1676,18 +1633,12 @@ public class AttachAi extends SpellAbilityAi { } return false; } else if (keyword.endsWith("Prevent all combat damage that would be dealt by CARDNAME.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 1) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 1; } else if (keyword.endsWith("Prevent all combat damage that would be dealt to and dealt by CARDNAME.") || keyword.endsWith("Prevent all damage that would be dealt to and dealt by CARDNAME.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 2) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 2; } else if (keyword.endsWith("CARDNAME doesn't untap during your untap step.")) { - if (card.isUntapped()) { - return false; - } + return !card.isUntapped(); } return true; } @@ -1711,12 +1662,8 @@ public class AttachAi extends SpellAbilityAi { return true; } - if (sa.getHostCard().isEquipment() && ComputerUtilCard.isUselessCreature(ai, c)) { - // useless to equip a creature that can't attack or block. - return false; - } - - return true; + // useless to equip a creature that can't attack or block. + return !sa.getHostCard().isEquipment() || !ComputerUtilCard.isUselessCreature(ai, c); } public static Card doPumpOrCurseAILogic(final Player ai, final SpellAbility sa, final List list, final String type) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index a2906c96b88..93163475b87 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -355,9 +355,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { if (c.getType().isLegendary()) { - if (ai.isCardInPlay(c.getName())) { - return false; - } + return !ai.isCardInPlay(c.getName()); } return true; } @@ -738,11 +736,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } final AbilitySub subAb = sa.getSubAbility(); - if (subAb != null && !SpellApiToAi.Converter.get(subAb.getApi()).chkDrawbackWithSubs(ai, subAb)) { - return false; - } - - return true; + return subAb == null || SpellApiToAi.Converter.get(subAb.getApi()).chkDrawbackWithSubs(ai, subAb); } /* @@ -864,7 +858,7 @@ public class ChangeZoneAi extends SpellAbilityAi { list = CardLists.getTargetableCards(list, sa); // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true); + list = ComputerUtil.filterAITgts(sa, ai, list, true); if (sa.hasParam("AITgtsOnlyBetterThanSelf")) { list = CardLists.filter(list, new Predicate() { @Override @@ -995,11 +989,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { for (Card aura : c.getEnchantedBy()) { - if (aura.getController().isOpponentOf(ai)) { - return true; - } else { - return false; - } + return aura.getController().isOpponentOf(ai); } if (blink) { return c.isToken(); @@ -1471,16 +1461,12 @@ public class ChangeZoneAi extends SpellAbilityAi { if (!list.isEmpty()) { final Card attachedTo = list.get(0); // This code is for the Dragon auras - if (attachedTo.getController().isOpponentOf(ai)) { - return false; - } + return !attachedTo.getController().isOpponentOf(ai); } } } else if (isPreferredTarget(ai, sa, mandatory, true)) { // do nothing - } else if (!isUnpreferredTarget(ai, sa, mandatory)) { - return false; - } + } else return isUnpreferredTarget(ai, sa, mandatory); return true; } @@ -1532,9 +1518,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { if (c.getType().isLegendary()) { - if (decider.isCardInPlay(c.getName())) { - return false; - } + return !decider.isCardInPlay(c.getName()); } return true; } @@ -1543,10 +1527,7 @@ public class ChangeZoneAi extends SpellAbilityAi { fetchList = CardLists.filter(fetchList, new Predicate() { @Override public boolean apply(final Card c) { - if (ComputerUtilCard.isCardRemAIDeck(c) || ComputerUtilCard.isCardRemRandomDeck(c)) { - return false; - } - return true; + return !ComputerUtilCard.isCardRemAIDeck(c) && !ComputerUtilCard.isCardRemRandomDeck(c); } }); } @@ -1718,9 +1699,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { if (c.getType().isLegendary()) { - if (ai.isCardInPlay(c.getName())) { - return false; - } + return !ai.isCardInPlay(c.getName()); } return true; } @@ -1826,20 +1805,16 @@ public class ChangeZoneAi extends SpellAbilityAi { && "Battlefield".equals(causeSub.getParam("Destination"))) { // A blink effect implemented using ChangeZone API return false; - } else if (subApi == ApiType.DelayedTrigger) { + } else // This is an intrinsic effect that blinks the card (e.g. Obzedat, Ghost Council), no need to + // return the commander to the Command zone. + if (subApi == ApiType.DelayedTrigger) { SpellAbility exec = causeSub.getAdditionalAbility("Execute"); if (exec != null && exec.getApi() == ApiType.ChangeZone) { - if ("Exile".equals(exec.getParam("Origin")) && "Battlefield".equals(exec.getParam("Destination"))) { - // A blink effect implemented using a delayed trigger - return false; - } + // A blink effect implemented using a delayed trigger + return !"Exile".equals(exec.getParam("Origin")) || !"Battlefield".equals(exec.getParam("Destination")); } - } else if (causeSa.getHostCard() != null && causeSa.getHostCard().equals((Card)sa.getReplacingObject("Card")) - && causeSa.getActivatingPlayer().equals(aiPlayer)) { - // This is an intrinsic effect that blinks the card (e.g. Obzedat, Ghost Council), no need to - // return the commander to the Command zone. - return false; - } + } else return causeSa.getHostCard() == null || !causeSa.getHostCard().equals(sa.getReplacingObject("Card")) + || !causeSa.getActivatingPlayer().equals(aiPlayer); } // Normally we want the commander back in Command zone to recast him later diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java index c17506d37b2..fcf0733bf0d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java @@ -335,11 +335,8 @@ public class ChangeZoneAllAi extends SpellAbilityAi { return true; // if AI creature is better than Human Creature - if (ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard - .evaluateCreatureList(humanCards)) { - return true; - } - return false; + return ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard + .evaluateCreatureList(humanCards); } return true; } @@ -441,29 +438,21 @@ public class ChangeZoneAllAi extends SpellAbilityAi { if (sa.getParam("GainControl") != null) { // Check if the cards are valuable enough if ((CardLists.getNotType(humanType, "Creature").size() == 0) && (CardLists.getNotType(computerType, "Creature").size() == 0)) { - if ((ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard - .evaluateCreatureList(humanType)) < 1) { - return false; - } + return (ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard + .evaluateCreatureList(humanType)) >= 1; } // otherwise evaluate both lists by CMC and pass only if human // permanents are less valuable - else if ((ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard - .evaluatePermanentList(humanType)) < 1) { - return false; - } + else return (ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard + .evaluatePermanentList(humanType)) >= 1; } else { // don't activate if human gets more back than AI does if ((CardLists.getNotType(humanType, "Creature").isEmpty()) && (CardLists.getNotType(computerType, "Creature").isEmpty())) { - if (ComputerUtilCard.evaluateCreatureList(computerType) <= ComputerUtilCard - .evaluateCreatureList(humanType)) { - return false; - } + return ComputerUtilCard.evaluateCreatureList(computerType) > ComputerUtilCard + .evaluateCreatureList(humanType); } // otherwise evaluate both lists by CMC and pass only if human // permanents are less valuable - else if (ComputerUtilCard.evaluatePermanentList(computerType) <= ComputerUtilCard - .evaluatePermanentList(humanType)) { - return false; - } + else return ComputerUtilCard.evaluatePermanentList(computerType) > ComputerUtilCard + .evaluatePermanentList(humanType); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index 6d0cee69a14..1beefd77b09 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -71,21 +71,15 @@ public class ChooseCardAi extends SpellAbilityAi { choices = CardLists.filterControlledBy(choices, ai.getOpponents()); } if (aiLogic.equals("AtLeast1") || aiLogic.equals("OppPreferred")) { - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("AtLeast2") || aiLogic.equals("BestBlocker")) { - if (choices.size() < 2) { - return false; - } + return choices.size() >= 2; } else if (aiLogic.equals("Clone") || aiLogic.equals("Vesuva")) { final String filter = aiLogic.equals("Clone") ? "Permanent.YouDontCtrl,Permanent.nonLegendary" : "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva"; choices = CardLists.getValidCards(choices, filter, host.getController(), host); - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("Never")) { return false; } else if (aiLogic.equals("NeedsPrevention")) { @@ -103,9 +97,7 @@ public class ChooseCardAi extends SpellAbilityAi { return ComputerUtilCombat.damageIfUnblocked(c, ai, combat, true) > ref; } }); - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("Ashiok")) { final int loyalty = host.getCounters(CounterType.LOYALTY) - 1; for (int i = loyalty; i >= 0; i--) { @@ -117,13 +109,9 @@ public class ChooseCardAi extends SpellAbilityAi { } } - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("RandomNonLand")) { - if (CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host).isEmpty()) { - return false; - } + return !CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host).isEmpty(); } else if (aiLogic.equals("Duneblast")) { CardCollection aiCreatures = ai.getCreaturesInPlay(); CardCollection oppCreatures = ai.getWeakestOpponent().getCreaturesInPlay(); @@ -139,10 +127,8 @@ public class ChooseCardAi extends SpellAbilityAi { aiCreatures.remove(chosen); int minGain = 200; - if ((ComputerUtilCard.evaluateCreatureList(aiCreatures) + minGain) >= ComputerUtilCard - .evaluateCreatureList(oppCreatures)) { - return false; - } + return (ComputerUtilCard.evaluateCreatureList(aiCreatures) + minGain) < ComputerUtilCard + .evaluateCreatureList(oppCreatures); } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java index 8ba40274dcd..2633899924b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java @@ -52,10 +52,7 @@ public class ChooseColorAi extends SpellAbilityAi { } if ("Addle".equals(sourceName)) { - if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty()) { - return false; - } - return true; + return !ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && !ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty(); } if (logic.equals("MostExcessOpponentControls")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java index 3480f561d70..b3ae74d5274 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java @@ -33,9 +33,7 @@ public class ChooseDirectionAi extends SpellAbilityAi { CardCollection right = CardLists.filterControlledBy(all, game.getNextPlayerAfter(ai, Direction.Right)); int leftValue = Aggregates.sum(left, CardPredicates.Accessors.fnGetCmc); int rightValue = Aggregates.sum(right, CardPredicates.Accessors.fnGetCmc); - if (aiValue > leftValue || aiValue > rightValue) { - return false; - } + return aiValue <= leftValue && aiValue <= rightValue; } } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index 2b608b2acbd..4ecfec696df 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -385,9 +385,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { final Player opp = player.getWeakestOpponent(); if (opp != null) { // TODO add predict Combat Damage? - if (opp.getLife() < copy.getNetPower()) { - return true; - } + return opp.getLife() < copy.getNetPower(); } // haste might not be good enough? diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index 3478e74b73b..f7a694e0c67 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -97,10 +97,7 @@ public class ChooseSourceAi extends SpellAbilityAi { return false; } int dmg = AbilityUtils.calculateAmount(threatSource, topStack.getParam("NumDmg"), topStack); - if (ComputerUtilCombat.predictDamageTo(ai, dmg, threatSource, false) <= 0) { - return false; - } - return true; + return ComputerUtilCombat.predictDamageTo(ai, dmg, threatSource, false) > 0; } if (game.getPhaseHandler().getPhase() != PhaseType.COMBAT_DECLARE_BLOCKERS) { return false; @@ -119,9 +116,7 @@ public class ChooseSourceAi extends SpellAbilityAi { return ComputerUtilCombat.damageIfUnblocked(c, ai, combat, true) > 0; } }); - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index 3f49d12fac9..3d6870d033d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -244,9 +244,6 @@ public class CloneAi extends SpellAbilityAi { } // don't activate during main2 unless this effect is permanent - if (ph.is(PhaseType.MAIN2) && !sa.hasParam("Permanent")) { - return false; - } - return true; + return !ph.is(PhaseType.MAIN2) || sa.hasParam("Permanent"); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index eb6e3ed5d9b..630548b00bd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -84,9 +84,7 @@ public class ControlGainAi extends SpellAbilityAi { if (sa.hasParam("AllValid")) { CardCollectionView tgtCards = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), opponents); tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa); - if (tgtCards.isEmpty()) { - return false; - } + return !tgtCards.isEmpty(); } return true; } else { @@ -247,7 +245,7 @@ public class ControlGainAi extends SpellAbilityAi { break; } } - }; + } if (t != null) { sa.getTargets().add(t); @@ -296,15 +294,12 @@ public class ControlGainAi extends SpellAbilityAi { lose.addAll(Lists.newArrayList(sa.getParam("LoseControl").split(","))); } - if (lose.contains("EOT") - && game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return !lose.contains("EOT") + || !game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else { return this.canPlayAI(ai, sa); } - return true; } // pumpDrawbackAI() @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java index 34827a4a273..7c973b99d45 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java @@ -90,9 +90,7 @@ public class CountersMoveAi extends SpellAbilityAi { } // for Simic Fluxmage and other - if (!ph.getNextTurn().equals(ai) || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) { - return false; - } + return ph.getNextTurn().equals(ai) && !ph.getPhase().isBefore(PhaseType.END_OF_TURN); } else if (CounterType.P1P1.equals(cType) && sa.hasParam("Defined")) { // something like Cyptoplast Root-kin @@ -107,9 +105,7 @@ public class CountersMoveAi extends SpellAbilityAi { } // Make sure that removing the last counter doesn't kill the creature if ("Self".equals(sa.getParam("Source"))) { - if (host != null && host.getNetToughness() - 1 <= 0) { - return false; - } + return host == null || host.getNetToughness() - 1 > 0; } } return true; @@ -193,9 +189,7 @@ public class CountersMoveAi extends SpellAbilityAi { // check for some specific AI preferences if ("DontMoveCounterIfLethal".equals(sa.getParam("AILogic"))) { - if (cType == CounterType.P1P1 && src.getNetToughness() - src.getTempToughnessBoost() - 1 <= 0) { - return false; - } + return cType != CounterType.P1P1 || src.getNetToughness() - src.getTempToughnessBoost() - 1 > 0; } } // no target @@ -207,9 +201,7 @@ public class CountersMoveAi extends SpellAbilityAi { public boolean chkAIDrawback(SpellAbility sa, Player ai) { if (sa.usesTargeting()) { sa.resetTargets(); - if (!moveTgtAI(ai, sa)) { - return false; - } + return moveTgtAI(ai, sa); } return true; @@ -287,10 +279,7 @@ public class CountersMoveAi extends SpellAbilityAi { // do not steal a P1P1 from Undying if it would die // this way if (CounterType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) { - if (srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) || card.isToken()) { - return true; - } - return false; + return srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) || card.isToken(); } return true; } @@ -338,11 +327,7 @@ public class CountersMoveAi extends SpellAbilityAi { return true; } } - if (CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) { - return true; - } - - return false; + return CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST); } }); @@ -436,11 +421,7 @@ public class CountersMoveAi extends SpellAbilityAi { } // source would leave the game - if (!card.hasSVar("EndOfTurnLeavePlay")) { - return true; - } - - return false; + return !card.hasSVar("EndOfTurnLeavePlay"); } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java index 53b7c4b2619..78dec0f8c0a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java @@ -45,9 +45,7 @@ public class CountersMultiplyAi extends SpellAbilityAi { if (c.getCounters(counterType) <= 0) { return false; } - if (!c.canReceiveCounters(counterType)) { - return false; - } + return c.canReceiveCounters(counterType); } else { for (Map.Entry e : c.getCounters().entrySet()) { // has negative counter it would double @@ -87,19 +85,12 @@ public class CountersMultiplyAi extends SpellAbilityAi { } } } - if (ComputerUtil.waitForBlocking(sa)) { - return false; - } - - return true; + return !ComputerUtil.waitForBlocking(sa); } @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - if (sa.usesTargeting() && !setTargets(ai, sa) && !mandatory) { - return false; - } - return true; + return !sa.usesTargeting() || setTargets(ai, sa) || mandatory; } private CounterType getCounterType(SpellAbility sa) { @@ -135,9 +126,7 @@ public class CountersMultiplyAi extends SpellAbilityAi { if (c.getCounters(counterType) <= 0) { return false; } - if (!c.canReceiveCounters(counterType)) { - return false; - } + return c.canReceiveCounters(counterType); } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java index f108106dce3..52538a0827c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java @@ -83,12 +83,9 @@ public class CountersProliferateAi extends SpellAbilityAi { } })); } - - if (cperms.isEmpty() && hperms.isEmpty() && !opponentPoison && !allyExpOrEnergy) { - return false; - } - return true; + + return !cperms.isEmpty() || !hperms.isEmpty() || opponentPoison || allyExpOrEnergy; } @Override 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 c636ea7b560..30e8e0f8b0f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -469,7 +469,7 @@ public class CountersPutAi extends SpellAbilityAi { int left = amount; for (Card c : list) { if (ComputerUtilCard.shouldPumpCard(ai, sa, c, i, i, - Lists.newArrayList())) { + Lists.newArrayList())) { sa.getTargets().add(c); abTgt.addDividedAllocation(c, i); left -= i; @@ -506,7 +506,7 @@ public class CountersPutAi extends SpellAbilityAi { if (type.equals("P1P1") && !SpellAbilityAi.isSorcerySpeed(sa)) { for (Card c : list) { if (ComputerUtilCard.shouldPumpCard(ai, sa, c, amount, amount, - Lists.newArrayList())) { + Lists.newArrayList())) { choice = c; break; } @@ -592,11 +592,7 @@ public class CountersPutAi extends SpellAbilityAi { } } - if (ComputerUtil.waitForBlocking(sa)) { - return false; - } - - return true; + return !ComputerUtil.waitForBlocking(sa); } @Override @@ -1071,10 +1067,8 @@ public class CountersPutAi extends SpellAbilityAi { } int totBlkPower = Aggregates.sum(combat.getBlockers(source), CardPredicates.Accessors.fnGetNetPower); - if (source.getNetToughness() <= totBlkPower - && source.getNetToughness() + amount > totBlkPower) { - return true; - } + return source.getNetToughness() <= totBlkPower + && source.getNetToughness() + amount > totBlkPower; } } else if (combat.isBlocking(source)) { for (Card blocked : combat.getAttackersBlockedBy(source)) { @@ -1085,10 +1079,8 @@ public class CountersPutAi extends SpellAbilityAi { } int totAtkPower = Aggregates.sum(combat.getAttackersBlockedBy(source), CardPredicates.Accessors.fnGetNetPower); - if (source.getNetToughness() <= totAtkPower - && source.getNetToughness() + amount > totAtkPower) { - return true; - } + return source.getNetToughness() <= totAtkPower + && source.getNetToughness() + amount > totAtkPower; } return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java index 4a2ab325af7..863e3b53c21 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java @@ -101,7 +101,7 @@ public class CountersRemoveAi extends SpellAbilityAi { } // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, false); + list = ComputerUtil.filterAITgts(sa, ai, list, false); boolean noLegendary = game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule); diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java index d894b2f7a79..fada6ed260e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java @@ -37,9 +37,7 @@ public abstract class DamageAiBase extends SpellAbilityAi { } if ("SelfDamage".equals(sa.getParam("AILogic"))) { if (comp.getLife() * 0.75 < enemy.getLife()) { - if (!lifelink) { - return true; - } + return !lifelink; } } return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java index cbede1c1a11..addba35d061 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java @@ -233,12 +233,8 @@ public class DamageAllAi extends SpellAbilityAi { return true; } - if (!computerList.isEmpty() && ComputerUtilCard.evaluateCreatureList(computerList) > ComputerUtilCard - .evaluateCreatureList(humanList)) { - return false; - } - - return true; + return computerList.isEmpty() || ComputerUtilCard.evaluateCreatureList(computerList) <= ComputerUtilCard + .evaluateCreatureList(humanList); } /** @@ -320,11 +316,7 @@ public class DamageAllAi extends SpellAbilityAi { return true; } - if (!computerList.isEmpty() && ComputerUtilCard.evaluateCreatureList(computerList) + 50 >= ComputerUtilCard - .evaluateCreatureList(humanList)) { - return false; - } - - return true; + return computerList.isEmpty() || ComputerUtilCard.evaluateCreatureList(computerList) + 50 < ComputerUtilCard + .evaluateCreatureList(humanList); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index f00dffe3205..c683d8a14bf 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -80,10 +80,7 @@ public class DamageDealAi extends DamageAiBase { dmg--; // the card will be spent casting the spell, so actual damage is 1 less } } - if (!this.damageTargetAI(ai, sa, dmg, true)) { - return false; - } - return true; + return this.damageTargetAI(ai, sa, dmg, true); } @Override @@ -490,9 +487,7 @@ public class DamageDealAi extends DamageAiBase { for (final Object o : objects) { if (o instanceof Card) { final Card c = (Card) o; - if (hPlay.contains(c)) { - hPlay.remove(c); - } + hPlay.remove(c); } } hPlay = CardLists.getTargetableCards(hPlay, sa); @@ -850,10 +845,7 @@ public class DamageDealAi extends DamageAiBase { if (!positive && !(saMe instanceof AbilitySub)) { return false; } - if (!urgent && !SpellAbilityAi.playReusable(ai, saMe)) { - return false; - } - return true; + return urgent || SpellAbilityAi.playReusable(ai, saMe); } /** @@ -952,9 +944,7 @@ public class DamageDealAi extends DamageAiBase { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt == null) { // If it's not mandatory check a few things - if (!mandatory && !this.damageChooseNontargeted(ai, sa, dmg)) { - return false; - } + return mandatory || this.damageChooseNontargeted(ai, sa, dmg); } else { if (!this.damageChoosingTargets(ai, sa, tgt, dmg, mandatory, true) && !mandatory) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index ca3fae2f3a8..6f5047d533a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -124,7 +124,7 @@ public class DebuffAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); sa.resetTargets(); - CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.newArrayList() : kws); + CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.newArrayList() : kws); list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); // several uses here: diff --git a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java index cbe954cd663..c5b17785e61 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java @@ -27,7 +27,7 @@ public class DelayedTriggerAi extends SpellAbilityAi { trigsa.setActivatingPlayer(ai); if (trigsa instanceof AbilitySub) { - return SpellApiToAi.Converter.get(((AbilitySub) trigsa).getApi()).chkDrawbackWithSubs(ai, (AbilitySub)trigsa); + return SpellApiToAi.Converter.get(trigsa.getApi()).chkDrawbackWithSubs(ai, (AbilitySub)trigsa); } else { return AiPlayDecision.WillPlay == ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(trigsa); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index cede308bfc7..b229dd1ca51 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -48,7 +48,7 @@ public class DestroyAi extends SpellAbilityAi { return false; } - hasXCost = abCost.getCostMana() != null ? abCost.getCostMana().getAmountOfX() > 0 : false; + hasXCost = abCost.getCostMana() != null && abCost.getCostMana().getAmountOfX() > 0; } if ("AtOpponentsCombatOrAfter".equals(sa.getParam("AILogic"))) { @@ -132,7 +132,7 @@ public class DestroyAi extends SpellAbilityAi { } // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true); + list = ComputerUtil.filterAITgts(sa, ai, list, true); list = CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE); if (CardLists.getNotType(list, "Creature").isEmpty()) { @@ -295,11 +295,9 @@ public class DestroyAi extends SpellAbilityAi { return false; } - if (list.isEmpty() - || !CardLists.filterControlledBy(list, ai).isEmpty() - || CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty()) { - return false; - } + return !list.isEmpty() + && CardLists.filterControlledBy(list, ai).isEmpty() + && !CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty(); } return true; } @@ -342,7 +340,7 @@ public class DestroyAi extends SpellAbilityAi { } // Filter AI-specific targets if provided - preferred = ComputerUtil.filterAITgts(sa, ai, (CardCollection)preferred, true); + preferred = ComputerUtil.filterAITgts(sa, ai, preferred, true); for (final Card c : preferred) { list.remove(c); @@ -400,16 +398,11 @@ public class DestroyAi extends SpellAbilityAi { } } - if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) { - return false; - } + return sa.getTargets().getNumTargeted() >= tgt.getMinTargets(sa.getHostCard(), sa); } else { - if (!mandatory) { - return false; - } + return mandatory; } - return true; } public boolean doLandForLandRemovalLogic(SpellAbility sa, Player ai, Card tgtLand, String logic) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index 16d426c7f62..3e36251b077 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -146,10 +146,7 @@ public class DestroyAllAi extends SpellAbilityAi { AiBlockController block = new AiBlockController(ai); block.assignBlockersForCombat(combat); - if (ComputerUtilCombat.lifeInSeriousDanger(ai, combat)) { - return true; - } - return false; + return ComputerUtilCombat.lifeInSeriousDanger(ai, combat); } // only lands involved else if (CardLists.getNotType(opplist, "Land").isEmpty() && CardLists.getNotType(ailist, "Land").isEmpty()) { if (ai.isCardInPlay("Crucible of Worlds") && !opponent.isCardInPlay("Crucible of Worlds") && !opplist.isEmpty()) { @@ -164,14 +161,9 @@ public class DestroyAllAi extends SpellAbilityAi { } } // check if the AI would lose more lands than the opponent would - if (ComputerUtilCard.evaluatePermanentList(ailist) > ComputerUtilCard.evaluatePermanentList(opplist) + 1) { - return false; - } + return ComputerUtilCard.evaluatePermanentList(ailist) <= ComputerUtilCard.evaluatePermanentList(opplist) + 1; } // otherwise evaluate both lists by CMC and pass only if human permanents are more valuable - else if ((ComputerUtilCard.evaluatePermanentList(ailist) + 3) >= ComputerUtilCard.evaluatePermanentList(opplist)) { - return false; - } + else return (ComputerUtilCard.evaluatePermanentList(ailist) + 3) < ComputerUtilCard.evaluatePermanentList(opplist); - return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java index f6745d73c39..fbb96a1dc91 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java @@ -51,12 +51,9 @@ public class DrainManaAi extends SpellAbilityAi { } else { final List defined = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa); - if (!defined.contains(opp)) { - return false; - } + return defined.contains(opp); } - return true; } else { sa.resetTargets(); sa.getTargets().add(opp); diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java index 094ebe558a1..5bd958880c1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java @@ -68,10 +68,7 @@ public class DrawAi extends SpellAbilityAi { return false; } - if (!canLoot(ai, sa)) { - return false; - } - return true; + return canLoot(ai, sa); } /* @@ -107,11 +104,7 @@ public class DrawAi extends SpellAbilityAi { } } - if (!ComputerUtilCost.checkRemoveCounterCost(cost, source, sa)) { - return false; - } - - return true; + return ComputerUtilCost.checkRemoveCounterCost(cost, source, sa); } /* @@ -202,9 +195,7 @@ public class DrawAi extends SpellAbilityAi { if (numHand == 0 && numDraw == numDiscard) { return false; // no looting since everything is dumped } - if (numHand + numDraw < numDiscard) { - return false; // net loss of cards - } + return numHand + numDraw >= numDiscard; // net loss of cards } return true; } @@ -486,11 +477,8 @@ public class DrawAi extends SpellAbilityAi { // ability is not targeted if (numCards >= computerLibrarySize) { - if (ai.isCardInPlay("Laboratory Maniac")) { - return true; - } + return ai.isCardInPlay("Laboratory Maniac"); // Don't deck yourself - return false; } if (numCards == 0 && !drawback) { @@ -503,9 +491,7 @@ public class DrawAi extends SpellAbilityAi { && !assumeSafeX) { // Don't draw too many cards and then risk discarding cards at // EOT - if (!drawback) { - return false; - } + return drawback; } } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 4b83190cc6f..92e8422c41c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -283,11 +283,7 @@ public class EffectAi extends SpellAbilityAi { return false; } final SpellAbility topStack = game.getStack().peekAbility(); - if (topStack.getActivatingPlayer().isOpponentOf(ai) && topStack.getApi() == ApiType.GainLife) { - return true; - } else { - return false; - } + return topStack.getActivatingPlayer().isOpponentOf(ai) && topStack.getApi() == ApiType.GainLife; } else if (logic.equals("Fight")) { return FightAi.canFightAi(ai, sa, 0, 0); } else if (logic.equals("Burn")) { @@ -301,11 +297,9 @@ public class EffectAi extends SpellAbilityAi { return false; } if (logic.contains(":")) { - String k[] = logic.split(":"); + String[] k = logic.split(":"); Integer i = Integer.valueOf(k[1]); - if (ai.getCreaturesInPlay().size() < i) { - return false; - } + return ai.getCreaturesInPlay().size() >= i; } return true; } else if (logic.equals("CastFromGraveThisTurn")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java index 8486fb0ab46..94549a872b8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java @@ -273,9 +273,8 @@ public class FightAi extends SpellAbilityAi { if (!canKill(opponent, fighter, -pumpDefense)) { // can survive return true; } else { - if (MyRandom.getRandom().nextInt(20)<(opponent.getCMC() - fighter.getCMC())) { // trade - return true; - } + // trade + return MyRandom.getRandom().nextInt(20) < (opponent.getCMC() - fighter.getCMC()); } } return false; @@ -289,10 +288,7 @@ public class FightAi extends SpellAbilityAi { || ComputerUtil.canRegenerate(opponent.getController(), opponent)) { return false; } - if (fighter.hasKeyword(Keyword.DEATHTOUCH) - || ComputerUtilCombat.getDamageToKill(opponent) <= fighter.getNetPower() + pumpAttack) { - return true; - } - return false; + return fighter.hasKeyword(Keyword.DEATHTOUCH) + || ComputerUtilCombat.getDamageToKill(opponent) <= fighter.getNetPower() + pumpAttack; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java b/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java index 4792fbf0c05..2afefc36f03 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java @@ -20,9 +20,7 @@ public class FlipACoinAi extends SpellAbilityAi { if (AILogic.equals("Never")) { return false; } else if (AILogic.equals("PhaseOut")) { - if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard())) { - return false; - } + return ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard()); } else if (AILogic.equals("KillOrcs")) { if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN) ) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java b/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java index f5dd9e62318..9586916f190 100644 --- a/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java @@ -11,9 +11,7 @@ public class GameWinAi extends SpellAbilityAi { */ @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { - if (ai.cantWin()) { - return false; - } + return !ai.cantWin(); // TODO Check conditions are met on card (e.g. Coalition Victory) @@ -21,7 +19,6 @@ public class GameWinAi extends SpellAbilityAi { // In general, don't return true. // But this card wins the game, I can make an exception for that - return true; } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java index e1432844d01..a01bcf4ce67 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java @@ -120,9 +120,7 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { MagicStack stack = game.getStack(); if (!stack.isEmpty()) { SpellAbility saTop = stack.peekAbility(); - if (ComputerUtil.predictDamageFromSpell(saTop, ai) >= aiLife) { - return true; - } + return ComputerUtil.predictDamageFromSpell(saTop, ai) >= aiLife; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java index 353d84b606e..981c5f10d7b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java @@ -49,9 +49,7 @@ public class LifeGainAi extends SpellAbilityAi { return false; } - if (!ComputerUtilCost.checkRemoveCounterCost(cost, source)) { - return false; - } + return ComputerUtilCost.checkRemoveCounterCost(cost, source); } else { // don't sac possible blockers if (!ph.getPhase().equals(PhaseType.COMBAT_DECLARE_BLOCKERS) @@ -63,9 +61,7 @@ public class LifeGainAi extends SpellAbilityAi { skipCheck |= ComputerUtilCost.isSacrificeSelfCost(cost) && !source.isCreature(); if (!skipCheck) { - if (!ComputerUtilCost.checkSacrificeCost(ai, cost, source, sa,false)) { - return false; - } + return ComputerUtilCost.checkSacrificeCost(ai, cost, source, sa, false); } } } @@ -106,13 +102,9 @@ public class LifeGainAi extends SpellAbilityAi { return false; } - if (!lifeCritical && !activateForCost - && (!ph.getNextTurn().equals(ai) || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) - && !sa.hasParam("PlayerTurn") && !SpellAbilityAi.isSorcerySpeed(sa)) { - return false; - } - - return true; + return lifeCritical || activateForCost + || (ph.getNextTurn().equals(ai) && !ph.getPhase().isBefore(PhaseType.END_OF_TURN)) + || sa.hasParam("PlayerTurn") || SpellAbilityAi.isSorcerySpeed(sa); } /* @@ -304,9 +296,7 @@ public class LifeGainAi extends SpellAbilityAi { hasTgt = true; } } - if (!hasTgt) { - return false; - } + return hasTgt; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java index 96fc5d4f195..a4a6a80981f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java @@ -53,9 +53,7 @@ public class LifeLoseAi extends SpellAbilityAi { } if (sa.usesTargeting()) { - if (!doTgt(ai, sa, false)) { - return false; - } + return doTgt(ai, sa, false); } return true; @@ -148,12 +146,8 @@ public class LifeLoseAi extends SpellAbilityAi { return false; } - if (SpellAbilityAi.isSorcerySpeed(sa) || sa.hasParam("ActivationPhases") || SpellAbilityAi.playReusable(ai, sa) - || ComputerUtil.activateForCost(sa, ai)) { - return true; - } - - return false; + return SpellAbilityAi.isSorcerySpeed(sa) || sa.hasParam("ActivationPhases") || SpellAbilityAi.playReusable(ai, sa) + || ComputerUtil.activateForCost(sa, ai); } /* @@ -187,12 +181,8 @@ public class LifeLoseAi extends SpellAbilityAi { ? new FCollection(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); - if (!mandatory && tgtPlayers.contains(ai) && amount > 0 && amount + 3 > ai.getLife()) { - // For cards like Foul Imp, ETB you lose life - return false; - } - - return true; + // For cards like Foul Imp, ETB you lose life + return mandatory || !tgtPlayers.contains(ai) || amount <= 0 || amount + 3 <= ai.getLife(); } protected boolean doTgt(Player ai, SpellAbility sa, boolean mandatory) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index 868f69fd185..60eaeef180f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -80,12 +80,9 @@ public class ManaEffectAi extends SpellAbilityAi { if (sa.hasParam("AILogic")) { return true; // handled elsewhere, does not meet the standard requirements } - - if (!(sa.getPayCosts() != null && sa.getPayCosts().hasNoManaCost() && sa.getPayCosts().isReusuableResource() - && sa.getSubAbility() == null && ComputerUtil.playImmediately(ai, sa))) { - return false; - } - return true; + + return sa.getPayCosts() != null && sa.getPayCosts().hasNoManaCost() && sa.getPayCosts().isReusuableResource() + && sa.getSubAbility() == null && ComputerUtil.playImmediately(ai, sa); // return super.checkApiLogic(ai, sa); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java index 7adea756b2e..947db225886 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java @@ -80,9 +80,7 @@ public class ManifestAi extends SpellAbilityAi { // Set PayX here to maximum value. int x = ComputerUtilMana.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(x)); - if (x <= 0) { - return false; - } + return x > 0; } return true; @@ -121,9 +119,7 @@ public class ManifestAi extends SpellAbilityAi { return false; // card has ETBTrigger or ETBReplacement - if (card.hasETBTrigger(false) || card.hasETBReplacement()) { - return false; - } + return !card.hasETBTrigger(false) && !card.hasETBReplacement(); } return true; } @@ -185,10 +181,7 @@ public class ManifestAi extends SpellAbilityAi { CardCollection filtered = CardLists.filter(options, new Predicate() { @Override public boolean apply(Card input) { - if (shouldManyfest(input, ai, sa)) { - return false; - } - return true; + return !shouldManyfest(input, ai, sa); } }); if (!filtered.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java index c975d894c29..3656226ee06 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java @@ -31,19 +31,13 @@ public class MillAi extends SpellAbilityAi { PhaseHandler ph = ai.getGame().getPhaseHandler(); if (aiLogic.equals("Main1")) { - if (ph.getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") - && !ComputerUtil.castSpellInMain1(ai, sa)) { - return false; - } + return !ph.getPhase().isBefore(PhaseType.MAIN2) || sa.hasParam("ActivationPhases") + || ComputerUtil.castSpellInMain1(ai, sa); } else if (aiLogic.equals("EndOfOppTurn")) { - if (!(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai))) { - return false; - } + return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); } else if (aiLogic.equals("LilianaMill")) { // Only mill if a "Raise Dead" target is available, in case of control decks with few creatures - if (CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES).size() < 1) { - return false; - } + return CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES).size() >= 1; } return true; } @@ -62,11 +56,9 @@ public class MillAi extends SpellAbilityAi { } } if (sa.getHostCard().isCreature() && sa.getPayCosts().hasTapCost()) { - if (!(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai))) { - // creatures with a tap cost to mill (e.g. Doorkeeper) should be activated at the opponent's end step - // because they are also potentially useful for combat - return false; - } + // creatures with a tap cost to mill (e.g. Doorkeeper) should be activated at the opponent's end step + // because they are also potentially useful for combat + return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); } return true; } @@ -100,9 +92,7 @@ public class MillAi extends SpellAbilityAi { // Set PayX here to maximum value. final int cardsToDiscard = getNumToDiscard(ai, sa); source.setSVar("PayX", Integer.toString(cardsToDiscard)); - if (cardsToDiscard <= 0) { - return false; - } + return cardsToDiscard > 0; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java index 7a7c0bdb732..008172bebcc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java @@ -24,9 +24,7 @@ public class PeekAndRevealAi extends SpellAbilityAi { return false; } if ("Main2".equals(sa.getParam("AILogic"))) { - if (aiPlayer.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)) { - return false; - } + return !aiPlayer.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2); } // So far this only appears on Triggers, but will expand // once things get converted from Dig + NoMove diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index 14a3f8160c5..62012507864 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -38,10 +38,7 @@ public class PermanentAi extends SpellAbilityAi { } // Wait for Main2 if possible - if (ph.is(PhaseType.MAIN1) && ph.isPlayerTurn(ai) && !ComputerUtil.castPermanentInMain1(ai, sa) && !sa.hasParam("WithoutManaCost")) { - return false; - } - return true; + return !ph.is(PhaseType.MAIN1) || !ph.isPlayerTurn(ai) || ComputerUtil.castPermanentInMain1(ai, sa) || sa.hasParam("WithoutManaCost"); } /** @@ -259,9 +256,7 @@ public class PermanentAi extends SpellAbilityAi { } } - if (dontCast) { - return false; - } + return !dontCast; } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 1fa1a224098..fff79b466d4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -40,9 +40,7 @@ public class PermanentCreatureAi extends PermanentAi { ComputerUtilCard.applyStaticContPT(game, copy, null); - if (copy.getNetToughness() <= 0) { - return false; - } + return copy.getNetToughness() > 0; } return true; } @@ -225,13 +223,9 @@ public class PermanentCreatureAi extends PermanentAi { */ final Card copy = CardUtil.getLKICopy(sa.getHostCard()); ComputerUtilCard.applyStaticContPT(game, copy, null); - if (copy.getNetToughness() <= 0 && !copy.hasStartOfKeyword("etbCounter") && mana.countX() == 0 - && !copy.hasETBTrigger(false) && !copy.hasETBReplacement() && !copy.hasSVar("NoZeroToughnessAI")) { - // AiPlayDecision.WouldBecomeZeroToughnessCreature - return false; - } - - return true; + // AiPlayDecision.WouldBecomeZeroToughnessCreature + return copy.getNetToughness() > 0 || copy.hasStartOfKeyword("etbCounter") || mana.countX() != 0 + || copy.hasETBTrigger(false) || copy.hasETBReplacement() || copy.hasSVar("NoZeroToughnessAI"); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java index a4569fb1c2e..bd7db42f43f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java @@ -19,10 +19,7 @@ public class PermanentNoncreatureAi extends PermanentAi { @Override protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { - if ("Never".equals(aiLogic) || "DontCast".equals(aiLogic)) { - return false; - } - return true; + return !"Never".equals(aiLogic) && !"DontCast".equals(aiLogic); } /** @@ -54,10 +51,8 @@ public class PermanentNoncreatureAi extends PermanentAi { // TODO: consider replacing the condition with host.hasSVar("OblivionRing") targets = CardLists.filterControlledBy(targets, ai.getOpponents()); } - if (targets.isEmpty()) { - // AiPlayDecision.AnotherTime - return false; - } + // AiPlayDecision.AnotherTime + return !targets.isEmpty(); } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java index dffcc09e823..ca9dcd4e57c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java @@ -33,9 +33,7 @@ public class PhasesAi extends SpellAbilityAi { if (tgtCards.contains(source)) { // Protect it from something final boolean isThreatened = ComputerUtil.predictThreatenedObjects(aiPlayer, null, true).contains(source); - if (isThreatened) { - return true; - } + return isThreatened; } else { // Card def = tgtCards.get(0); // Phase this out if it might attack me, or before it can be diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index f023a718fb1..96c22f1d519 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -178,11 +178,7 @@ public class PlayAi extends SpellAbilityAi { // Before accepting, see if the spell has a valid number of targets (it should at this point). // Proceeding past this point if the spell is not correctly targeted will result // in "Failed to add to stack" error and the card disappearing from the game completely. - if (!spell.isTargetNumberValid()) { - return false; - } - - return true; + return spell.isTargetNumberValid(); } } return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java b/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java index a66326ac4e2..5161d672432 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java @@ -24,11 +24,8 @@ public class PoisonAi extends SpellAbilityAi { */ @Override protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { - if (ph.getPhase().isBefore(PhaseType.MAIN2) - && !sa.hasParam("ActivationPhases")) { - return false; - } - return true; + return !ph.getPhase().isBefore(PhaseType.MAIN2) + || sa.hasParam("ActivationPhases"); } /* @@ -78,13 +75,10 @@ public class PoisonAi extends SpellAbilityAi { } Player max = players.max(PlayerPredicates.compareByPoison()); - if (ai.getPoisonCounters() == max.getPoisonCounters()) { - // ai is one of the max - return false; - } + // ai is one of the max + return ai.getPoisonCounters() != max.getPoisonCounters(); } - return true; } private boolean tgtPlayer(Player ai, SpellAbility sa, boolean mandatory) { @@ -96,11 +90,8 @@ public class PoisonAi extends SpellAbilityAi { public boolean apply(Player input) { if (input.cantLose()) { return false; - } else if (!input.canReceiveCounters(CounterType.POISON)) { - return false; - } + } else return input.canReceiveCounters(CounterType.POISON); - return true; } }); @@ -132,10 +123,7 @@ public class PoisonAi extends SpellAbilityAi { if (input.cantLose()) { return true; } - if (!input.canReceiveCounters(CounterType.POISON)) { - return true; - } - return false; + return !input.canReceiveCounters(CounterType.POISON); } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java index 513b8689a0c..13ed8ff2e51 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java @@ -162,11 +162,8 @@ public class ProtectAi extends SpellAbilityAi { @Override protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { final boolean notAiMain1 = !(ph.getPlayerTurn() == ai && ph.getPhase() == PhaseType.MAIN1); - if (SpellAbilityAi.isSorcerySpeed(sa) && notAiMain1) { - // sorceries can only give protection in order to create an unblockable attacker - return false; - } - return true; + // sorceries can only give protection in order to create an unblockable attacker + return !SpellAbilityAi.isSorcerySpeed(sa) || !notAiMain1; } @Override @@ -177,9 +174,7 @@ public class ProtectAi extends SpellAbilityAi { return false; } else if (cards.size() == 1) { // Affecting single card - if ((getProtectCreatures(ai, sa)).contains(cards.get(0))) { - return true; - } + return (getProtectCreatures(ai, sa)).contains(cards.get(0)); } /* * when this happens we need to expand AI to consider if its ok diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 3ab163edddc..d29e5c39c0d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -92,10 +92,7 @@ public class PumpAi extends PumpAiBase { return true; } - if (!ph.getNextTurn().equals(ai) || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) { - return false; - } - return true; + return ph.getNextTurn().equals(ai) && !ph.getPhase().isBefore(PhaseType.END_OF_TURN); } else if (logic.equals("Aristocrat")) { final boolean isThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()); if (!ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS) && !isThreatened) { @@ -121,9 +118,7 @@ public class PumpAi extends PumpAiBase { || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS))) { // Instant-speed pumps should not be cast outside of combat when the // stack is empty - if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa) && !main1Preferred) { - return false; - } + return sa.isCurse() || SpellAbilityAi.isSorcerySpeed(sa) || main1Preferred; } return true; } @@ -134,7 +129,7 @@ public class PumpAi extends PumpAiBase { final Card source = sa.getHostCard(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); final String numDefense = sa.hasParam("NumDef") ? sa.getParam("NumDef") : ""; final String numAttack = sa.hasParam("NumAtt") ? sa.getParam("NumAtt") : ""; @@ -191,11 +186,8 @@ public class PumpAi extends PumpAiBase { srcCardCpy.setCounters(cType, srcCardCpy.getCounters(cType) - amount); if (CounterType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) { - if (srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) - || card.isToken()) { - return true; - } - return false; + return srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) + || card.isToken(); } return false; } @@ -244,11 +236,8 @@ public class PumpAi extends PumpAiBase { srcCardCpy.setCounters(cType, srcCardCpy.getCounters(cType) - amount); if (CounterType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) { - if (srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) - || card.isToken()) { - return true; - } - return false; + return srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) + || card.isToken(); } return true; } @@ -395,9 +384,7 @@ public class PumpAi extends PumpAiBase { Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords); if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) || game.getPhaseHandler().is(PhaseType.COMBAT_BEGIN, ai)) { - if (!ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { - return false; - } + return ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped); } return true; @@ -432,7 +419,7 @@ public class PumpAi extends PumpAiBase { private boolean pumpTgtAI(final Player ai, final SpellAbility sa, final int defense, final int attack, final boolean mandatory, boolean immediately) { final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); final Game game = ai.getGame(); final Card source = sa.getHostCard(); final boolean isFight = "Fight".equals(sa.getParam("AILogic")) || "PowerDmg".equals(sa.getParam("AILogic")); @@ -555,7 +542,7 @@ public class PumpAi extends PumpAiBase { } // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true); + list = ComputerUtil.filterAITgts(sa, ai, list, true); if (list.isEmpty()) { if (ComputerUtil.activateForCost(sa, ai)) { @@ -788,15 +775,11 @@ public class PumpAi extends PumpAiBase { if (!source.hasKeyword(Keyword.INDESTRUCTIBLE) && source.getNetToughness() + defense <= source.getDamage()) { return false; } - if (source.getNetToughness() + defense <= 0) { - return false; - } + return source.getNetToughness() + defense > 0; } } else { //Targeted - if (!pumpTgtAI(ai, sa, defense, attack, false, true)) { - return false; - } + return pumpTgtAI(ai, sa, defense, attack, false, true); } return true; @@ -849,9 +832,7 @@ public class PumpAi extends PumpAiBase { } } ); - if (sacFodder.size() >= numCreatsToSac) { - return true; - } + return sacFodder.size() >= numCreatsToSac; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 3ccc5b81605..3f178539be2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -56,24 +56,17 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { return false; } else if (keyword.equals("Defender") || keyword.endsWith("CARDNAME can't attack.")) { - if (!ph.isPlayerTurn(card.getController()) || !CombatUtil.canAttack(card, ai) - || (card.getNetCombatDamage() <= 0) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return ph.isPlayerTurn(card.getController()) && CombatUtil.canAttack(card, ai) + && (card.getNetCombatDamage() > 0) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else if (keyword.endsWith("CARDNAME can't attack or block.")) { if (sa.hasParam("UntilYourNextTurn")) { - if (CombatUtil.canAttack(card, ai) || CombatUtil.canBlock(card, true)) { - return true; - } - return false; + return CombatUtil.canAttack(card, ai) || CombatUtil.canBlock(card, true); } if (!ph.isPlayerTurn(ai)) { - if (!CombatUtil.canAttack(card, ai) - || (card.getNetCombatDamage() <= 0) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return CombatUtil.canAttack(card, ai) + && (card.getNetCombatDamage() > 0) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else { if (ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isBefore(PhaseType.MAIN1)) { @@ -90,9 +83,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { return CombatUtil.canAttack(c, card.getController()) || (combat != null && combat.isAttacking(c)); } }); - if (!CombatUtil.canBlockAtLeastOne(card, attackers)) { - return false; - } + return CombatUtil.canBlockAtLeastOne(card, attackers); } } else if (keyword.endsWith("CARDNAME can't block.")) { if (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) @@ -112,24 +103,18 @@ public abstract class PumpAiBase extends SpellAbilityAi { && card.getController().equals(combat.getDefenderPlayerByAttacker(c))); } }); - if (!CombatUtil.canBlockAtLeastOne(card, attackers)) { - return false; - } + return CombatUtil.canBlockAtLeastOne(card, attackers); } else if (keyword.endsWith("CantBlockCardUIDSource")) { // can't block CARDNAME this turn if (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isBefore(PhaseType.MAIN1) || !CombatUtil.canBlock(sa.getHostCard(), card)) { return false; } // target needs to be a creature, controlled by the player which is attacked - if (sa.getHostCard().isTapped() && (combat == null || !combat.isAttacking(sa.getHostCard()) - || !card.getController().equals(combat.getDefenderPlayerByAttacker(sa.getHostCard())))) { - return false; - } + return !sa.getHostCard().isTapped() || (combat != null && combat.isAttacking(sa.getHostCard()) + && card.getController().equals(combat.getDefenderPlayerByAttacker(sa.getHostCard()))); } else if (keyword.endsWith("This card doesn't untap during your next untap step.")) { - if (ph.getPhase().isBefore(PhaseType.MAIN2) || card.isUntapped() || !ph.isPlayerTurn(ai) - || !Untap.canUntap(card)) { - return false; - } + return !ph.getPhase().isBefore(PhaseType.MAIN2) && !card.isUntapped() && ph.isPlayerTurn(ai) + && Untap.canUntap(card); } else if (keyword.endsWith("Prevent all combat damage that would be dealt by CARDNAME.") || keyword.endsWith("Prevent all damage that would be dealt by CARDNAME.")) { if (ph.isPlayerTurn(ai) && (!(CombatUtil.canBlock(card) || combat != null && combat.isBlocking(card)) @@ -139,28 +124,18 @@ public abstract class PumpAiBase extends SpellAbilityAi { || CardLists.getNotKeyword(ai.getCreaturesInPlay(), Keyword.DEFENDER).isEmpty())) { return false; } - if (!ph.isPlayerTurn(ai) && (combat == null || !combat.isAttacking(card) || card.getNetCombatDamage() <= 0)) { - return false; - } + return ph.isPlayerTurn(ai) || (combat != null && combat.isAttacking(card) && card.getNetCombatDamage() > 0); } else if (keyword.endsWith("CARDNAME attacks each turn if able.") || keyword.endsWith("CARDNAME attacks each combat if able.")) { - if (ph.isPlayerTurn(ai) || !CombatUtil.canAttack(card, ai) || !CombatUtil.canBeBlocked(card, ai) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return !ph.isPlayerTurn(ai) && CombatUtil.canAttack(card, ai) && CombatUtil.canBeBlocked(card, ai) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else if (keyword.endsWith("CARDNAME can't be regenerated.")) { if (card.getShieldCount() > 0) { return true; } - if (card.hasKeyword("If CARDNAME would be destroyed, regenerate it.") && combat != null - && (combat.isBlocked(card) || combat.isBlocking(card))) { - return true; - } - return false; - } else if (keyword.endsWith("CARDNAME's activated abilities can't be activated.")) { - return false; //too complex - } - return true; + return card.hasKeyword("If CARDNAME would be destroyed, regenerate it.") && combat != null + && (combat.isBlocked(card) || combat.isBlocking(card)); + } else return !keyword.endsWith("CARDNAME's activated abilities can't be activated."); //too complex } /** @@ -187,12 +162,10 @@ public abstract class PumpAiBase extends SpellAbilityAi { final boolean evasive = (keyword.endsWith("Unblockable") || keyword.endsWith("Shadow") || keyword.startsWith("CantBeBlockedBy")); // give evasive keywords to creatures that can or do attack if (evasive) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.endsWith("Flying")) { CardCollectionView attackingFlyer = CardCollection.EMPTY; if (combat != null) { @@ -221,13 +194,11 @@ public abstract class PumpAiBase extends SpellAbilityAi { } } } - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || !Iterables.any(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), - Predicates.not(flyingOrReach))) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && Iterables.any(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), + Predicates.not(flyingOrReach)); } else if (keyword.endsWith("Horsemanship")) { if (ph.isPlayerTurn(opp) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS) @@ -236,46 +207,35 @@ public abstract class PumpAiBase extends SpellAbilityAi { && ComputerUtilCombat.lifeInDanger(ai, game.getCombat())) { return true; } - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), - Keyword.HORSEMANSHIP).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), + Keyword.HORSEMANSHIP).isEmpty(); } else if (keyword.endsWith("Intimidate")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getNotType(CardLists.filter( - opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact").isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getNotType(CardLists.filter( + opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact").isEmpty(); } else if (keyword.endsWith("Fear")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getNotColor(CardLists.getNotType(CardLists.filter( - opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact"), MagicColor.BLACK).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getNotColor(CardLists.getNotType(CardLists.filter( + opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact"), MagicColor.BLACK).isEmpty(); } else if (keyword.endsWith("Haste")) { - if (!card.hasSickness() || ph.isPlayerTurn(opp) || card.isTapped() - || newPower <= 0 - || card.hasKeyword("CARDNAME can attack as though it had haste.") - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.hasSickness() && !ph.isPlayerTurn(opp) && !card.isTapped() + && newPower > 0 + && !card.hasKeyword("CARDNAME can attack as though it had haste.") + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.endsWith("Indestructible")) { // Predicting threatened objects in relevant non-combat situations happens elsewhere, // so we are only worrying about combat relevance of Indestructible at this point. - if (combat == null - || !((combat.isBlocked(card) || combat.isBlocking(card)) - && ComputerUtilCombat.combatantWouldBeDestroyed(ai, card, combat))) { - return false; - } - return true; + return combat != null + && ((combat.isBlocked(card) || combat.isBlocking(card)) + && ComputerUtilCombat.combatantWouldBeDestroyed(ai, card, combat)); } else if (keyword.endsWith("Deathtouch")) { if (ph.isPlayerTurn(opp) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { List attackers = combat.getAttackers(); @@ -297,12 +257,10 @@ public abstract class PumpAiBase extends SpellAbilityAi { } return false; } else if (keyword.equals("Bushido")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) - || opp.getCreaturesInPlay().isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) + && !opp.getCreaturesInPlay().isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("First Strike")) { if (card.hasKeyword(Keyword.DOUBLE_STRIKE)) { return false; @@ -321,40 +279,31 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (!ComputerUtilCombat.canDestroyAttacker(ai, attacker, card, combat, true) && ComputerUtilCombat.canDestroyAttacker(ai, attacker, card, combat, false)) return true; - if (ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, true) - && !ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, false)) - return true; + return ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, true) + && !ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, false); } return false; } else if (keyword.equals("Double Strike")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS); } else if (keyword.startsWith("Rampage")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).size() < 2) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).size() >= 2; } else if (keyword.startsWith("Flanking")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), - Keyword.FLANKING).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && !CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), + Keyword.FLANKING).isEmpty(); } else if (keyword.startsWith("Trample")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || !CombatUtil.canBeBlocked(card, opp) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 1 - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && CombatUtil.canBeBlocked(card, opp) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 1 + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Infect")) { if (newPower <= 0) { return false; @@ -362,11 +311,9 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (combat != null && combat.isBlocking(card) && !card.hasKeyword(Keyword.WITHER)) { return true; } - if ((ph.isPlayerTurn(opp)) - || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - return false; - } + return (!ph.isPlayerTurn(opp)) + && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS); } else if (keyword.endsWith("Wither")) { if (newPower <= 0 || card.hasKeyword(Keyword.INFECT)) { return false; @@ -378,20 +325,16 @@ public abstract class PumpAiBase extends SpellAbilityAi { } return combat != null && ( combat.isAttacking(card) || combat.isBlocking(card) ); } else if (keyword.equals("Vigilance")) { - if (ph.isPlayerTurn(opp) || !CombatUtil.canAttack(card, opp) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.getNotKeyword(opp.getCreaturesInPlay(), Keyword.DEFENDER).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && CombatUtil.canAttack(card, opp) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && !CardLists.getNotKeyword(opp.getCreaturesInPlay(), Keyword.DEFENDER).isEmpty(); } else if (keyword.equals("Reach")) { - if (ph.isPlayerTurn(ai) - || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.getKeyword(game.getCombat().getAttackers(), Keyword.FLYING).isEmpty() - || card.hasKeyword(Keyword.FLYING) - || !CombatUtil.canBlock(card)) { - return false; - } + return !ph.isPlayerTurn(ai) + && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS) + && !CardLists.getKeyword(game.getCombat().getAttackers(), Keyword.FLYING).isEmpty() + && !card.hasKeyword(Keyword.FLYING) + && CombatUtil.canBlock(card); } else if (keyword.endsWith("CARDNAME can block an additional creature each combat.")) { if (ph.isPlayerTurn(ai) || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { @@ -407,63 +350,43 @@ public abstract class PumpAiBase extends SpellAbilityAi { } } } - if (possibleBlockNum <= canBlockNum) { - return false; - } + return possibleBlockNum > canBlockNum; } else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) { - if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(card)) { - return false; - } + return ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(card); } else if (keyword.equals("Persist")) { - if (card.getBaseToughness() <= 1 || card.hasKeyword(Keyword.UNDYING)) { - return false; - } + return card.getBaseToughness() > 1 && !card.hasKeyword(Keyword.UNDYING); } else if (keyword.equals("Islandwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Island").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Island").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Swampwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Swamp").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Swamp").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Mountainwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Mountain").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Mountain").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Forestwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Forest").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Forest").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.endsWith("CARDNAME can attack as though it didn't have defender.")) { - if (!ph.isPlayerTurn(ai) || !card.hasKeyword(Keyword.DEFENDER) - || ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) - || card.isTapped() || newPower <= 0) { - return false; - } + return ph.isPlayerTurn(ai) && card.hasKeyword(Keyword.DEFENDER) + && !ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) + && !card.isTapped() && newPower > 0; } else if (keyword.equals("Prevent all combat damage that would be dealt to CARDNAME.")) { - if (combat == null || !(combat.isBlocking(card) || combat.isBlocked(card))) { - return false; - } + return combat != null && (combat.isBlocking(card) || combat.isBlocked(card)); } else if (keyword.equals("Menace")) { - if (combat == null || !combat.isAttacking(card)) { - return false; - } + return combat != null && combat.isAttacking(card); } return true; } @@ -547,10 +470,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { return true; } //Don't waste a -7/-0 spell on a 1/1 creature - if (c.getNetPower() + attack > -2 || c.getNetPower() > 3) { - return true; - } - return false; + return c.getNetPower() + attack > -2 || c.getNetPower() > 3; } }); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index 7f03f31ddf4..9f1a6c7b159 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -141,10 +141,7 @@ public class PumpAllAi extends PumpAiBase { // evaluate both lists and pass only if human creatures are more // valuable - if ((ComputerUtilCard.evaluateCreatureList(comp) + 200) >= ComputerUtilCard.evaluateCreatureList(human)) { - return false; - } - return true; + return (ComputerUtilCard.evaluateCreatureList(comp) + 200) < ComputerUtilCard.evaluateCreatureList(human); } // end Curse return !CardLists.getValidCards(getPumpCreatures(ai, sa, defense, power, keywords, false), valid, source.getController(), source).isEmpty(); diff --git a/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java b/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java index 6c498f1e764..5d1abd1e177 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java @@ -18,9 +18,7 @@ public class RemoveFromCombatAi extends SpellAbilityAi { // AI should only activate this during Human's turn if ("RemoveBestAttacker".equals(sa.getParam("AILogic"))) { - if (aiPlayer.getGame().getCombat() != null && aiPlayer.getGame().getCombat().getDefenders().contains(aiPlayer)) { - return true; - } + return aiPlayer.getGame().getCombat() != null && aiPlayer.getGame().getCombat().getDefenders().contains(aiPlayer); } // TODO - implement AI diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java index 08059c5cace..7a37733b284 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java @@ -32,9 +32,7 @@ public class RepeatAi extends SpellAbilityAi { // Set PayX here to maximum value. final int max = ComputerUtilMana.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(max)); - if (max <= 0) { - return false; - } + return max > 0; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java index 7ef2f78aef4..8ba1494b666 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java @@ -35,9 +35,7 @@ public class RepeatEachAi extends SpellAbilityAi { List humTokenCreats = CardLists.filter(aiPlayer.getOpponents().getCreaturesInPlay(), Presets.TOKEN); List compTokenCreats = CardLists.filter(aiPlayer.getCreaturesInPlay(), Presets.TOKEN); - if (compTokenCreats.size() <= humTokenCreats.size()) { - return false; - } + return compTokenCreats.size() > humTokenCreats.size(); } else if ("BalanceLands".equals(logic)) { if (CardLists.filter(aiPlayer.getCardsIn(ZoneType.Battlefield), Presets.LANDS).size() >= 5) { return false; @@ -111,9 +109,7 @@ public class RepeatEachAi extends SpellAbilityAi { } } // would not hit oppoent, don't do that - if (!hitOpp) { - return false; - } + return hitOpp; } // TODO Add some normal AI variability here diff --git a/forge-ai/src/main/java/forge/ai/ability/RevealAi.java b/forge-ai/src/main/java/forge/ai/ability/RevealAi.java index 676d706d06b..7598d45a700 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RevealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RevealAi.java @@ -80,11 +80,7 @@ public class RevealAi extends RevealAiBase { } - if (!revealHandTargetAI(ai, sa/*, false, mandatory*/)) { - return false; - } - - return true; + return revealHandTargetAI(ai, sa/*, false, mandatory*/); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java b/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java index 841a0cdedca..b2484c99f30 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java @@ -30,11 +30,7 @@ public class RevealHandAi extends RevealAiBase { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - if (!revealHandTargetAI(ai, sa/*, false, mandatory*/)) { - return false; - } - - return true; + return revealHandTargetAI(ai, sa/*, false, mandatory*/); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java b/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java index 4dd60206601..09d3859a5c5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java @@ -144,7 +144,7 @@ public class RollPlanarDiceAi extends SpellAbilityAi { } } - return decideToRoll ? true : false; + return decideToRoll; } /* (non-Javadoc) diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java index f5f1c587075..94e36b479da 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -136,9 +136,7 @@ public class SacrificeAi extends SpellAbilityAi { // Since all of the cards have AI:RemoveDeck:All, I enabled 1 for 1 // (or X for X) trades for special decks - if (humanList.size() < amount) { - return false; - } + return humanList.size() >= amount; } else if (defined.equals("You")) { List computerList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java index ea10f386b9e..cf01c1d8026 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java @@ -145,10 +145,10 @@ public class ScryAi extends SpellAbilityAi { if (maxToRemove <= 0) { return false; } - sa.setSVar("ChosenX", "Number$" + Integer.toString(maxToRemove)); + sa.setSVar("ChosenX", "Number$" + maxToRemove); } else { // no Instant or Sorceries anymore, just scry - sa.setSVar("ChosenX", "Number$" + Integer.toString(Math.min(counterNum, libsize))); + sa.setSVar("ChosenX", "Number$" + Math.min(counterNum, libsize)); } } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index dc5c4f5e635..408fa9a62a4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -33,10 +33,7 @@ public class SetStateAi extends SpellAbilityAi { return false; } - if("Transform".equals(mode) || "Flip".equals(mode)) { - return true; - } - return false; + return "Transform".equals(mode) || "Flip".equals(mode); } @Override @@ -92,9 +89,7 @@ public class SetStateAi extends SpellAbilityAi { } } - if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) { - return false; - } + return sa.getTargets().getNumTargeted() >= tgt.getMinTargets(source, sa); } } else if ("TurnFace".equals(mode)) { if (!sa.usesTargeting()) { @@ -123,9 +118,7 @@ public class SetStateAi extends SpellAbilityAi { } } - if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) { - return false; - } + return sa.getTargets().getNumTargeted() >= tgt.getMinTargets(source, sa); } } return true; @@ -254,9 +247,7 @@ public class SetStateAi extends SpellAbilityAi { // for legendary KI counter creatures if (othercard.getCounters(CounterType.KI) >= source.getCounters(CounterType.KI)) { // if the other legendary is useless try to replace it - if (!ComputerUtilCard.isUselessCreature(aiPlayer, othercard)) { - return false; - } + return ComputerUtilCard.isUselessCreature(aiPlayer, othercard); } } } @@ -266,10 +257,6 @@ public class SetStateAi extends SpellAbilityAi { public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { // TODO: improve the AI for when it may want to transform something that's optional to transform - if (!isSafeToTransformIntoLegendary(player, sa.getHostCard())) { - return false; - } - - return true; + return isSafeToTransformIntoLegendary(player, sa.getHostCard()); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java b/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java index 23f55ec9544..14cae9165fc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java @@ -11,10 +11,7 @@ public class SkipTurnAi extends SpellAbilityAi { */ @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - if ("Always".equals(sa.getParam("AILogic"))) { - return true; - } - return false; + return "Always".equals(sa.getParam("AILogic")); } /* (non-Javadoc) diff --git a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java index 23069294e94..eb2beab480b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java @@ -76,9 +76,7 @@ public class SurveilAi extends SpellAbilityAi { if ("Never".equals(aiLogic)) { return false; } else if ("Once".equals(aiLogic)) { - if (AiCardMemory.isRememberedCard(ai, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { - return false; - } + return !AiCardMemory.isRememberedCard(ai, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); } // TODO: add card-specific Surveil AI logic here when/if necessary diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAi.java index 82b55dce044..a4eb933dbe4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAi.java @@ -64,9 +64,7 @@ public class TapAi extends TapAiBase { bFlag |= c.isUntapped(); } - if (!bFlag) { - return false; - } + return bFlag; } else { if ("TapForXCounters".equals(sa.getParam("AILogic"))) { // e.g. Waxmane Baku @@ -83,12 +81,9 @@ public class TapAi extends TapAiBase { } sa.resetTargets(); - if (!tapPrefTargeting(ai, source, tgt, sa, false)) { - return false; - } + return tapPrefTargeting(ai, source, tgt, sa, false); } - return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java index 77f83383db6..6a408821cbe 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java @@ -248,12 +248,8 @@ public abstract class TapAiBase extends SpellAbilityAi { sa.getTargets().add(choice); } - if (sa.getTargets().getNumTargeted() == 0) { - // Nothing was ever targeted, so we need to bail. - return false; - } - - return true; + // Nothing was ever targeted, so we need to bail. + return sa.getTargets().getNumTargeted() != 0; } /** @@ -307,11 +303,7 @@ public abstract class TapAiBase extends SpellAbilityAi { // just tap whatever we can tapList = list; - if (tapTargetList(ai, sa, tapList, mandatory)) { - return true; - } - - return false; + return tapTargetList(ai, sa, tapList, mandatory); } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index baf1842e4e0..8361e437dcd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -93,9 +93,7 @@ public class TapAllAi extends SpellAbilityAi { return CombatUtil.canAttack(c) && ComputerUtilCombat.canAttackNextTurn(c); } }); - if(!any) { - return false; - } + return any; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index cee492ffb3c..6704b41e46b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -103,12 +103,9 @@ public class TokenAi extends SpellAbilityAi { if (actualToken == null) { final AbilitySub sub = sa.getSubAbility(); - if (pwPlus || (sub != null && SpellApiToAi.Converter.get(sub.getApi()).chkAIDrawback(sub, ai))) { - return true; // planeswalker plus ability or sub-ability is - // useful - } else { - return false; // no token created - } + // useful + // no token created + return pwPlus || (sub != null && SpellApiToAi.Converter.get(sub.getApi()).chkAIDrawback(sub, ai)); // planeswalker plus ability or sub-ability is } // X-cost spells @@ -154,10 +151,7 @@ public class TokenAi extends SpellAbilityAi { && !haste && !pwMinus) { return false; } - if ((ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) || !ph.isPlayerTurn(ai)) && oneShot) { - return false; - } - return true; + return (!ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) && ph.isPlayerTurn(ai)) || !oneShot; } @Override @@ -269,10 +263,8 @@ public class TokenAi extends SpellAbilityAi { list.add(token); list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); - if (ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0)) - && list.contains(token)) { - return true; - } + return ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0)) + && list.contains(token); } return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java index 6b7ad4eefbe..4f3292f58d4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java @@ -82,9 +82,7 @@ public class UnattachAllAi extends SpellAbilityAi { //don't equip a worse creature if (card.isEquipping()) { Card oldTarget = card.getEquipping(); - if (ComputerUtilCard.evaluateCreature(oldTarget) > ComputerUtilCard.evaluateCreature(newTarget)) { - return false; - } + return ComputerUtilCard.evaluateCreature(oldTarget) <= ComputerUtilCard.evaluateCreature(newTarget); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 48884ee524f..5e2659fdacc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -45,11 +45,7 @@ public class UntapAi extends SpellAbilityAi { return false; } - if (!ComputerUtilCost.checkDiscardCost(ai, cost, sa.getHostCard())) { - return false; - } - - return true; + return ComputerUtilCost.checkDiscardCost(ai, cost, sa.getHostCard()); } @Override @@ -63,16 +59,11 @@ public class UntapAi extends SpellAbilityAi { if (tgt == null) { final List pDefined = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); - if (pDefined != null && pDefined.get(0).isUntapped() && pDefined.get(0).getController() == ai) { - return false; - } + return pDefined == null || !pDefined.get(0).isUntapped() || pDefined.get(0).getController() != ai; } else { - if (!untapPrefTargeting(ai, tgt, sa, false)) { - return false; - } + return untapPrefTargeting(ai, tgt, sa, false); } - return true; } @Override @@ -86,11 +77,7 @@ public class UntapAi extends SpellAbilityAi { // TODO: use Defined to determine, if this is an unfavorable result final List pDefined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); - if (pDefined != null && pDefined.get(0).isUntapped() && pDefined.get(0).getController() == ai) { - return false; - } - - return true; + return pDefined == null || !pDefined.get(0).isUntapped() || pDefined.get(0).getController() != ai; } else { if (untapPrefTargeting(ai, tgt, sa, mandatory)) { return true; @@ -271,11 +258,7 @@ public class UntapAi extends SpellAbilityAi { // just tap whatever we can tapList = list; - if (untapTargetList(source, tgt, sa, mandatory, tapList)) { - return true; - } - - return false; + return untapTargetList(source, tgt, sa, mandatory, tapList); } private boolean untapTargetList(final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory, @@ -438,13 +421,10 @@ public class UntapAi extends SpellAbilityAi { // no harm in doing this past declare blockers during the opponent's turn and right before our turn, // maybe we'll serendipitously untap into something like a removal spell or burn spell that'll help - if (ph.getNextTurn() == ai - && (ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS))) { - return true; - } + return ph.getNextTurn() == ai + && (ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)); // haven't found any immediate playable options - return false; } } diff --git a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java index fcaf0ad073f..3aa48b72945 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java +++ b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java @@ -80,7 +80,7 @@ public class PossibleTargetSelector { } private static class SimilarTargetSkipper { - private ArrayListMultimap validTargetsMap = ArrayListMultimap.create(); + private ArrayListMultimap validTargetsMap = ArrayListMultimap.create(); private HashMap cardTypeStrings = new HashMap(); private HashMap creatureScores; diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java index 75225c73cab..36fbde8d365 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java @@ -49,7 +49,7 @@ public class SpellAbilityChoicesIterator { // TODO: Do we need to do something special to support cards that have extra costs // when choosing more modes, like Blessed Alliance? if (!allowRepeat) { - modeIterator = CombinatoricsUtils.combinationsIterator(choices.size(), num);; + modeIterator = CombinatoricsUtils.combinationsIterator(choices.size(), num); } else { // Note: When allowRepeat is true, it does result in many possibilities being tried. // We should ideally prune some of those at a higher level. diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java index a14f2b94047..f6c9eec8dfa 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java @@ -308,9 +308,7 @@ public class SpellAbilityPicker { return true; } List phases = conditions.getPhases(); - if (phases.isEmpty() || phases.contains(PhaseType.MAIN1)) { - return true; - } + return phases.isEmpty() || phases.contains(PhaseType.MAIN1); } return false; diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java index 92b30bce7ac..02e4d414277 100644 --- a/forge-core/src/main/java/forge/CardStorageReader.java +++ b/forge-core/src/main/java/forge/CardStorageReader.java @@ -64,7 +64,7 @@ public class CardStorageReader { void report(int current, int total); // does nothing, used when they pass null instead of an instance - public final static ProgressObserver emptyObserver = new ProgressObserver() { + ProgressObserver emptyObserver = new ProgressObserver() { @Override public void setOperationName(final String name, final boolean usePercents) {} @Override public void report(final int current, final int total) {} }; diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index bd2c20ed0b5..ee1bca83312 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -123,7 +123,7 @@ public final class ImageKeys { int index = filename.lastIndexOf('_'); if (index != -1) { String setlessFilename = filename.substring(0, index); - String setCode = filename.substring(index + 1, filename.length()); + String setCode = filename.substring(index + 1); // try with upper case set file = findFile(dir, setlessFilename + "_" + setCode.toUpperCase()); if (file != null) { return file; } @@ -133,7 +133,7 @@ public final class ImageKeys { // if there's an art variant try without it if (setlessFilename.matches(".*[0-9]*$")) { file = findFile(dir, setlessFilename.replaceAll("[0-9]*$", "")); - if (file != null) { return file; } + return file; } } } else if (filename.contains("/")) { @@ -144,7 +144,7 @@ public final class ImageKeys { // try lowering the art index to the minimum for regular cards if (setlessFilename.contains(".full")) { file = findFile(dir, setlessFilename.replaceAll("[0-9]*[.]full", "1.full")); - if (file != null) { return file; } + return file; } } diff --git a/forge-core/src/main/java/forge/LobbyPlayer.java b/forge-core/src/main/java/forge/LobbyPlayer.java index 79139ec3a75..171d4e04e96 100644 --- a/forge-core/src/main/java/forge/LobbyPlayer.java +++ b/forge-core/src/main/java/forge/LobbyPlayer.java @@ -47,13 +47,8 @@ public abstract class LobbyPlayer { } LobbyPlayer other = (LobbyPlayer) obj; if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; + return other.name == null; + } else return name.equals(other.name); } public int getAvatarIndex() { diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 0c4071e4cf4..0b157f26ac2 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -41,7 +41,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { public final static char NameSetSeparator = '|'; // need this to obtain cardReference by name+set+artindex - private final ListMultimap allCardsByName = Multimaps.newListMultimap(new TreeMap>(String.CASE_INSENSITIVE_ORDER), CollectionSuppliers.arrayLists()); + private final ListMultimap allCardsByName = Multimaps.newListMultimap(new TreeMap>(String.CASE_INSENSITIVE_ORDER), CollectionSuppliers.arrayLists()); private final Map uniqueCardsByName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); private final Map rulesByName; private final Map facesByName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); @@ -62,7 +62,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { Random(false); final boolean filterSets; - private SetPreference(boolean filterIrregularSets) { + SetPreference(boolean filterIrregularSets) { filterSets = filterIrregularSets; } diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 86653eb178b..b9b88687d97 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -189,7 +189,7 @@ public final class CardEdition implements Comparable { // immutable public String getBoosterMustContain() { return boosterMustContain; } public CardInSet[] getCards() { return cards; } - public Map getTokens() { return tokenNormalized; }; + public Map getTokens() { return tokenNormalized; } public static final Function FN_GET_CODE = new Function() { @Override diff --git a/forge-core/src/main/java/forge/card/CardFace.java b/forge-core/src/main/java/forge/card/CardFace.java index 001f2eff18d..3e7afb2858b 100644 --- a/forge-core/src/main/java/forge/card/CardFace.java +++ b/forge-core/src/main/java/forge/card/CardFace.java @@ -20,7 +20,7 @@ final class CardFace implements ICardFace { public enum FaceSelectionMethod { // USE_ACTIVE_FACE, USE_PRIMARY_FACE, - COMBINE; + COMBINE } @@ -87,7 +87,7 @@ final class CardFace implements ICardFace { void setInitialLoyalty(String value) { this.initialLoyalty = value; } void setPtText(String value) { - final String k[] = value.split("/"); + final String[] k = value.split("/"); if (k.length != 2) { throw new RuntimeException("Creature '" + this.getName() + "' has bad p/t stats"); diff --git a/forge-core/src/main/java/forge/card/CardFacePredicates.java b/forge-core/src/main/java/forge/card/CardFacePredicates.java index ee83dda3787..e2b4d2a5815 100644 --- a/forge-core/src/main/java/forge/card/CardFacePredicates.java +++ b/forge-core/src/main/java/forge/card/CardFacePredicates.java @@ -85,7 +85,7 @@ public final class CardFacePredicates { @Override public boolean apply(ICardFace input) { - String k[] = valid.split("\\.", 2); + String[] k = valid.split("\\.", 2); if ("Card".equals(k[0])) { // okay @@ -110,10 +110,7 @@ public final class CardFacePredicates { static protected boolean hasProperty(ICardFace input, final String v) { if (v.startsWith("non")) { return !hasProperty(input, v.substring(3)); - } else if (!input.getType().hasStringType(v)) { - return false; - } - return true; + } else return input.getType().hasStringType(v); } } diff --git a/forge-core/src/main/java/forge/card/CardRarity.java b/forge-core/src/main/java/forge/card/CardRarity.java index 7ed13dda93c..b6f1f898067 100644 --- a/forge-core/src/main/java/forge/card/CardRarity.java +++ b/forge-core/src/main/java/forge/card/CardRarity.java @@ -35,7 +35,7 @@ public enum CardRarity { private final String shortName, longName; - private CardRarity(final String shortName0, final String longName0) { + CardRarity(final String shortName0, final String longName0) { shortName = shortName0; longName = longName0; } diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index e6b200b1a94..4748c821013 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -435,10 +435,10 @@ public final class CardRulesPredicates { return this.op(card.getManaCost().getGenericCost(), this.operand); case POWER: value = card.getIntPower(); - return value != Integer.MAX_VALUE ? this.op(value, this.operand) : false; + return value != Integer.MAX_VALUE && this.op(value, this.operand); case TOUGHNESS: value = card.getIntToughness(); - return value != Integer.MAX_VALUE ? this.op(value, this.operand) : false; + return value != Integer.MAX_VALUE && this.op(value, this.operand); default: return false; } diff --git a/forge-core/src/main/java/forge/card/CardSplitType.java b/forge-core/src/main/java/forge/card/CardSplitType.java index 38902df9db1..a949ec8b975 100644 --- a/forge-core/src/main/java/forge/card/CardSplitType.java +++ b/forge-core/src/main/java/forge/card/CardSplitType.java @@ -10,7 +10,7 @@ public enum CardSplitType Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit), Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped); - private CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { + CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { method = calcMode; this.changedStateName = stateName; } diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index ebc12e29266..f7c85f94bb7 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -73,7 +73,7 @@ public final class CardType implements Comparable, CardTypeView { public final boolean isPermanent; private static final ImmutableList allCoreTypeNames = EnumUtil.getNames(CoreType.class); - private CoreType(final boolean permanent) { + CoreType(final boolean permanent) { isPermanent = permanent; } } @@ -598,10 +598,7 @@ public final class CardType implements Comparable, CardTypeView { if (multiWordTypes[0].startsWith(type) && !multiWordTypes[0].equals(type)) { return true; } - if (multiWordTypes[1].startsWith(type) && !multiWordTypes[1].equals(type)) { - return true; - } - return false; + return multiWordTypes[1].startsWith(type) && !multiWordTypes[1].equals(type); } public static class Constant { diff --git a/forge-core/src/main/java/forge/card/ICardFace.java b/forge-core/src/main/java/forge/card/ICardFace.java index 4953f3ddf0e..d73578d6242 100644 --- a/forge-core/src/main/java/forge/card/ICardFace.java +++ b/forge-core/src/main/java/forge/card/ICardFace.java @@ -5,5 +5,5 @@ package forge.card; * */ public interface ICardFace extends ICardCharacteristics, ICardRawAbilites, Comparable { - public String getAltName(); + String getAltName(); } diff --git a/forge-core/src/main/java/forge/card/MagicColor.java b/forge-core/src/main/java/forge/card/MagicColor.java index bf0b4fdbb9f..c21dedeac97 100644 --- a/forge-core/src/main/java/forge/card/MagicColor.java +++ b/forge-core/src/main/java/forge/card/MagicColor.java @@ -168,7 +168,7 @@ public final class MagicColor { private final String name, symbol; private final byte colormask; - private Color(String name0, byte colormask0, String symbol0) { + Color(String name0, byte colormask0, String symbol0) { name = name0; colormask = colormask0; symbol = symbol0; diff --git a/forge-core/src/main/java/forge/card/mana/ManaAtom.java b/forge-core/src/main/java/forge/card/mana/ManaAtom.java index 5a38b3a3310..951f7fbf776 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaAtom.java +++ b/forge-core/src/main/java/forge/card/mana/ManaAtom.java @@ -44,7 +44,7 @@ public abstract class ManaAtom { if (s.length() == 2) { //if name is two characters, check for combination of two colors return (byte)(fromName(s.charAt(0)) | fromName(s.charAt(1))); } else if (s.length() == 1) { - return (byte) fromName(s.charAt(0)); + return fromName(s.charAt(0)); } s = s.toLowerCase(); diff --git a/forge-core/src/main/java/forge/card/mana/ManaCost.java b/forge-core/src/main/java/forge/card/mana/ManaCost.java index a2393429897..90886018108 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCost.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCost.java @@ -69,7 +69,7 @@ public final class ManaCost implements Comparable, IterablenewArrayList()); + sealClass(Lists.newArrayList()); } private ManaCost(int cmc, List shards0) { diff --git a/forge-core/src/main/java/forge/card/mana/ManaCostShard.java b/forge-core/src/main/java/forge/card/mana/ManaCostShard.java index 84d317554b7..8c97c99e5b8 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCostShard.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCostShard.java @@ -86,7 +86,7 @@ public enum ManaCostShard { * @param sValue * the s value */ - private ManaCostShard(final int value, final String sValue) { + ManaCostShard(final int value, final String sValue) { this(value, sValue, sValue); } @@ -100,7 +100,7 @@ public enum ManaCostShard { * @param imgKey * the img key */ - private ManaCostShard(final int value, final String sValue, final String imgKey) { + ManaCostShard(final int value, final String sValue, final String imgKey) { this.shard = value; this.cmc = this.getCMC(); this.cmpc = this.getCmpCost(); diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 5d9f651828b..f0515c6494b 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -85,10 +85,7 @@ public enum DeckFormat { if (otherPart != null && otherPart.getManaCost().getCMC() > 3) { return false; //only cards with CMC less than 3 are allowed } - if (bannedCards.contains(rules.getName())) { - return false; - } - return true; + return !bannedCards.contains(rules.getName()); } }) { private final Set bannedCommanders = ImmutableSet.of("Derevi, Empyrial Tactician", "Erayo, Soratami Ascendant", "Rofellos, Llanowar Emissary"); @@ -120,7 +117,7 @@ public enum DeckFormat { private final static String ADVPROCLAMATION = "Advantageous Proclamation"; private final static String SOVREALM = "Sovereign's Realm"; - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0, Predicate paperCardPoolFilter0) { + DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0, Predicate paperCardPoolFilter0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; @@ -128,7 +125,7 @@ public enum DeckFormat { paperCardPoolFilter = paperCardPoolFilter0; } - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0) { + DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; @@ -136,7 +133,7 @@ public enum DeckFormat { cardPoolFilter = cardPoolFilter0; } - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0) { + DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index 0cae2a03261..52d2005fd3f 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -216,10 +216,7 @@ public class DeckRecognizer { if (line.toLowerCase().contains("schemes")) { return true; } - if (line.toLowerCase().contains("vanguard")) { - return true; - } - return false; + return line.toLowerCase().contains("vanguard"); } public void setDateConstraint(int month, Integer year) { diff --git a/forge-core/src/main/java/forge/deck/DeckSection.java b/forge-core/src/main/java/forge/deck/DeckSection.java index 90d2b91d17e..59516041ad0 100644 --- a/forge-core/src/main/java/forge/deck/DeckSection.java +++ b/forge-core/src/main/java/forge/deck/DeckSection.java @@ -10,7 +10,7 @@ public enum DeckSection { Conspiracy(0); private final int typicalSize; // Rules enforcement is done in DeckFormat class, this is for reference only - private DeckSection(int commonSize) { + DeckSection(int commonSize) { typicalSize = commonSize; } diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java index d3f0a844019..050f1827e61 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java @@ -142,7 +142,7 @@ public abstract class DeckGeneratorBase { if(basicLandEdition == null){ if(setBasicLandPool(cp.getEdition())){ basicLandEdition = cp.getEdition(); - }; + } } cardCounts.put(cp.getName(), newCount); trace.append(String.format("(%d) %s [%s]%n", cp.getRules().getManaCost().getCMC(), cp.getName(), cp.getRules().getManaCost())); diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index be80957515c..f69036aa1c9 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -159,11 +159,7 @@ public final class PaperCard implements Comparable, InventoryItemFro if (!edition.equals(other.edition)) { return false; } - if ((other.foil != foil) || (other.artIndex != artIndex)) { - return false; - } - - return true; + return (other.foil == foil) && (other.artIndex == artIndex); } /* @@ -238,13 +234,11 @@ public final class PaperCard implements Comparable, InventoryItemFro // Return true if card is one of the five basic lands that can be added for free public boolean isVeryBasicLand() { - if ((this.getName().equals("Swamp")) + return (this.getName().equals("Swamp")) || (this.getName().equals("Plains")) || (this.getName().equals("Island")) || (this.getName().equals("Forest")) - || (this.getName().equals("Mountain"))) { - return true; - } else return false; + || (this.getName().equals("Mountain")); } } diff --git a/forge-core/src/main/java/forge/util/Base64Coder.java b/forge-core/src/main/java/forge/util/Base64Coder.java index c78acff79b9..2a53be0d765 100644 --- a/forge-core/src/main/java/forge/util/Base64Coder.java +++ b/forge-core/src/main/java/forge/util/Base64Coder.java @@ -36,6 +36,7 @@ import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; +import java.nio.charset.StandardCharsets; /** * A Base64 encoder/decoder. @@ -377,7 +378,7 @@ public final class Base64Coder { SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); - return String.valueOf(encode(pbeCipher.doFinal(value.getBytes("UTF-8")))); + return String.valueOf(encode(pbeCipher.doFinal(value.getBytes(StandardCharsets.UTF_8)))); } public static String decrypt(String value) throws Exception { @@ -385,7 +386,7 @@ public final class Base64Coder { SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); - return new String(pbeCipher.doFinal(decode(value)), "UTF-8"); + return new String(pbeCipher.doFinal(decode(value)), StandardCharsets.UTF_8); } // Dummy constructor. diff --git a/forge-core/src/main/java/forge/util/ComparableOp.java b/forge-core/src/main/java/forge/util/ComparableOp.java index ff7fb1030fb..ad295dac98e 100644 --- a/forge-core/src/main/java/forge/util/ComparableOp.java +++ b/forge-core/src/main/java/forge/util/ComparableOp.java @@ -33,7 +33,7 @@ public enum ComparableOp { private final String caption; - private ComparableOp(String caption0) { + ComparableOp(String caption0) { caption = caption0; } diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index fff1213d844..4b2e515f8fd 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -10,7 +10,7 @@ import forge.item.PaperCard; public class ImageUtil { public static float getNearestHQSize(float baseSize, float actualSize) { //get nearest power of actualSize to baseSize so that the image renders good - return (float)Math.round(actualSize) * (float)Math.pow(2, (double)Math.round(Math.log((double)(baseSize / actualSize)) / Math.log(2))); + return (float)Math.round(actualSize) * (float)Math.pow(2, (double)Math.round(Math.log(baseSize / actualSize) / Math.log(2))); } public static PaperCard getPaperCardFromImageKey(String key) { @@ -119,7 +119,6 @@ public class ImageUtil { for (int i = 0; i < in.length(); i++) { c = in.charAt(i); if ((c == '"') || (c == '/') || (c == ':') || (c == '?')) { - out.append(""); } else { out.append(c); } diff --git a/forge-core/src/main/java/forge/util/Lang.java b/forge-core/src/main/java/forge/util/Lang.java index 216bfee2664..531f7237314 100644 --- a/forge-core/src/main/java/forge/util/Lang.java +++ b/forge-core/src/main/java/forge/util/Lang.java @@ -102,7 +102,7 @@ public final class Lang { strCount = startsWithVowel(noun) ? "an " : "a "; } else { - strCount = String.valueOf(cnt) + " "; + strCount = cnt + " "; } return strCount + countedForm; } diff --git a/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java b/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java index 88887508309..559a2191424 100644 --- a/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java +++ b/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java @@ -1,5 +1,5 @@ package forge.util; public interface LocalizationChangeObserver { - public void localizationChanged(); + void localizationChanged(); } diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java index 6569e1a2e91..73076e6b30c 100644 --- a/forge-core/src/main/java/forge/util/Localizer.java +++ b/forge-core/src/main/java/forge/util/Localizer.java @@ -1,10 +1,10 @@ package forge.util; import java.io.File; -import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.charset.StandardCharsets; import java.text.MessageFormat; import java.util.*; @@ -38,7 +38,7 @@ public class Localizer { try { //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); - formatter = new MessageFormat(resourceBundle.getString(key.toString()), locale); + formatter = new MessageFormat(resourceBundle.getString(key), locale); } catch (final IllegalArgumentException | MissingResourceException e) { e.printStackTrace(); } @@ -51,14 +51,10 @@ public class Localizer { formatter.setLocale(locale); String formattedMessage = "CHAR ENCODING ERROR"; - try { - //Support non-English-standard characters - formattedMessage = new String(formatter.format(messageArguments).getBytes("ISO-8859-1"), "UTF-8"); - } catch (final UnsupportedEncodingException e) { - e.printStackTrace(); - } - - return formattedMessage; + //Support non-English-standard characters + formattedMessage = new String(formatter.format(messageArguments).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + + return formattedMessage; } diff --git a/forge-core/src/main/java/forge/util/storage/StorageBase.java b/forge-core/src/main/java/forge/util/storage/StorageBase.java index 5a970878e8d..2c0c959fe20 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageBase.java +++ b/forge-core/src/main/java/forge/util/storage/StorageBase.java @@ -65,7 +65,7 @@ public class StorageBase implements IStorage { @Override public boolean contains(String name) { - return name == null ? false : map.containsKey(name); + return name != null && map.containsKey(name); } @Override diff --git a/forge-game/src/main/java/forge/GameCommand.java b/forge-game/src/main/java/forge/GameCommand.java index f0d96122ffe..e67dc9560a3 100644 --- a/forge-game/src/main/java/forge/GameCommand.java +++ b/forge-game/src/main/java/forge/GameCommand.java @@ -27,7 +27,7 @@ package forge; */ public interface GameCommand extends java.io.Serializable, Runnable { /** Constant Blank. */ - public final GameCommand BLANK = new GameCommand() { + GameCommand BLANK = new GameCommand() { private static final long serialVersionUID = 2689172297036001710L; diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index aacc1d389e1..7897017b187 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -159,9 +159,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { */ public final boolean isSecondary() { if (this.mapParams.containsKey("Secondary")) { - if (this.mapParams.get("Secondary").equals("True")) { - return true; - } + return this.mapParams.get("Secondary").equals("True"); } return false; } @@ -451,9 +449,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { if (params.containsKey("ActivateNoLoyaltyAbilitiesCondition")) { final Player active = game.getPhaseHandler().getPlayerTurn(); - if (active.getActivateLoyaltyAbilityThisTurn()) { - return false; - } + return !active.getActivateLoyaltyAbilityThisTurn(); } return true; } diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index c5db86d46ad..1bf735a42d4 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -29,8 +29,7 @@ public class ForgeScript { int desiredColor = MagicColor.fromName(colorName); boolean hasColor = colors.hasAnyColor(desiredColor); - if (mustHave != hasColor) - return false; + return mustHave == hasColor; } else if (property.contains("Colorless")) { // ... Card is colorless boolean non = property.startsWith("non"); @@ -38,66 +37,48 @@ public class ForgeScript { if (non && withSource && isColorlessSource) { return false; } - if (non == colors.isColorless()) return false; + return non != colors.isColorless(); } else if (property.contains("MultiColor")) { // ... Card is multicolored if (property.endsWith("Source") && isColorlessSource) return false; - if (property.startsWith("non") == colors.isMulticolor()) - return false; + return property.startsWith("non") != colors.isMulticolor(); } else if (property.contains("MonoColor")) { // ... Card is monocolored if (property.endsWith("Source") && isColorlessSource) return false; - if (property.startsWith("non") == colors.isMonoColor()) - return false; + return property.startsWith("non") != colors.isMonoColor(); } else if (property.startsWith("ChosenColor")) { if (property.endsWith("Source") && isColorlessSource) return false; - if (!source.hasChosenColor() || !colors.hasAnyColor(MagicColor.fromName(source.getChosenColor()))) - return false; + return source.hasChosenColor() && colors.hasAnyColor(MagicColor.fromName(source.getChosenColor())); } else if (property.startsWith("AnyChosenColor")) { if (property.endsWith("Source") && isColorlessSource) return false; - if (!source.hasChosenColor() - || !colors.hasAnyColor(ColorSet.fromNames(source.getChosenColors()).getColor())) - return false; + return source.hasChosenColor() + && colors.hasAnyColor(ColorSet.fromNames(source.getChosenColors()).getColor()); } else if (property.startsWith("non")) { // ... Other Card types - if (cardState.getTypeWithChanges().hasStringType(property.substring(3))) { - return false; - } + return !cardState.getTypeWithChanges().hasStringType(property.substring(3)); } else if (property.equals("CostsPhyrexianMana")) { - if (!cardState.getManaCost().hasPhyrexian()) { - return false; - } + return cardState.getManaCost().hasPhyrexian(); } else if (property.startsWith("HasSVar")) { final String svar = property.substring(8); - if (!cardState.hasSVar(svar)) { - return false; - } + return cardState.hasSVar(svar); } else if (property.equals("ChosenType")) { - if (!cardState.getTypeWithChanges().hasStringType(source.getChosenType())) { - return false; - } + return cardState.getTypeWithChanges().hasStringType(source.getChosenType()); } else if (property.equals("IsNotChosenType")) { - if (cardState.getTypeWithChanges().hasStringType(source.getChosenType())) { - return false; - } + return !cardState.getTypeWithChanges().hasStringType(source.getChosenType()); } else if (property.startsWith("HasSubtype")) { final String subType = property.substring(11); - if (!cardState.getTypeWithChanges().hasSubtype(subType)) { - return false; - } + return cardState.getTypeWithChanges().hasSubtype(subType); } else if (property.startsWith("HasNoSubtype")) { final String subType = property.substring(13); - if (cardState.getTypeWithChanges().hasSubtype(subType)) { - return false; - } + return !cardState.getTypeWithChanges().hasSubtype(subType); } else if (property.equals("hasActivatedAbilityWithTapCost")) { for (final SpellAbility sa : cardState.getSpellAbilities()) { if (sa.isAbility() && (sa.getPayCosts() != null) && sa.getPayCosts().hasTapCost()) { @@ -136,80 +117,47 @@ public class ForgeScript { x = AbilityUtils.calculateAmount(source, rhs, spellAbility); } - if (!Expressions.compare(y, property, x)) { - return false; - } - } else if (!cardState.getTypeWithChanges().hasStringType(property)) { - return false; - } - - return true; - + return Expressions.compare(y, property, x); + } else return cardState.getTypeWithChanges().hasStringType(property); + - } public static boolean spellAbilityHasProperty(SpellAbility sa, String property, Player sourceController, Card source, SpellAbility spellAbility) { if (property.equals("ManaAbility")) { - if (!sa.isManaAbility()) { - return false; - } + return sa.isManaAbility(); } else if (property.equals("nonManaAbility")) { - if (sa.isManaAbility()) { - return false; - } + return !sa.isManaAbility(); } else if (property.equals("Buyback")) { - if (!sa.isBuyBackAbility()) { - return false; - } + return sa.isBuyBackAbility(); } else if (property.equals("Cycling")) { - if (!sa.isCycling()) { - return false; - } + return sa.isCycling(); } else if (property.equals("Dash")) { - if (!sa.isDash()) { - return false; - } + return sa.isDash(); } else if (property.equals("Flashback")) { - if (!sa.isFlashBackAbility()) { - return false; - } + return sa.isFlashBackAbility(); } else if (property.equals("Jumpstart")) { - if (!sa.isJumpstart()) { - return false; - } + return sa.isJumpstart(); } else if (property.equals("Kicked")) { - if (!sa.isKicked()) { - return false; - } + return sa.isKicked(); } else if (property.equals("Loyalty")) { - if (!sa.isPwAbility()) { - return false; - } + return sa.isPwAbility(); } else if (property.equals("Aftermath")) { - if (!sa.isAftermath()) { - return false; - } + return sa.isAftermath(); } else if (property.equals("MorphUp")) { - if (!sa.isMorphUp()) { - return false; - } + return sa.isMorphUp(); } else if (property.equals("Equip")) { - if (!sa.hasParam("Equip")) { - return false; - } + return sa.hasParam("Equip"); } else if (property.equals("MayPlaySource")) { StaticAbility m = sa.getMayPlay(); if (m == null) { return false; } - if (!source.equals(m.getHostCard())) { - return false; - } + return source.equals(m.getHostCard()); } else if (property.startsWith("IsTargeting")) { - String k[] = property.split(" ", 2); + String[] k = property.split(" ", 2); boolean found = false; for (GameObject o : AbilityUtils.getDefinedObjects(source, k[1], spellAbility)) { if (sa.isTargeting(o)) { @@ -217,15 +165,11 @@ public class ForgeScript { break; } } - if (!found) { - return false; - } + return found; } else if (property.equals("YouCtrl")) { return sa.getActivatingPlayer().equals(sourceController); } else if (sa.getHostCard() != null) { - if (!sa.getHostCard().hasProperty(property, sourceController, source, spellAbility)) { - return false; - } + return sa.getHostCard().hasProperty(property, sourceController, source, spellAbility); } return true; diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 4e58a1aba55..beef5eade46 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -845,7 +845,7 @@ public class Game { } } - library.removeAll((Collection)toRemove); + library.removeAll(toRemove); if (library.size() > 0) { //Make sure that matches were found. If not, use the original method to choose antes Card ante = library.get(MyRandom.getRandom().nextInt(library.size())); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 2b95afafab1..50d3523676d 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -763,7 +763,7 @@ public class GameAction { checkStaticAbilities(true); } public final void checkStaticAbilities(final boolean runEvents) { - checkStaticAbilities(runEvents, Sets.newHashSet(), CardCollection.EMPTY); + checkStaticAbilities(runEvents, Sets.newHashSet(), CardCollection.EMPTY); } public final void checkStaticAbilities(final boolean runEvents, final Set affectedCards, final CardCollectionView preList) { if (isCheckingStaticAbilitiesOnHold()) { @@ -929,7 +929,7 @@ public class GameAction { } public final void checkStateEffects(final boolean runEvents) { - checkStateEffects(runEvents, Sets.newHashSet()); + checkStateEffects(runEvents, Sets.newHashSet()); } public final void checkStateEffects(final boolean runEvents, final Set affectedCards) { // sol(10/29) added for Phase updates, state effects shouldn't be diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index b8fa75f9f13..e425d2fff6e 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -234,7 +234,7 @@ public final class GameActionUtil { // there is a flashback cost (and not the cards cost) if (keyword.contains(":")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); flashback.setPayCosts(new Cost(k[1], false)); } alternatives.add(flashback); diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 1e7ecd2d3f9..58ab4d02127 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -407,11 +407,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { } // true for all - if (hasProtectionFrom(attach, checkSBA)) { - return false; - } - - return true; + return !hasProtectionFrom(attach, checkSBA); } protected boolean canBeEquippedBy(final Card aura) { diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index 2790a759a64..bfa3f08efae 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -368,7 +368,7 @@ public class GameFormat implements Comparable { if ( strCars != null ) { CardRarity cr; rarities = Lists.newArrayList(); - for (String s: Arrays.asList(strCars.split(", "))) { + for (String s: strCars.split(", ")) { cr = CardRarity.smartValueOf(s); if (!cr.name().equals("Unknown")) { rarities.add(cr); diff --git a/forge-game/src/main/java/forge/game/GameLogEntryType.java b/forge-game/src/main/java/forge/game/GameLogEntryType.java index 76538fef910..8654fba1a55 100644 --- a/forge-game/src/main/java/forge/game/GameLogEntryType.java +++ b/forge-game/src/main/java/forge/game/GameLogEntryType.java @@ -20,7 +20,7 @@ public enum GameLogEntryType { PHASE("Phase"); private final String caption; - private GameLogEntryType(String name) { + GameLogEntryType(String name) { this.caption = name; } diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index 6ad9bd1cf8f..bed7d9a2755 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -182,7 +182,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { if (event.type == DamageType.LoyaltyLoss) { additionalLog = " (Removing " + Lang.nounWithAmount(event.amount, "loyalty counter") + ")"; } - String message = event.source.toString() + " deals " + String.valueOf(event.amount) + " damage" + additionalLog + " to " + event.card.toString() + "."; + String message = event.source.toString() + " deals " + event.amount + " damage" + additionalLog + " to " + event.card.toString() + "."; return new GameLogEntry(GameLogEntryType.DAMAGE, message); } @@ -197,7 +197,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { @Override public GameLogEntry visit(GameEventTurnBegan event) { - String message = "Turn " + String.valueOf(event.turnNumber) + " (" + event.turnOwner.toString() + ")"; + String message = "Turn " + event.turnNumber + " (" + event.turnOwner.toString() + ")"; return new GameLogEntry(GameLogEntryType.TURN, message); } @@ -205,7 +205,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { public GameLogEntry visit(GameEventPlayerDamaged ev) { String extra = ev.infect ? " (as poison counters)" : ""; String damageType = ev.combat ? "combat" : "non-combat"; - String message = ev.source.toString() + " deals " + String.valueOf(ev.amount) + " " + damageType + " damage to " + ev.target.toString() + extra + "."; + String message = ev.source.toString() + " deals " + ev.amount + " " + damageType + " damage to " + ev.target.toString() + extra + "."; return new GameLogEntry(GameLogEntryType.DAMAGE, message); } @@ -281,7 +281,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { @Override public GameLogEntry visit(GameEventMulligan ev) { - String message = ev.player.toString() + " has mulliganed down to " + String.valueOf(ev.player.getZone(ZoneType.Hand).size()) + " cards."; + String message = ev.player.toString() + " has mulliganed down to " + ev.player.getZone(ZoneType.Hand).size() + " cards."; return new GameLogEntry(GameLogEntryType.MULLIGAN, message); } diff --git a/forge-game/src/main/java/forge/game/GameStage.java b/forge-game/src/main/java/forge/game/GameStage.java index 9d32e7ac39f..251fc2e25ee 100644 --- a/forge-game/src/main/java/forge/game/GameStage.java +++ b/forge-game/src/main/java/forge/game/GameStage.java @@ -5,5 +5,5 @@ public enum GameStage { Mulligan, Play, RestartedByKarn, - GameOver; + GameOver } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/GameType.java b/forge-game/src/main/java/forge/game/GameType.java index dc63a482d3f..7ef81786c26 100644 --- a/forge-game/src/main/java/forge/game/GameType.java +++ b/forge-game/src/main/java/forge/game/GameType.java @@ -71,11 +71,11 @@ public enum GameType { private final String name, description; private final Function deckAutoGenerator; - private GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0) { + GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0) { this(deckFormat0, isCardPoolLimited0, canSideboard0, addWonCardsMidgame0, name0, description0, null); } - private GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0, Function deckAutoGenerator0) { + GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0, Function deckAutoGenerator0) { final Localizer localizer = forge.util.Localizer.getInstance(); deckFormat = deckFormat0; isCardPoolLimited = isCardPoolLimited0; diff --git a/forge-game/src/main/java/forge/game/GlobalRuleChange.java b/forge-game/src/main/java/forge/game/GlobalRuleChange.java index aa2e4f1b326..2e7fc2ca2ab 100644 --- a/forge-game/src/main/java/forge/game/GlobalRuleChange.java +++ b/forge-game/src/main/java/forge/game/GlobalRuleChange.java @@ -40,7 +40,7 @@ public enum GlobalRuleChange { private final String ruleText; - private GlobalRuleChange(String text) { + GlobalRuleChange(String text) { ruleText = text; } diff --git a/forge-game/src/main/java/forge/game/IIdentifiable.java b/forge-game/src/main/java/forge/game/IIdentifiable.java index 8c3bf20272a..6b90c6826e8 100644 --- a/forge-game/src/main/java/forge/game/IIdentifiable.java +++ b/forge-game/src/main/java/forge/game/IIdentifiable.java @@ -3,8 +3,8 @@ package forge.game; import com.google.common.base.Function; public interface IIdentifiable { - public abstract int getId(); - public static final Function FN_GET_ID = new Function() { + int getId(); + Function FN_GET_ID = new Function() { @Override public Integer apply(final IIdentifiable input) { return Integer.valueOf(input.getId()); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index 6fd213ea43c..1e770f1fce9 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -64,7 +64,7 @@ public final class AbilityFactory { SubAbility("DB"); private final String prefix; - private AbilityRecordType(String prefix) { + AbilityRecordType(String prefix) { this.prefix = prefix; } public String getPrefix() { diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 747945ae97b..399515f6755 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -35,7 +35,6 @@ import io.sentry.event.BreadcrumbBuilder; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -1063,7 +1062,7 @@ public class AbilityUtils { } else if (defined.startsWith("OppNon")) { players.addAll(player.getOpponents()); - players.removeAll((Collection)getDefinedPlayers(card, defined.substring(6), sa)); + players.removeAll(getDefinedPlayers(card, defined.substring(6), sa)); } else if (defined.startsWith("Replaced")) { final SpellAbility root = sa.getRootAbility(); @@ -1800,7 +1799,7 @@ public class AbilityUtils { public static final String getSVar(final CardTraitBase ability, final String sVarName) { String val = null; if (ability instanceof SpellAbility) { - val = ((SpellAbility) ability).getSVar(sVarName); + val = ability.getSVar(sVarName); } if (StringUtils.isEmpty(val)) { Card host = null; @@ -1857,7 +1856,7 @@ public class AbilityUtils { public boolean apply(Card input) { for (final KeywordInterface inst : input.getKeywords(Keyword.SPLICE)) { String k = inst.getOriginal(); - final String n[] = k.split(":"); + final String[] n = k.split(":"); if (source.isValid(n[1].split(","), player, input, sa)) { return true; } @@ -1890,7 +1889,7 @@ public class AbilityUtils { // This Function thinks that Splice exist only once on the card for (final KeywordInterface inst : c.getKeywords(Keyword.SPLICE)) { final String k = inst.getOriginal(); - final String n[] = k.split(":"); + final String[] n = k.split(":"); spliceCost = new Cost(n[2], false); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java index 2811591354c..3114cf48501 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java @@ -51,7 +51,7 @@ public class ActivateAbilityEffect extends SpellAbilityEffect { continue; } SpellAbility manaAb = p.getController().chooseSingleSpellForEffect( - possibleAb, sa, "Choose a mana ability:", ImmutableMap.of()); + possibleAb, sa, "Choose a mana ability:", ImmutableMap.of()); p.getController().playChosenSpellAbility(manaAb); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java index eb53cecf76b..e3e53dc6fa0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java @@ -38,7 +38,7 @@ public class AssignGroupEffect extends SpellAbilityEffect { List defined = getDefinedOrTargeted(sa, "Defined"); - final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); + final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); Player chooser = sa.getActivatingPlayer(); if (sa.hasParam("Chooser")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java index fdd3365212e..0ea798f50e9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java @@ -54,7 +54,7 @@ public class BidLifeEffect extends SpellAbilityEffect { willBid = false; for (final Player p : bidPlayers) { final boolean result = p.getController().confirmBidAction(sa, PlayerActionConfirmMode.BidLife, - "Do you want to top bid? Current Bid =" + String.valueOf(bid), bid, winner); + "Do you want to top bid? Current Bid =" + bid, bid, winner); willBid |= result; if (result) { // a different choose number bid += p.getController().chooseNumber(sa, "Bid life:", 1, 9); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java index 91ee11bd4b8..131eecbcff7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java @@ -71,13 +71,13 @@ public class ChangeTextEffect extends SpellAbilityEffect { validTypes.addAll(CardType.Constant.CREATURE_TYPES); kindOfType = "creature"; } - changedTypeWordOriginal = sa.getActivatingPlayer().getController().chooseSomeType(kindOfType, sa, validTypes, Lists.newArrayList()); + changedTypeWordOriginal = sa.getActivatingPlayer().getController().chooseSomeType(kindOfType, sa, validTypes, Lists.newArrayList()); } else { changedTypeWordOriginal = changedTypeWordsArray[0]; } validTypes.clear(); - final List forbiddenTypes = sa.hasParam("ForbiddenNewTypes") ? Lists.newArrayList(sa.getParam("ForbiddenNewTypes").split(",")) : Lists.newArrayList(); + final List forbiddenTypes = sa.hasParam("ForbiddenNewTypes") ? Lists.newArrayList(sa.getParam("ForbiddenNewTypes").split(",")) : Lists.newArrayList(); forbiddenTypes.add(changedTypeWordOriginal); if (changedTypeWordsArray[1].startsWith("Choose")) { if (changedTypeWordsArray[1].equals("ChooseBasicLandType")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 58220d302fb..8cbf3f0ba5b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -908,7 +908,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (totalcmc != null) { if (totcmc >= 0) { - fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + Integer.toString(totcmc), source.getController(), source); + fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + totcmc, source.getController(), source); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index 5d7083bf5ab..d87d9da4b85 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -98,7 +98,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { int chosenP = 0; while (!creature.isEmpty()) { Card c = p.getController().chooseSingleEntityForEffect(creature, sa, - "Select creature(s) with total power less than or equal to " + Integer.toString(totP - chosenP - negativeNum) + "Select creature(s) with total power less than or equal to " + (totP - chosenP - negativeNum) + "\r\n(Selected:" + chosenPool + ")\r\n" + "(Total Power: " + chosenP + ")", chosenP <= totP); if (c == null) { if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, "Cancel Choose?")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java index 93e5b3bca09..9073e1a9342 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java @@ -30,14 +30,14 @@ public class ChooseGenericEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); - final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); + final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); final SpellAbility fallback = sa.getAdditionalAbility("FallbackAbility"); final List tgtPlayers = getDefinedPlayersOrTargeted(sa); for (final Player p : tgtPlayers) { // determine if any of the choices are not valid - List saToRemove = Lists.newArrayList(); + List saToRemove = Lists.newArrayList(); for (SpellAbility saChoice : abilities) { if (!saChoice.getRestrictions().checkOtherRestrictions(host, saChoice, sa.getActivatingPlayer()) ) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index 19933d913e2..950643e4a9c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -124,7 +124,7 @@ public class CloneEffect extends SpellAbilityEffect { } if (!pumpKeywords.isEmpty()) { - tgtCard.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, ts); + tgtCard.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, ts); } tgtCard.updateStateForView(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index 9844f1dd6a2..ec26b621f1d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -142,7 +142,7 @@ public class ControlGainEffect extends SpellAbilityEffect { } if (!kws.isEmpty()) { - tgtC.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, tStamp); + tgtC.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, tStamp); game.fireEvent(new GameEventCardStatsChanged(tgtC)); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 2ecdfcfd620..612737941e8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -192,7 +192,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { copyInPlay.setCloneOrigin(host); if (!pumpKeywords.isEmpty()) { - copyInPlay.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, timestamp); + copyInPlay.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, timestamp); } crds.add(copyInPlay); if (sa.hasParam("RememberCopied")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java index 15a4a69bcf2..5338477cae1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java @@ -32,7 +32,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { int amount = 0; if (!num.equals("All") && !num.equals("Remembered")) { amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa); - }; + } sb.append("Remove "); if (sa.hasParam("UpTo")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java index d3c5ab0bc4c..33cd4a6aaf7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java @@ -30,9 +30,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { Map mapParams = Maps.newHashMap(sa.getMapParams()); - if (mapParams.containsKey("Cost")) { - mapParams.remove("Cost"); - } + mapParams.remove("Cost"); if (mapParams.containsKey("SpellDescription")) { mapParams.put("TriggerDescription", mapParams.get("SpellDescription")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java index a96057b6c34..8fe2f8b4813 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java @@ -29,9 +29,7 @@ public class ImmediateTriggerEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { Map mapParams = Maps.newHashMap(sa.getMapParams()); - if (mapParams.containsKey("Cost")) { - mapParams.remove("Cost"); - } + mapParams.remove("Cost"); if (mapParams.containsKey("SpellDescription")) { mapParams.put("TriggerDescription", mapParams.get("SpellDescription")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java index d4af63d3a8e..39693308a68 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java @@ -43,12 +43,12 @@ public class LifeLoseEffect extends SpellAbilityEffect { lifeLost += p.loseLife(lifeAmount); } } - sa.getHostCard().setSVar("AFLifeLost", "Number$" + Integer.toString(lifeLost)); + sa.getHostCard().setSVar("AFLifeLost", "Number$" + lifeLost); // Exceptional case for Extort: must propagate the amount of life lost to subability, // otherwise the first Extort trigger per game won't work if (sa.getSubAbility() != null && ApiType.GainLife.equals(sa.getSubAbility().getApi())) { - sa.getSubAbility().setSVar("AFLifeLost", "Number$" + Integer.toString(lifeLost)); + sa.getSubAbility().setSVar("AFLifeLost", "Number$" + lifeLost); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index 2a09ba0eb5b..8929a776217 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -123,7 +123,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { final List playerList = AbilityUtils.getDefinedPlayers(host, players, sa); for (final Player player : playerList) { for (final String gain : gains) { - player.addChangedKeywords(ImmutableList.of("Protection from " + gain), ImmutableList.of(), timestamp); + player.addChangedKeywords(ImmutableList.of("Protection from " + gain), ImmutableList.of(), timestamp); } if (!sa.hasParam("Permanent")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java index 3b2b1fe6445..df30dea7f34 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java @@ -27,7 +27,7 @@ public class ProtectEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final List gains = getProtectionList(sa); - final boolean choose = (sa.hasParam("Choices")) ? true : false; + final boolean choose = sa.hasParam("Choices"); final String joiner = choose ? "or" : "and"; final StringBuilder sb = new StringBuilder(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 591dcf525ad..c20bd2828c7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -60,7 +60,7 @@ public class PumpEffect extends SpellAbilityEffect { redrawPT = true; } - gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); + gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); if (redrawPT) { gameCard.updatePowerToughnessForView(); } @@ -106,7 +106,7 @@ public class PumpEffect extends SpellAbilityEffect { && !(host.isInPlay() || host.isInZone(ZoneType.Stack))) { return; } - p.addChangedKeywords(keywords, ImmutableList.of(), timestamp); + p.addChangedKeywords(keywords, ImmutableList.of(), timestamp); if (!sa.hasParam("Permanent")) { // If not Permanent, remove Pumped at EOT @@ -252,7 +252,7 @@ public class PumpEffect extends SpellAbilityEffect { if (defined.equals("ChosenType")) { replaced = host.getChosenType(); } else if (defined.equals("CardUIDSource")) { - replaced = "CardUID_" + String.valueOf(host.getId()); + replaced = "CardUID_" + host.getId(); } else if (defined.equals("ActivatorName")) { replaced = sa.getActivatingPlayer().getName(); } @@ -277,9 +277,7 @@ public class PumpEffect extends SpellAbilityEffect { if (sa.hasParam("NoRepetition")) { for (KeywordInterface inst : tgtCards.get(0).getKeywords()) { final String kws = inst.getOriginal(); - if (total.contains(kws)) { - total.remove(kws); - } + total.remove(kws); } } final int min = Math.min(total.size(), numkw); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 366eb1c8680..1ee0b0f0f17 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -113,7 +113,7 @@ public class Card extends GameEntity implements Comparable { private final Map mayPlay = Maps.newHashMap(); - private final Multimap withFlash = HashMultimap.create(); + private final Multimap withFlash = HashMultimap.create(); // changes by AF animate and continuous static effects - timestamp is the key of maps private final Map changedCardTypes = Maps.newTreeMap(); @@ -1196,9 +1196,7 @@ public class Card extends GameEntity implements Comparable { if (type == CounterType.DREAM) { // need to be done extra because it is also a state based action - if (hasKeyword("CARDNAME can't have more than seven dream counters on it.") && getCounters(CounterType.DREAM) > 6) { - return false; - } + return !hasKeyword("CARDNAME can't have more than seven dream counters on it.") || getCounters(CounterType.DREAM) <= 6; } return true; } @@ -1709,7 +1707,7 @@ public class Card extends GameEntity implements Comparable { sbLong.append(sbx).append("\r\n"); } } else if (keyword.startsWith("Hexproof:")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); sbLong.append("Hexproof from ").append(k[2]) .append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } else if (keyword.endsWith(".") && !keyword.startsWith("Haunt")) { @@ -1803,7 +1801,7 @@ public class Card extends GameEntity implements Comparable { } else if (keyword.equals("AllNonLegendaryCreatureNames")) { sbLong.append(getName()).append(" has all names of nonlegendary creature cards.\r\n"); } else if (keyword.startsWith("IfReach")) { - String k[] = keyword.split(":"); + String[] k = keyword.split(":"); sbLong.append(getName()).append(" can block ") .append(CardType.getPluralType(k[1])) .append(" as though it had reach.\r\n"); @@ -1813,7 +1811,7 @@ public class Card extends GameEntity implements Comparable { String desc = AbilityFactory.getMapParams(getSVar(k[1])).get("SpellDescription"); sbLong.append(desc); } else if (keyword.startsWith("Saga")) { - String k[] = keyword.split(":"); + String[] k = keyword.split(":"); String desc = "(As this Saga enters and after your draw step, " + " add a lore counter. Sacrifice after " + Strings.repeat("I", Integer.valueOf(k[1])) + ".)"; sbLong.append(desc); @@ -2201,7 +2199,7 @@ public class Card extends GameEntity implements Comparable { if (n.length > 3) { desc = n[3]; } else { - String k[] = n[1].split(","); + String[] k = n[1].split(","); for (int i = 0; i < k.length; i++) { if (CardType.isACardType(k[i])) { k[i] = k[i].toLowerCase(); @@ -3392,7 +3390,7 @@ public class Card extends GameEntity implements Comparable { } @Override public String toString() { - return TextUtil.concatWithSpace("c:"+String.valueOf(currentValue),"tb:"+String.valueOf(tempBoost),"bfc:"+String.valueOf(bonusFromCounters)); + return TextUtil.concatWithSpace("c:"+ currentValue,"tb:"+ tempBoost,"bfc:"+ bonusFromCounters); } } @@ -4785,7 +4783,7 @@ public class Card extends GameEntity implements Comparable { CardCollection newCardsInCommand = (CardCollection)getGame().getCardsIn(ZoneType.Command); newCardsInCommand.removeAll(cardsInCommand); if (!newCardsInCommand.isEmpty()) { - newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + Integer.toString(dmgToBePrevented)); + newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + dmgToBePrevented); } } subtractPreventNextDamageWithEffect(shieldSource, restDamage); @@ -5080,7 +5078,7 @@ public class Card extends GameEntity implements Comparable { addChangedCardTypes(new CardType(Collections.singletonList("Aura")), new CardType(Collections.singletonList("Creature")), false, false, false, false, false, false, true, bestowTimestamp, updateView); - addChangedCardKeywords(Collections.singletonList("Enchant creature"), Lists.newArrayList(), + addChangedCardKeywords(Collections.singletonList("Enchant creature"), Lists.newArrayList(), false, false, bestowTimestamp, updateView); } @@ -5384,7 +5382,7 @@ public class Card extends GameEntity implements Comparable { switch (kw.getOriginal()) { case "Shroud": StringBuilder sb = new StringBuilder(); - sb.append("Can target CardUID_").append(String.valueOf(getId())); + sb.append("Can target CardUID_").append(getId()); sb.append(" with spells and abilities as though it didn't have shroud."); if (sa.getActivatingPlayer() == null) { System.err.println("Unexpected behavior: SA activator was null when trying to determine if the activating player could target a card with Shroud. SA host card = " + source + ", SA = " + sa); @@ -5447,9 +5445,7 @@ public class Card extends GameEntity implements Comparable { } // check valid - if (!isValid(tgt.getValidTgts(), aura.getController(), aura, sa)) { - return false; - } + return isValid(tgt.getValidTgts(), aura.getController(), aura, sa); } return true; @@ -5457,18 +5453,12 @@ public class Card extends GameEntity implements Comparable { @Override protected final boolean canBeEquippedBy(final Card equip) { - if (!isCreature() || !isInPlay()) { - return false; - } - return true; + return isCreature() && isInPlay(); } @Override protected boolean canBeFortifiedBy(final Card fort) { - if (!isLand() || !isInPlay() || fort.isLand()) { - return false; - } - return true; + return isLand() && isInPlay() && !fort.isLand(); } /* (non-Javadoc) @@ -5727,11 +5717,7 @@ public class Card extends GameEntity implements Comparable { } } - if (!getController().canSacrificeBy(source)) { - return false; - } - - return true; + return getController().canSacrificeBy(source); } public CardRules getRules() { @@ -6130,10 +6116,7 @@ public class Card extends GameEntity implements Comparable { if (hasKeyword(Keyword.FLASH)) { return true; } - if (withFlash.containsValue(p)) { - return true; - } - return false; + return withFlash.containsValue(p); } public void addWithFlash(Long timestamp, Iterable players) { @@ -6170,11 +6153,7 @@ public class Card extends GameEntity implements Comparable { return false; } - if (!getOwner().canDiscardBy(sa)) { - return false; - } - - return true; + return getOwner().canDiscardBy(sa); } public void addAbilityActivated(SpellAbility ability) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 2a69b3e4567..98dab46962d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -645,7 +645,7 @@ public class CardFactory { Trigger t = null; if (sa.isWrapper()) { // copy trigger? - t = ((WrappedAbility) sa).getTrigger(); + t = sa.getTrigger(); } else { // some keyword ability, e.g. Exalted, Annihilator return sa.copy(); } @@ -677,7 +677,7 @@ public class CardFactory { WrappedAbility wrapperAbility = new WrappedAbility(t, trig, ((WrappedAbility) sa).getDecider()); wrapperAbility.setTrigger(true); - wrapperAbility.setMandatory(((WrappedAbility) sa).isMandatory()); + wrapperAbility.setMandatory(sa.isMandatory()); wrapperAbility.setDescription(wrapperAbility.getStackDescription()); t.setTriggeredSA(wrapperAbility); return wrapperAbility; @@ -774,7 +774,7 @@ public class CardFactory { // triggers to add to clone if (sa.hasParam("AddTriggers")) { - for (final String s : Arrays.asList(sa.getParam("AddTriggers").split(","))) { + for (final String s : sa.getParam("AddTriggers").split(",")) { if (origSVars.containsKey(s)) { final String actualTrigger = origSVars.get(s); final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, out, true); @@ -786,7 +786,7 @@ public class CardFactory { // SVars to add to clone if (sa.hasParam("AddSVars") || sa.hasParam("GainTextSVars")) { final String str = sa.getParamOrDefault("GainTextSVars", sa.getParam("AddSVars")); - for (final String s : Arrays.asList(str.split(","))) { + for (final String s : str.split(",")) { if (origSVars.containsKey(s)) { final String actualsVar = origSVars.get(s); state.setSVar(s, actualsVar); @@ -797,7 +797,7 @@ public class CardFactory { // abilities to add to clone if (sa.hasParam("AddAbilities") || sa.hasParam("GainTextAbilities")) { final String str = sa.getParamOrDefault("GainTextAbilities", sa.getParam("AddAbilities")); - for (final String s : Arrays.asList(str.split(","))) { + for (final String s : str.split(",")) { if (origSVars.containsKey(s)) { final String actualAbility = origSVars.get(s); final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, out); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index bf22da56bb6..3c2413b6ed6 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -147,7 +147,7 @@ public class CardFactoryUtil { sbCost.append("— "); } // get rid of the ": " at the end - sbCost.append(costDesc.substring(0, costDesc.length() - 2)); + sbCost.append(costDesc, 0, costDesc.length() - 2); StringBuilder sb = new StringBuilder(); sb.append("ST$ SetState | Cost$ ").append(costStr).append(" | CostDesc$ ").append(sbCost); @@ -292,11 +292,7 @@ public class CardFactoryUtil { * @return a boolean. */ public static boolean isCounterable(final Card c) { - if (c.hasKeyword("CARDNAME can't be countered.") || !c.getCanCounter()) { - return false; - } - - return true; + return !c.hasKeyword("CARDNAME can't be countered.") && c.getCanCounter(); } /** @@ -318,7 +314,7 @@ public class CardFactoryUtil { for (KeywordInterface k : c.getKeywords()) { final String o = k.getOriginal(); if (o.startsWith("CantBeCounteredBy")) { - final String m[] = o.split(":"); + final String[] m = o.split(":"); if (sa.isValid(m[1].split(","), c.getController(), c, null)) { return false; } @@ -2186,12 +2182,12 @@ public class CardFactoryUtil { final String abStringAfflict = "DB$ LoseLife | Defined$ TriggeredDefendingPlayer" + " | LifeAmount$ " + n; - final Trigger afflictTrigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger afflictTrigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); afflictTrigger.setOverridingAbility(AbilityFactory.getAbility(abStringAfflict, card)); inst.addTrigger(afflictTrigger); } else if (keyword.startsWith("Afterlife")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); final String name = StringUtils.join(k, " "); final StringBuilder sb = new StringBuilder(); @@ -2435,7 +2431,7 @@ public class CardFactoryUtil { final String effect = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | " + "CounterNum$ 1 | Evolve$ True"; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); inst.addTrigger(trigger); @@ -2731,7 +2727,7 @@ public class CardFactoryUtil { " | TriggerDescription$ Melee (" + inst.getReminderText() + ")"; final String effect = "DB$ Pump | Defined$ TriggeredAttackerLKICopy | NumAtt$ MeleeX | NumDef$ MeleeX"; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); SpellAbility sa = AbilityFactory.getAbility(effect, card); sa.setSVar("MeleeX", "TriggeredPlayersDefenders$Amount"); @@ -2746,7 +2742,7 @@ public class CardFactoryUtil { final String effect = "DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1" + " | ValidTgts$ Creature.attacking+powerLTX" + " | TgtPrompt$ Select target attacking creature with less power"; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); SpellAbility sa = AbilityFactory.getAbility(effect, card); sa.setSVar("X", "Count$CardPower"); @@ -2854,7 +2850,7 @@ public class CardFactoryUtil { final String trigStr = "Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Secondary$ True" + " | TriggerZones$ Battlefield | TriggerDescription$ Poisonous " + n + " (" + inst.getReminderText() + ")"; - final Trigger parsedTrigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger parsedTrigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); final String effect = "DB$ Poison | Defined$ TriggeredTarget | Num$ " + n; parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); @@ -2902,7 +2898,7 @@ public class CardFactoryUtil { final String effect = "DB$ Pump | Defined$ TriggeredAttackerLKICopy" + " | NumAtt$ Rampage" + n + " | NumDef$ Rampage" + n; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); SpellAbility sa = AbilityFactory.getAbility(effect, card); sa.setSVar("Rampage" + n, "SVar$RampageCount/Times." + n); @@ -3070,7 +3066,7 @@ public class CardFactoryUtil { inst.addTrigger(parsedTrigger); } else if (keyword.startsWith("Suspend")) { //upkeep trigger - StringBuilder upkeepTrig = new StringBuilder();; + StringBuilder upkeepTrig = new StringBuilder(); upkeepTrig.append("Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Exile "); upkeepTrig.append(" | IsPresent$ Card.Self+suspended | PresentZone$ Exile"); @@ -3201,7 +3197,7 @@ public class CardFactoryUtil { SpellAbility saDelay = AbilityFactory.getAbility(strDelay, card); saDelay.setAdditionalAbility("Execute", (AbilitySub) AbilityFactory.getAbility(strSac, card)); - final Trigger trigger = TriggerHandler.parseTrigger(strTrig.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(strTrig, card, intrinsic); trigger.setOverridingAbility(saDelay); inst.addTrigger(trigger); } @@ -3404,7 +3400,7 @@ public class CardFactoryUtil { sb.append("| ValidStackSa$ Spell.Flashback | Description$ Flashback"); if (keyword.contains(":")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); final Cost cost = new Cost(k[1], false); sb.append( cost.isOnlyManaCost() ? " " : "—"); @@ -3896,7 +3892,7 @@ public class CardFactoryUtil { // Add the Epic effect as a subAbility String dbStr = "DB$ Effect | Triggers$ EpicTrigger | SVars$ EpicCopy | StaticAbilities$ EpicCantBeCast | Duration$ Permanent | Epic$ True"; - final AbilitySub newSA = (AbilitySub) AbilityFactory.getAbility(dbStr.toString(), card); + final AbilitySub newSA = (AbilitySub) AbilityFactory.getAbility(dbStr, card); newSA.setSVar("EpicCantBeCast", "Mode$ CantBeCast | ValidCard$ Card | Caster$ You | EffectZone$ Command | Description$ For the rest of the game, you can't cast spells."); newSA.setSVar("EpicTrigger", "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ EpicCopy | TriggerDescription$ " @@ -3964,7 +3960,7 @@ public class CardFactoryUtil { // don't use SimpleString there because it does has "and" between cost i dont want that costStr = cost.toString(); // but now it has ": " at the end i want to remove - sb.append("| CostDesc$ ").append(costStr.substring(0, costStr.length() - 2)); + sb.append("| CostDesc$ ").append(costStr, 0, costStr.length() - 2); if (!cost.isOnlyManaCost()) { sb.append("."); } @@ -4542,7 +4538,7 @@ public class CardFactoryUtil { final StringBuilder sbValid = new StringBuilder(); if (!keyword.equals("Hexproof")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); sbDesc.append(" from ").append(k[2]); sbValid.append("| ValidSource$ ").append(k[1]); diff --git a/forge-game/src/main/java/forge/game/card/CardPlayOption.java b/forge-game/src/main/java/forge/game/card/CardPlayOption.java index 3c53c4d0e35..b7531dde10d 100644 --- a/forge-game/src/main/java/forge/game/card/CardPlayOption.java +++ b/forge-game/src/main/java/forge/game/card/CardPlayOption.java @@ -11,7 +11,7 @@ public final class CardPlayOption { /** Indicates the mana cost must be paid. */ YES, /** Indicates the mana cost may not be paid. */ - NO; + NO } private final Player player; diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 5d5a415af5c..4f4d00b2010 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -214,7 +214,7 @@ public final class CardPredicates { return c.canBeSacrificedBy(sa); } }; - }; + } public static final Predicate canBeAttached(final Card aura) { return new Predicate() { @@ -223,7 +223,7 @@ public final class CardPredicates { return c.canBeAttached(aura); } }; - }; + } public static final Predicate isColor(final byte color) { return new Predicate() { diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 74112fa659e..5be3ea783c9 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -38,21 +38,13 @@ public class CardProperty { // by name can also have color names, so needs to happen before colors. if (property.startsWith("named")) { String name = TextUtil.fastReplace(property.substring(5), ";", ","); // for some legendary cards - if (!card.sharesNameWith(name)) { - return false; - } + return card.sharesNameWith(name); } else if (property.startsWith("notnamed")) { - if (card.sharesNameWith(property.substring(8))) { - return false; - } + return !card.sharesNameWith(property.substring(8)); } else if (property.startsWith("sameName")) { - if (!card.sharesNameWith(source)) { - return false; - } + return card.sharesNameWith(source); } else if (property.equals("NamedCard")) { - if (!card.sharesNameWith(source.getNamedCard())) { - return false; - } + return card.sharesNameWith(source.getNamedCard()); } else if (property.equals("NamedByRememberedPlayer")) { if (!source.hasRemembered()) { final Card newCard = game.getCardState(source); @@ -72,41 +64,23 @@ public class CardProperty { } } } else if (property.equals("Permanent")) { - if (card.isInstant() || card.isSorcery()) { - return false; - } + return !card.isInstant() && !card.isSorcery(); } else if (property.equals("Historic")) { - if (!card.isHistoric()) { - return false; - } + return card.isHistoric(); } else if (property.startsWith("CardUID_")) {// Protection with "doesn't remove effect" - if (card.getId() != Integer.parseInt(property.split("CardUID_")[1])) { - return false; - } + return card.getId() == Integer.parseInt(property.split("CardUID_")[1]); } else if (property.equals("ChosenCard")) { - if (!source.hasChosenCard(card)) { - return false; - } + return source.hasChosenCard(card); } else if (property.equals("nonChosenCard")) { - if (source.hasChosenCard(card)) { - return false; - } + return !source.hasChosenCard(card); } else if (property.equals("DoubleFaced")) { - if (!card.isDoubleFaced()) { - return false; - } + return card.isDoubleFaced(); } else if (property.equals("Flip")) { - if (!card.isFlipCard()) { - return false; - } + return card.isFlipCard(); } else if (property.equals("Split")) { - if (!card.isSplitCard()) { - return false; - } + return card.isSplitCard(); } else if (property.equals("NotSplit")) { - if (card.isSplitCard()) { - return false; - } + return !card.isSplitCard(); } else if (property.startsWith("leftcmc") || property.startsWith("rightcmc")) { int x; int y = 0; @@ -126,29 +100,17 @@ public class CardProperty { x = AbilityUtils.calculateAmount(source, rhs, spellAbility); } - if (!Expressions.compare(y, property, x)) { - return false; - } + return Expressions.compare(y, property, x); } else if (property.startsWith("YouCtrl")) { - if (!controller.equals(sourceController)) { - return false; - } + return controller.equals(sourceController); } else if (property.startsWith("YourTeamCtrl")) { - if (controller.getTeam() != sourceController.getTeam()) { - return false; - } + return controller.getTeam() == sourceController.getTeam(); } else if (property.startsWith("YouDontCtrl")) { - if (controller.equals(sourceController)) { - return false; - } + return !controller.equals(sourceController); } else if (property.startsWith("OppCtrl")) { - if (!controller.getOpponents().contains(sourceController)) { - return false; - } + return controller.getOpponents().contains(sourceController); } else if (property.startsWith("ChosenCtrl")) { - if (!controller.equals(source.getChosenPlayer())) { - return false; - } + return controller.equals(source.getChosenPlayer()); } else if (property.startsWith("DefenderCtrl")) { if (!game.getPhaseHandler().inCombat()) { return false; @@ -157,29 +119,21 @@ public class CardProperty { if (!source.hasRemembered()) { return false; } - if (combat.getDefendingPlayerRelatedTo((Card) source.getFirstRemembered()) != controller) { - return false; - } + return combat.getDefendingPlayerRelatedTo((Card) source.getFirstRemembered()) == controller; } else { - if (combat.getDefendingPlayerRelatedTo(source) != controller) { - return false; - } + return combat.getDefendingPlayerRelatedTo(source) == controller; } } else if (property.startsWith("DefendingPlayer")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); if (!game.getPhaseHandler().inCombat()) { return false; } - if (!combat.isPlayerAttacked(p)) { - return false; - } + return combat.isPlayerAttacked(p); } else if (property.startsWith("EnchantedPlayer")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); final Object o = source.getEntityAttachedTo(); if (o instanceof Player) { - if (!p.equals(o)) { - return false; - } + return p.equals(o); } else { // source not enchanting a player return false; } @@ -187,9 +141,7 @@ public class CardProperty { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); final Object o = source.getEntityAttachedTo(); if (o instanceof Card) { - if (!p.equals(((Card) o).getController())) { - return false; - } + return p.equals(((Card) o).getController()); } else { // source not enchanting a card return false; } @@ -202,9 +154,7 @@ public class CardProperty { } } - if (!source.isRemembered(p)) { - return false; - } + return source.isRemembered(p); } else if (property.startsWith("nonRememberedPlayerCtrl")) { if (!source.hasRemembered()) { final Card newCard = game.getCardState(source); @@ -213,9 +163,7 @@ public class CardProperty { } } - if (source.isRemembered(controller)) { - return false; - } + return !source.isRemembered(controller); } else if (property.equals("TargetedPlayerCtrl")) { boolean foundTargetingSA = false; for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { @@ -269,25 +217,15 @@ public class CardProperty { } } } else if (property.startsWith("ActivePlayerCtrl")) { - if (!game.getPhaseHandler().isPlayerTurn(controller)) { - return false; - } + return game.getPhaseHandler().isPlayerTurn(controller); } else if (property.startsWith("NonActivePlayerCtrl")) { - if (game.getPhaseHandler().isPlayerTurn(controller)) { - return false; - } + return !game.getPhaseHandler().isPlayerTurn(controller); } else if (property.startsWith("YouOwn")) { - if (!card.getOwner().equals(sourceController)) { - return false; - } + return card.getOwner().equals(sourceController); } else if (property.startsWith("YouDontOwn")) { - if (card.getOwner().equals(sourceController)) { - return false; - } + return !card.getOwner().equals(sourceController); } else if (property.startsWith("OppOwn")) { - if (!card.getOwner().getOpponents().contains(sourceController)) { - return false; - } + return card.getOwner().getOpponents().contains(sourceController); } else if (property.equals("TargetedPlayerOwn")) { boolean foundTargetingSA = false; for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { @@ -324,49 +262,33 @@ public class CardProperty { final String valid = property.substring(8); if (!card.getOwner().isValid(valid, sourceController, source, spellAbility)) { final List lp = AbilityUtils.getDefinedPlayers(source, valid, spellAbility); - if (!lp.contains(card.getOwner())) { - return false; - } + return lp.contains(card.getOwner()); } } else if (property.startsWith("ControlledBy")) { final String valid = property.substring(13); if (!controller.isValid(valid, sourceController, source, spellAbility)) { final List lp = AbilityUtils.getDefinedPlayers(source, valid, spellAbility); - if (!lp.contains(controller)) { - return false; - } + return lp.contains(controller); } } else if (property.startsWith("OwnerDoesntControl")) { - if (card.getOwner().equals(controller)) { - return false; - } + return !card.getOwner().equals(controller); } else if (property.startsWith("ControllerControls")) { final String type = property.substring(18); if (type.startsWith("AtLeastAsMany")) { String realType = type.split("AtLeastAsMany")[1]; CardCollectionView cards = CardLists.getType(controller.getCardsIn(ZoneType.Battlefield), realType); CardCollectionView yours = CardLists.getType(sourceController.getCardsIn(ZoneType.Battlefield), realType); - if (cards.size() < yours.size()) { - return false; - } + return cards.size() >= yours.size(); } else { final CardCollectionView cards = controller.getCardsIn(ZoneType.Battlefield); - if (CardLists.getType(cards, type).isEmpty()) { - return false; - } + return !CardLists.getType(cards, type).isEmpty(); } } else if (property.startsWith("Other")) { - if (card.equals(source)) { - return false; - } + return !card.equals(source); } else if (property.startsWith("StrictlySelf")) { - if (!card.equals(source) || card.getTimestamp() != source.getTimestamp()) { - return false; - } + return card.equals(source) && card.getTimestamp() == source.getTimestamp(); } else if (property.startsWith("Self")) { - if (!card.equals(source)) { - return false; - } + return card.equals(source); } else if (property.startsWith("ExiledWithSource")) { if (card.getExiledWith() == null) { return false; @@ -381,33 +303,21 @@ public class CardProperty { } } - if (!card.getExiledWith().equals(host)) { - return false; - } + return card.getExiledWith().equals(host); } else if (property.equals("EncodedWithSource")) { - if (!card.getEncodedCards().contains(source)) { - return false; - } + return card.getEncodedCards().contains(source); } else if (property.equals("EffectSource")) { if (!source.isEmblem() && !source.getType().hasSubtype("Effect")) { return false; } - if (!card.equals(source.getEffectSource())) { - return false; - } + return card.equals(source.getEffectSource()); } else if (property.equals("CanBeSacrificedBy")) { - if (!card.canBeSacrificedBy(spellAbility)) { - return false; - } + return card.canBeSacrificedBy(spellAbility); } else if (property.startsWith("AttachedBy")) { - if (!card.hasCardAttachment(source)) { - return false; - } + return card.hasCardAttachment(source); } else if (property.equals("Attached")) { - if (!source.hasCardAttachment(card)) { - return false; - } + return source.hasCardAttachment(card); } else if (property.startsWith("AttachedTo")) { final String restriction = property.split("AttachedTo ")[1]; if (restriction.equals("Targeted")) { @@ -433,24 +343,16 @@ public class CardProperty { return false; } } else { - if ((card.getEntityAttachedTo() == null || !card.getEntityAttachedTo().isValid(restriction, sourceController, source, spellAbility))) { - return false; - } + return (card.getEntityAttachedTo() != null && card.getEntityAttachedTo().isValid(restriction, sourceController, source, spellAbility)); } } else if (property.equals("NameNotEnchantingEnchantedPlayer")) { Player enchantedPlayer = source.getPlayerAttachedTo(); - if (enchantedPlayer == null || enchantedPlayer.isEnchantedBy(card.getName())) { - return false; - } + return enchantedPlayer != null && !enchantedPlayer.isEnchantedBy(card.getName()); } else if (property.equals("NotAttachedTo")) { - if (source.hasCardAttachment(card)) { - return false; - } + return !source.hasCardAttachment(card); } else if (property.startsWith("EnchantedBy")) { if (property.equals("EnchantedBy")) { - if (!card.isEnchantedBy(source) && !card.equals(source.getEntityAttachedTo())) { - return false; - } + return card.isEnchantedBy(source) || card.equals(source.getEntityAttachedTo()); } else { final String restriction = property.split("EnchantedBy ")[1]; switch (restriction) { @@ -495,14 +397,10 @@ public class CardProperty { } } } else { - if (card.isEnchantedBy(source)) { - return false; - } + return !card.isEnchantedBy(source); } } else if (property.startsWith("Enchanted")) { - if (!source.equals(card.getEntityAttachedTo())) { - return false; - } + return source.equals(card.getEntityAttachedTo()); } else if (property.startsWith("CanEnchant")) { final String restriction = property.substring(10); if (restriction.equals("Remembered")) { @@ -511,7 +409,7 @@ public class CardProperty { return false; } } else if (restriction.equals("Source")) { - if (!source.canBeAttached(card)) return false; + return source.canBeAttached(card); } } else if (property.startsWith("CanBeEnchantedBy")) { if (property.substring(16).equals("Targeted")) { @@ -535,9 +433,7 @@ public class CardProperty { } } } else { - if (!card.canBeAttached(source)) { - return false; - } + return card.canBeAttached(source); } } else if (property.startsWith("EquippedBy")) { if (property.substring(10).equals("Targeted")) { @@ -552,74 +448,44 @@ public class CardProperty { } } } else if (property.substring(10).equals("Enchanted")) { - if (source.getEnchantingCard() == null || - !card.hasCardAttachment(source.getEnchantingCard())) { - return false; - } + return source.getEnchantingCard() != null && + card.hasCardAttachment(source.getEnchantingCard()); } else { - if (!card.hasCardAttachment(source)) { - return false; - } + return card.hasCardAttachment(source); } } else if (property.startsWith("FortifiedBy")) { - if (!card.hasCardAttachment(source)) { - return false; - } + return card.hasCardAttachment(source); } else if (property.startsWith("CanBeAttachedBy")) { - if (!card.canBeAttached(source)) { - return false; - } + return card.canBeAttached(source); } else if (property.startsWith("Equipped")) { - if (!source.hasCardAttachment(card)) { - return false; - } + return source.hasCardAttachment(card); } else if (property.startsWith("Fortified")) { // FIXME TODO what property has this? - if (!source.hasCardAttachment(card)) { - return false; - } + return source.hasCardAttachment(card); } else if (property.startsWith("HauntedBy")) { - if (!card.isHauntedBy(source)) { - return false; - } + return card.isHauntedBy(source); } else if (property.startsWith("notTributed")) { - if (card.isTributed()) { - return false; - } + return !card.isTributed(); } else if (property.startsWith("madness")) { - if (!card.isMadness()) { - return false; - } + return card.isMadness(); } else if (property.contains("Paired")) { if (property.contains("With")) { // PairedWith - if (!card.isPaired() || card.getPairedWith() != source) { - return false; - } + return card.isPaired() && card.getPairedWith() == source; } else if (property.startsWith("Not")) { // NotPaired - if (card.isPaired()) { - return false; - } + return !card.isPaired(); } else { // Paired - if (!card.isPaired()) { - return false; - } + return card.isPaired(); } } else if (property.startsWith("Above")) { // "Are Above" Source final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Graveyard); - if (cards.indexOf(source) >= cards.indexOf(card)) { - return false; - } + return cards.indexOf(source) < cards.indexOf(card); } else if (property.startsWith("DirectlyAbove")) { // "Are Directly Above" Source final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Graveyard); - if (cards.indexOf(card) - cards.indexOf(source) != 1) { - return false; - } + return cards.indexOf(card) - cards.indexOf(source) == 1; } else if (property.startsWith("TopGraveyardCreature")) { CardCollection cards = CardLists.filter(card.getOwner().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES); Collections.reverse(cards); - if (cards.isEmpty() || !card.equals(cards.get(0))) { - return false; - } + return !cards.isEmpty() && card.equals(cards.get(0)); } else if (property.startsWith("TopGraveyard")) { final CardCollection cards = new CardCollection(card.getOwner().getCardsIn(ZoneType.Graveyard)); Collections.reverse(cards); @@ -630,28 +496,18 @@ public class CardProperty { for (int i = 0; i < num; i++) { newlist.add(cards.get(i)); } - if (cards.isEmpty() || !newlist.contains(card)) { - return false; - } + return !cards.isEmpty() && newlist.contains(card); } else { - if (cards.isEmpty() || !card.equals(cards.get(0))) { - return false; - } + return !cards.isEmpty() && card.equals(cards.get(0)); } } else if (property.startsWith("BottomGraveyard")) { final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Graveyard); - if (cards.isEmpty() || !card.equals(cards.get(0))) { - return false; - } + return !cards.isEmpty() && card.equals(cards.get(0)); } else if (property.startsWith("TopLibrary")) { final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Library); - if (cards.isEmpty() || !card.equals(cards.get(0))) { - return false; - } + return !cards.isEmpty() && card.equals(cards.get(0)); } else if (property.startsWith("Cloned")) { - if ((card.getCloneOrigin() == null) || !card.getCloneOrigin().equals(source)) { - return false; - } + return (card.getCloneOrigin() != null) && card.getCloneOrigin().equals(source); } else if (property.startsWith("DamagedBy")) { if ((property.endsWith("Source") || property.equals("DamagedBy")) && !card.getReceivedDamageFromThisTurn().containsKey(source)) { @@ -664,21 +520,16 @@ public class CardProperty { } matched |= card.getReceivedDamageFromThisTurn().containsKey(obj); } - if (!matched) - return false; + return matched; } else if (property.endsWith("Equipped")) { final Card equipee = source.getEquipping(); - if (equipee == null || !card.getReceivedDamageFromThisTurn().containsKey(equipee)) - return false; + return equipee != null && card.getReceivedDamageFromThisTurn().containsKey(equipee); } else if (property.endsWith("Enchanted")) { final Card equipee = source.getEnchantingCard(); - if (equipee == null || !card.getReceivedDamageFromThisTurn().containsKey(equipee)) - return false; + return equipee != null && card.getReceivedDamageFromThisTurn().containsKey(equipee); } } else if (property.startsWith("Damaged")) { - if (!card.getDealtDamageToThisTurn().containsKey(source)) { - return false; - } + return card.getDealtDamageToThisTurn().containsKey(source); } else if (property.startsWith("IsTargetingSource")) { for (final SpellAbility sa : card.getCurrentState().getNonManaAbilities()) { final SpellAbility saTargeting = sa.getSATargetingCard(); @@ -693,9 +544,7 @@ public class CardProperty { return false; } else if (property.startsWith("SharesCMCWith")) { if (property.equals("SharesCMCWith")) { - if (!card.sharesCMCWith(source)) { - return false; - } + return card.sharesCMCWith(source); } else { final String restriction = property.split("SharesCMCWith ")[1]; CardCollection list = AbilityUtils.getDefinedCards(source, restriction, spellAbility); @@ -703,9 +552,7 @@ public class CardProperty { } } else if (property.startsWith("SharesColorWith")) { if (property.equals("SharesColorWith")) { - if (!card.sharesColorWith(source)) { - return false; - } + return card.sharesColorWith(source); } else { final String restriction = property.split("SharesColorWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { @@ -766,9 +613,7 @@ public class CardProperty { return ColorSet.fromMask(mostProm).hasAnyColor(MagicColor.fromName(color)); } else if (property.startsWith("notSharesColorWith")) { if (property.equals("notSharesColorWith")) { - if (card.sharesColorWith(source)) { - return false; - } + return !card.sharesColorWith(source); } else { final String restriction = property.split("notSharesColorWith ")[1]; for (final Card c : sourceController.getCardsIn(ZoneType.Battlefield)) { @@ -779,9 +624,7 @@ public class CardProperty { } } else if (property.startsWith("sharesCreatureTypeWith")) { if (property.equals("sharesCreatureTypeWith")) { - if (!card.sharesCreatureTypeWith(source)) { - return false; - } + return card.sharesCreatureTypeWith(source); } else { final String restriction = property.split("sharesCreatureTypeWith ")[1]; switch (restriction) { @@ -814,10 +657,7 @@ public class CardProperty { } break; case "Equipped": - if (source.isEquipping() && card.sharesCreatureTypeWith(source.getEquipping())) { - return true; - } - return false; + return source.isEquipping() && card.sharesCreatureTypeWith(source.getEquipping()); case "Remembered": for (final Object rem : source.getRemembered()) { if (rem instanceof Card) { @@ -853,9 +693,7 @@ public class CardProperty { } } else if (property.startsWith("sharesCardTypeWith")) { if (property.equals("sharesCardTypeWith")) { - if (!card.sharesCardTypeWith(source)) { - return false; - } + return card.sharesCardTypeWith(source); } else { final String restriction = property.split("sharesCardTypeWith ")[1]; switch (restriction) { @@ -879,10 +717,7 @@ public class CardProperty { if (!(triggeringObject instanceof Card)) { return false; } - if (card.sharesCardTypeWith((Card) triggeringObject)) { - return true; - } - return false; + return card.sharesCardTypeWith((Card) triggeringObject); case "EachTopLibrary": final CardCollection cards = new CardCollection(); for (Player p : game.getPlayers()) { @@ -898,13 +733,9 @@ public class CardProperty { } } } else if (property.equals("sharesPermanentTypeWith")) { - if (!card.sharesPermanentTypeWith(source)) { - return false; - } + return card.sharesPermanentTypeWith(source); } else if (property.equals("canProduceSameManaTypeWith")) { - if (!card.canProduceSameManaTypeWith(source)) { - return false; - } + return card.canProduceSameManaTypeWith(source); } else if (property.startsWith("canProduceManaColor")) { final String color = property.split("canProduceManaColor ")[1]; for (SpellAbility ma : card.getManaAbilities()) { @@ -917,9 +748,7 @@ public class CardProperty { return !card.getManaAbilities().isEmpty(); } else if (property.startsWith("sharesNameWith")) { if (property.equals("sharesNameWith")) { - if (!card.sharesNameWith(source)) { - return false; - } + return card.sharesNameWith(source); } else { final String restriction = property.split("sharesNameWith ")[1]; if (restriction.equals("YourGraveyard")) { @@ -959,18 +788,14 @@ public class CardProperty { System.out.println("Looking at TriggeredCard but no SA?"); } else { Card triggeredCard = ((Card)spellAbility.getTriggeringObject("Card")); - if (triggeredCard != null && card.sharesNameWith(triggeredCard)) { - return true; - } + return triggeredCard != null && card.sharesNameWith(triggeredCard); } return false; } } } else if (property.startsWith("doesNotShareNameWith")) { if (property.equals("doesNotShareNameWith")) { - if (card.sharesNameWith(source)) { - return false; - } + return !card.sharesNameWith(source); } else { final String restriction = property.split("doesNotShareNameWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { @@ -993,9 +818,7 @@ public class CardProperty { } } else if (property.startsWith("sharesControllerWith")) { if (property.equals("sharesControllerWith")) { - if (!card.sharesControllerWith(source)) { - return false; - } + return card.sharesControllerWith(source); } else { final String restriction = property.split("sharesControllerWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { @@ -1005,9 +828,7 @@ public class CardProperty { } } else if (property.startsWith("sharesOwnerWith")) { if (property.equals("sharesOwnerWith")) { - if (!card.getOwner().equals(source.getOwner())) { - return false; - } + return card.getOwner().equals(source.getOwner()); } else { final String restriction = property.split("sharesOwnerWith ")[1]; if (restriction.equals("Remembered")) { @@ -1026,9 +847,7 @@ public class CardProperty { if (cards.size() < 2) { return false; } - else if (cards.get(1) != card) { - return false; - } + else return cards.get(1) == card; } else if (property.equals("ThisTurnCast")) { for (final Card c : CardUtil.getThisTurnCast("Card", source)) { if (card.equals(c)) { @@ -1046,18 +865,14 @@ public class CardProperty { } CardCollectionView cards = CardUtil.getThisTurnEntered(destination, origin, "Card", source); - if (!cards.contains(card)) { - return false; - } + return cards.contains(card); } else if (property.equals("DiscardedThisTurn")) { if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { return false; } CardCollectionView cards = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Hand, "Card", source); - if (!cards.contains(card) && !card.getMadnessWithoutCast()) { - return false; - } + return cards.contains(card) || card.getMadnessWithoutCast(); } else if (property.startsWith("ControlledByPlayerInTheDirection")) { final String restrictions = property.split("ControlledByPlayerInTheDirection_")[1]; final String[] res = restrictions.split("_"); @@ -1073,93 +888,53 @@ public class CardProperty { } else { p = sourceController; } - if (p == null || !controller.equals(game.getNextPlayerAfter(p, direction))) { - return false; - } + return p != null && controller.equals(game.getNextPlayerAfter(p, direction)); } else if (property.startsWith("hasKeyword")) { // "withFlash" would find Flashback cards, add this to fix Mystical Teachings - if (!card.hasKeyword(property.substring(10))) { - return false; - } + return card.hasKeyword(property.substring(10)); } else if (property.startsWith("withFlashback")) { boolean fb = card.hasKeyword(Keyword.FLASHBACK); - if (!fb) { - return false; - } + return fb; } else if (property.startsWith("with")) { // ... Card keywords if (property.startsWith("without") && card.hasStartOfUnHiddenKeyword(property.substring(7))) { return false; } - if (!property.startsWith("without") && !card.hasStartOfUnHiddenKeyword(property.substring(4))) { - return false; - } + return property.startsWith("without") || card.hasStartOfUnHiddenKeyword(property.substring(4)); } else if (property.startsWith("tapped")) { - if (!card.isTapped()) { - return false; - } + return card.isTapped(); } else if (property.startsWith("untapped")) { - if (!card.isUntapped()) { - return false; - } + return card.isUntapped(); } else if (property.startsWith("faceDown")) { - if (!card.isFaceDown()) { - return false; - } + return card.isFaceDown(); } else if (property.startsWith("faceUp")) { - if (card.isFaceDown()) { - return false; - } + return !card.isFaceDown(); } else if (property.startsWith("manifested")) { - if (!card.isManifested()) { - return false; - } + return card.isManifested(); } else if (property.startsWith("DrawnThisTurn")) { - if (!card.getDrawnThisTurn()) { - return false; - } + return card.getDrawnThisTurn(); } else if (property.startsWith("enteredBattlefieldThisTurn")) { - if (!(card.getTurnInZone() == game.getPhaseHandler().getTurn())) { - return false; - } + return card.getTurnInZone() == game.getPhaseHandler().getTurn(); } else if (property.startsWith("notEnteredBattlefieldThisTurn")) { - if (card.getTurnInZone() == game.getPhaseHandler().getTurn()) { - return false; - } + return card.getTurnInZone() != game.getPhaseHandler().getTurn(); } else if (property.startsWith("firstTurnControlled")) { - if (!card.isFirstTurnControlled()) { - return false; - } + return card.isFirstTurnControlled(); } else if (property.startsWith("notFirstTurnControlled")) { - if (card.isFirstTurnControlled()) { - return false; - } + return !card.isFirstTurnControlled(); } else if (property.startsWith("startedTheTurnUntapped")) { - if (!card.hasStartedTheTurnUntapped()) { - return false; - } + return card.hasStartedTheTurnUntapped(); } else if (property.startsWith("cameUnderControlSinceLastUpkeep")) { - if (!card.cameUnderControlSinceLastUpkeep()) { - return false; - } + return card.cameUnderControlSinceLastUpkeep(); } else if (property.equals("attackedOrBlockedSinceYourLastUpkeep")) { - if (!card.getDamageHistory().hasAttackedSinceLastUpkeepOf(sourceController) - && !card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController)) { - return false; - } + return card.getDamageHistory().hasAttackedSinceLastUpkeepOf(sourceController) + || card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController); } else if (property.equals("blockedOrBeenBlockedSinceYourLastUpkeep")) { - if (!card.getDamageHistory().hasBeenBlockedSinceLastUpkeepOf(sourceController) - && !card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController)) { - return false; - } + return card.getDamageHistory().hasBeenBlockedSinceLastUpkeepOf(sourceController) + || card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController); } else if (property.startsWith("dealtDamageToYouThisTurn")) { - if (!card.getDamageHistory().getThisTurnDamaged().contains(sourceController)) { - return false; - } + return card.getDamageHistory().getThisTurnDamaged().contains(sourceController); } else if (property.startsWith("dealtDamageToOppThisTurn")) { - if (!card.hasDealtDamageToOpponentThisTurn()) { - return false; - } + return card.hasDealtDamageToOpponentThisTurn(); } else if (property.startsWith("dealtCombatDamageThisTurn ") || property.startsWith("notDealtCombatDamageThisTurn ")) { final String v = property.split(" ")[1]; final List list = card.getDamageHistory().getThisTurnCombatDamaged(); @@ -1170,9 +945,7 @@ public class CardProperty { break; } } - if (found == property.startsWith("not")) { - return false; - } + return found != property.startsWith("not"); } else if (property.startsWith("dealtCombatDamageThisCombat ") || property.startsWith("notDealtCombatDamageThisCombat ")) { final String v = property.split(" ")[1]; final List list = card.getDamageHistory().getThisCombatDamaged(); @@ -1183,53 +956,31 @@ public class CardProperty { break; } } - if (found == property.startsWith("not")) { - return false; - } + return found != property.startsWith("not"); } else if (property.startsWith("controllerWasDealtCombatDamageByThisTurn")) { - if (!source.getDamageHistory().getThisTurnCombatDamaged().contains(controller)) { - return false; - } + return source.getDamageHistory().getThisTurnCombatDamaged().contains(controller); } else if (property.startsWith("controllerWasDealtDamageByThisTurn")) { - if (!source.getDamageHistory().getThisTurnDamaged().contains(controller)) { - return false; - } + return source.getDamageHistory().getThisTurnDamaged().contains(controller); } else if (property.startsWith("wasDealtDamageThisTurn")) { - if ((card.getReceivedDamageFromThisTurn().keySet()).isEmpty()) { - return false; - } + return !(card.getReceivedDamageFromThisTurn().keySet()).isEmpty(); } else if (property.startsWith("dealtDamageThisTurn")) { - if (card.getTotalDamageDoneBy() == 0) { - return false; - } + return card.getTotalDamageDoneBy() != 0; } else if (property.startsWith("attackedThisTurn")) { - if (!card.getDamageHistory().getCreatureAttackedThisTurn()) { - return false; - } + return card.getDamageHistory().getCreatureAttackedThisTurn(); } else if (property.startsWith("attackedLastTurn")) { return card.getDamageHistory().getCreatureAttackedLastTurnOf(controller); } else if (property.startsWith("blockedThisTurn")) { - if (!card.getDamageHistory().getCreatureBlockedThisTurn()) { - return false; - } + return card.getDamageHistory().getCreatureBlockedThisTurn(); } else if (property.startsWith("notExertedThisTurn")) { - if (card.getExertedThisTurn() > 0) { - return false; - } + return card.getExertedThisTurn() <= 0; } else if (property.startsWith("gotBlockedThisTurn")) { - if (!card.getDamageHistory().getCreatureGotBlockedThisTurn()) { - return false; - } + return card.getDamageHistory().getCreatureGotBlockedThisTurn(); } else if (property.startsWith("notAttackedThisTurn")) { - if (card.getDamageHistory().getCreatureAttackedThisTurn()) { - return false; - } + return !card.getDamageHistory().getCreatureAttackedThisTurn(); } else if (property.startsWith("notAttackedLastTurn")) { return !card.getDamageHistory().getCreatureAttackedLastTurnOf(controller); } else if (property.startsWith("notBlockedThisTurn")) { - if (card.getDamageHistory().getCreatureBlockedThisTurn()) { - return false; - } + return !card.getDamageHistory().getCreatureBlockedThisTurn(); } else if (property.startsWith("greatestPower")) { CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); if (property.contains("ControlledBy")) { @@ -1280,9 +1031,7 @@ public class CardProperty { cards = CardLists.getType(cards, prop); } cards = CardLists.getCardsWithHighestCMC(cards); - if (!cards.contains(card)) { - return false; - } + return cards.contains(card); } else if (property.startsWith("greatestRememberedCMC")) { CardCollection cards = new CardCollection(); for (final Object o : source.getRemembered()) { @@ -1294,9 +1043,7 @@ public class CardProperty { return false; } cards = CardLists.getCardsWithHighestCMC(cards); - if (!cards.contains(card)) { - return false; - } + return cards.contains(card); } else if (property.startsWith("lowestRememberedCMC")) { CardCollection cards = new CardCollection(); for (final Object o : source.getRemembered()) { @@ -1308,9 +1055,7 @@ public class CardProperty { return false; } cards = CardLists.getCardsWithLowestCMC(cards); - if (!cards.contains(card)) { - return false; - } + return cards.contains(card); } else if (property.startsWith("lowestCMC")) { final CardCollectionView cards = game.getCardsIn(ZoneType.Battlefield); @@ -1323,74 +1068,40 @@ public class CardProperty { } } } else if (property.startsWith("enchanted")) { - if (!card.isEnchanted()) { - return false; - } + return card.isEnchanted(); } else if (property.startsWith("unenchanted")) { - if (card.isEnchanted()) { - return false; - } + return !card.isEnchanted(); } else if (property.startsWith("enchanting")) { - if (!card.isEnchanting()) { - return false; - } + return card.isEnchanting(); } else if (property.startsWith("equipped")) { - if (!card.isEquipped()) { - return false; - } + return card.isEquipped(); } else if (property.startsWith("unequipped")) { - if (card.isEquipped()) { - return false; - } + return !card.isEquipped(); } else if (property.startsWith("equipping")) { - if (!card.isEquipping()) { - return false; - } + return card.isEquipping(); } else if (property.startsWith("notEquipping")) { - if (card.isEquipping()) { - return false; - } + return !card.isEquipping(); } else if (property.startsWith("token")) { - if (!card.isToken()) { - return false; - } + return card.isToken(); } else if (property.startsWith("nonToken")) { - if (card.isToken()) { - return false; - } + return !card.isToken(); } else if (property.startsWith("hasXCost")) { SpellAbility sa1 = card.getFirstSpellAbility(); - if (sa1 != null && !sa1.isXCost()) { - return false; - } + return sa1 == null || sa1.isXCost(); } else if (property.startsWith("suspended")) { - if (!card.hasSuspend()) { - return false; - } + return card.hasSuspend(); } else if (property.startsWith("delved")) { - if (!source.getDelved().contains(card)) { - return false; - } + return source.getDelved().contains(card); } else if (property.startsWith("convoked")) { - if (!source.getConvoked().contains(card)) { - return false; - } + return source.getConvoked().contains(card); } else if (property.startsWith("exploited")) { - if (!source.getExploited().contains(card)) { - return false; - } + return source.getExploited().contains(card); } else if (property.startsWith("unequalPT")) { - if (card.getNetPower() == card.getNetToughness()) { - return false; - } + return card.getNetPower() != card.getNetToughness(); } else if (property.equals("powerGTtoughness")) { - if (card.getNetPower() <= card.getNetToughness()) { - return false; - } + return card.getNetPower() > card.getNetToughness(); } else if (property.equals("powerLTtoughness")) { - if (card.getNetPower() >= card.getNetToughness()) { - return false; - } + return card.getNetPower() < card.getNetToughness(); } else if (property.startsWith("power") || property.startsWith("toughness") || property.startsWith("cmc") || property.startsWith("totalPT")) { int x; @@ -1416,9 +1127,7 @@ public class CardProperty { x = AbilityUtils.calculateAmount(source, rhs, spellAbility); } - if (!Expressions.compare(y, property, x)) { - return false; - } + return Expressions.compare(y, property, x); } // syntax example: countersGE9 P1P1 or countersLT12TIME (greater number @@ -1454,9 +1163,7 @@ public class CardProperty { final int actualnumber = card.getCounters(CounterType.getType(counterType)); - if (!Expressions.compare(actualnumber, comparator, number)) { - return false; - } + return Expressions.compare(actualnumber, comparator, number); } // These predicated refer to ongoing combat. If no combat happens, they'll return false (meaning not attacking/blocking ATM) else if (property.startsWith("attacking")) { @@ -1466,26 +1173,18 @@ public class CardProperty { if (property.equals("attackingYou")) return combat.isAttacking(card, sourceController); if (property.equals("attackingYouOrYourPW")) { Player defender = combat.getDefenderPlayerByAttacker(card); - if (!sourceController.equals(defender)) { - return false; - } + return sourceController.equals(defender); } } else if (property.startsWith("notattacking")) { return null == combat || !combat.isAttacking(card); } else if (property.equals("attackedThisCombat")) { - if (null == combat || !card.getDamageHistory().getCreatureAttackedThisCombat()) { - return false; - } + return null != combat && card.getDamageHistory().getCreatureAttackedThisCombat(); } else if (property.equals("blockedThisCombat")) { - if (null == combat || !card.getDamageHistory().getCreatureBlockedThisCombat()) { - return false; - } + return null != combat && card.getDamageHistory().getCreatureBlockedThisCombat(); } else if (property.equals("attackedBySourceThisCombat")) { if (null == combat) return false; final GameEntity defender = combat.getDefenderByAttacker(source); - if (defender instanceof Card && !card.equals(defender)) { - return false; - } + return !(defender instanceof Card) || card.equals(defender); } else if (property.startsWith("blocking")) { if (null == combat) return false; String what = property.substring("blocking".length()); @@ -1512,9 +1211,7 @@ public class CardProperty { CardCollection sourceBlocking = new CardCollection(combat.getAttackersBlockedBy(source)); CardCollection thisBlocking = new CardCollection(combat.getAttackersBlockedBy(card)); - if (Collections.disjoint(sourceBlocking, thisBlocking)) { - return false; - } + return !Collections.disjoint(sourceBlocking, thisBlocking); } else if (property.startsWith("notblocking")) { return null == combat || !combat.isBlocking(card); } @@ -1585,35 +1282,27 @@ public class CardProperty { } return false; } else if (property.startsWith("unblocked")) { - if (combat == null || !combat.isUnblocked(card)) { - return false; - } + return combat != null && combat.isUnblocked(card); } else if (property.equals("attackersBandedWith")) { if (card.equals(source)) { // You don't band with yourself return false; } AttackingBand band = combat == null ? null : combat.getBandOfAttacker(source); - if (band == null || !band.getAttackers().contains(card)) { - return false; - } + return band != null && band.getAttackers().contains(card); } else if (property.startsWith("kicked")) { if (property.equals("kicked")) { - if (card.getKickerMagnitude() == 0) { - return false; - } + return card.getKickerMagnitude() != 0; } else { String s = property.split("kicked ")[1]; if ("1".equals(s) && !card.isOptionalCostPaid(OptionalCost.Kicker1)) return false; - if ("2".equals(s) && !card.isOptionalCostPaid(OptionalCost.Kicker2)) return false; + return !"2".equals(s) || card.isOptionalCostPaid(OptionalCost.Kicker2); } } else if (property.startsWith("notkicked")) { - if (card.getKickerMagnitude() > 0) { - return false; - } + return card.getKickerMagnitude() <= 0; } else if (property.startsWith("pseudokicked")) { if (property.equals("pseudokicked")) { - if (!card.isOptionalCostPaid(OptionalCost.Generic)) return false; + return card.isOptionalCostPaid(OptionalCost.Generic); } } else if (property.startsWith("surged")) { if (card.getCastSA() == null) { @@ -1641,33 +1330,19 @@ public class CardProperty { } return card.getCastSA().isSpectacle(); } else if (property.equals("HasDevoured")) { - if (card.getDevouredCards().isEmpty()) { - return false; - } + return !card.getDevouredCards().isEmpty(); } else if (property.equals("HasNotDevoured")) { - if (!card.getDevouredCards().isEmpty()) { - return false; - } + return card.getDevouredCards().isEmpty(); } else if (property.equals("IsMonstrous")) { - if (!card.isMonstrous()) { - return false; - } + return card.isMonstrous(); } else if (property.equals("IsNotMonstrous")) { - if (card.isMonstrous()) { - return false; - } + return !card.isMonstrous(); } else if (property.equals("IsUnearthed")) { - if (!card.isUnearthed()) { - return false; - } + return card.isUnearthed(); } else if (property.equals("IsRenowned")) { - if (!card.isRenowned()) { - return false; - } + return card.isRenowned(); } else if (property.equals("IsNotRenowned")) { - if (card.isRenowned()) { - return false; - } + return !card.isRenowned(); } else if (property.startsWith("RememberMap")) { System.out.println(source.getRememberMap()); for (SpellAbility sa : source.getSpellAbilities()) { @@ -1682,93 +1357,59 @@ public class CardProperty { } return false; } else if (property.equals("IsRemembered")) { - if (!source.isRemembered(card)) { - return false; - } + return source.isRemembered(card); } else if (property.equals("IsNotRemembered")) { - if (source.isRemembered(card)) { - return false; - } + return !source.isRemembered(card); } else if (property.equals("IsImprinted")) { - if (!source.hasImprintedCard(card)) { - return false; - } + return source.hasImprintedCard(card); } else if (property.equals("IsNotImprinted")) { - if (source.hasImprintedCard(card)) { - return false; - } + return !source.hasImprintedCard(card); } else if (property.equals("NoAbilities")) { - if (!((card.getAbilityText().trim().equals("") || card.isFaceDown()) && (card.getUnhiddenKeywords().isEmpty()))) { - return false; - } + return (card.getAbilityText().trim().equals("") || card.isFaceDown()) && (card.getUnhiddenKeywords().isEmpty()); } else if (property.equals("HasCounters")) { - if (!card.hasCounters()) { - return false; - } + return card.hasCounters(); } else if (property.equals("NoCounters")) { - if (card.hasCounters()) { - return false; - } + return !card.hasCounters(); } else if (property.startsWith("CastSa")) { SpellAbility castSA = card.getCastSA(); if (castSA == null) { return false; } String v = property.substring(7); - if (!castSA.isValid(v, sourceController, source, spellAbility)) { - return false; - } + return castSA.isValid(v, sourceController, source, spellAbility); } else if (property.equals("wasCast")) { - if (null == card.getCastFrom()) { - return false; - } + return null != card.getCastFrom(); } else if (property.equals("wasNotCast")) { - if (null != card.getCastFrom()) { - return false; - } + return null == card.getCastFrom(); } else if (property.startsWith("wasCastFrom")) { // How are we getting in here with a comma? final String strZone = property.split(",")[0].substring(11); final ZoneType realZone = ZoneType.smartValueOf(strZone); - if (realZone != card.getCastFrom()) { - return false; - } + return realZone == card.getCastFrom(); } else if (property.startsWith("wasNotCastFrom")) { final String strZone = property.substring(14); final ZoneType realZone = ZoneType.smartValueOf(strZone); - if (realZone == card.getCastFrom()) { - return false; - } + return realZone != card.getCastFrom(); } else if (property.startsWith("set")) { final String setCode = property.substring(3, 6); - if (!card.getSetCode().equals(setCode)) { - return false; - } + return card.getSetCode().equals(setCode); } else if (property.startsWith("inZone")) { final String strZone = property.substring(6); final ZoneType realZone = ZoneType.smartValueOf(strZone); // lki last zone does fall back to this zone final Zone lkiZone = lki.getLastKnownZone(); - - if (lkiZone == null || !lkiZone.is(realZone)) { - return false; - } + + return lkiZone != null && lkiZone.is(realZone); } else if (property.startsWith("inRealZone")) { final String strZone = property.substring(10); final ZoneType realZone = ZoneType.smartValueOf(strZone); - if (!card.isInZone(realZone)) { - return false; - } + return card.isInZone(realZone); } else if (property.equals("IsCommander")) { - if (!card.isCommander()) { - return false; - } + return card.isCommander(); } else { // StringType done in CardState - if (!card.getCurrentState().hasProperty(property, sourceController, source, spellAbility)) { - return false; - } + return card.getCurrentState().hasProperty(property, sourceController, source, spellAbility); } return true; } diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index dbe4ca1546b..b2b4d60e72a 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -471,9 +471,7 @@ public class CardState extends GameObject { view.updateFoilIndex(card.getState(CardStateName.Original)); } public final void removeSVar(final String var) { - if (sVars.containsKey(var)) { - sVars.remove(var); - } + sVars.remove(var); } public final int getFoil() { diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 014515eb063..8d0c2000fff 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -80,7 +80,7 @@ public final class CardUtil { } public static boolean isStackingKeyword(final String keyword) { - String kw = new String(keyword); + String kw = keyword; if (kw.startsWith("HIDDEN")) { kw = kw.substring(7); } @@ -345,7 +345,7 @@ public final class CardUtil { // a nice entry point with minimum parameters public static Set getReflectableManaColors(final SpellAbility sa) { - return getReflectableManaColors(sa, sa, Sets.newHashSet(), new CardCollection()); + return getReflectableManaColors(sa, sa, Sets.newHashSet(), new CardCollection()); } private static Set getReflectableManaColors(final SpellAbility abMana, final SpellAbility sa, @@ -390,9 +390,7 @@ public final class CardUtil { // remove anything cards that is already in parents for (final Card p : parents) { - if (cards.contains(p)) { - cards.remove(p); - } + cards.remove(p); } if ((cards.size() == 0) && !reflectProperty.equals("Produced")) { @@ -506,9 +504,7 @@ public final class CardUtil { // Remove cards already targeted final List targeted = Lists.newArrayList(ability.getTargets().getTargetCards()); for (final Card c : targeted) { - if (choices.contains(c)) { - choices.remove(c); - } + choices.remove(c); } // Remove cards exceeding total CMC diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 5afd53b06ca..8762d2816d2 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -345,10 +345,7 @@ public class CardView extends GameEntityView { return true; } col = get(TrackableProperty.PlayerMayLookTemp); - if (col != null && col.contains(pv)) { - return true; - } - return false; + return col != null && col.contains(pv); } void setPlayerMayLook(Player p, boolean mayLook, boolean temp) { TrackableProperty prop = temp ? TrackableProperty.PlayerMayLookTemp : TrackableProperty.PlayerMayLook; @@ -380,7 +377,7 @@ public class CardView extends GameEntityView { return Iterables.any(viewers, new Predicate() { public final boolean apply(final PlayerView input) { return canBeShownTo(input); - }; + } }); } @@ -462,10 +459,7 @@ public class CardView extends GameEntityView { if (mindSlaveMaster != null && canFaceDownBeShownTo(mindSlaveMaster)) { return true; } - if (isInZone(EnumSet.of(ZoneType.Battlefield, ZoneType.Stack, ZoneType.Sideboard)) && getController().equals(viewer)) { - return true; - } - return false; + return isInZone(EnumSet.of(ZoneType.Battlefield, ZoneType.Stack, ZoneType.Sideboard)) && getController().equals(viewer); } public FCollectionView getEncodedCards() { @@ -1067,7 +1061,7 @@ public class CardView extends GameEntityView { TrackableCollection views = get(key); if (views == null) { views = new TrackableCollection(); - views.add(cardToAdd.getView());; + views.add(cardToAdd.getView()); set(key, views); } else if (views.add(cardToAdd.getView())) { diff --git a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java index 5d4ff3b79aa..4abd4a7447e 100644 --- a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java +++ b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java @@ -320,7 +320,7 @@ public class TokenInfo { if (!CardUtil.isKeywordModifiable(o)) { continue; } - String r = new String(o); + String r = o; // replace types for (final Map.Entry e : typeMap.entrySet()) { final String key = e.getKey(); diff --git a/forge-game/src/main/java/forge/game/combat/AttackConstraints.java b/forge-game/src/main/java/forge/game/combat/AttackConstraints.java index c3420217e83..f7b59f9413f 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackConstraints.java +++ b/forge-game/src/main/java/forge/game/combat/AttackConstraints.java @@ -94,7 +94,7 @@ public class AttackConstraints { final int globalMax = globalRestrictions.getMax(); final int myMax = Ints.min(globalMax == -1 ? Integer.MAX_VALUE : globalMax, possibleAttackers.size()); if (myMax == 0) { - return Pair.of(Collections.emptyMap(), Integer.valueOf(0)); + return Pair.of(Collections.emptyMap(), Integer.valueOf(0)); } final MapToAmount> possible = new LinkedHashMapToAmount>(); @@ -163,8 +163,8 @@ public class AttackConstraints { // Now try all others (plus empty attack) and count their violations final FCollection> legalAttackers = collectLegalAttackers(reqs, myMax); possible.putAll(Maps.asMap(legalAttackers.asSet(), FN_COUNT_VIOLATIONS)); - if (countViolations(Collections.emptyMap()) != -1) { - possible.put(Collections.emptyMap(), countViolations(Collections.emptyMap())); + if (countViolations(Collections.emptyMap()) != -1) { + possible.put(Collections.emptyMap(), countViolations(Collections.emptyMap())); } // take the case with the fewest violations @@ -173,7 +173,7 @@ public class AttackConstraints { private final FCollection> collectLegalAttackers(final List reqs, final int maximum) { return new FCollection> - (collectLegalAttackers(Collections.emptyMap(), deepClone(reqs), new CardCollection(), maximum)); + (collectLegalAttackers(Collections.emptyMap(), deepClone(reqs), new CardCollection(), maximum)); } private final List> collectLegalAttackers(final Map attackers, final List reqs, final CardCollection reserved, final int maximum) { diff --git a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java index c02701595d3..8c40d44d7e6 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java +++ b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java @@ -80,7 +80,7 @@ public class AttackRequirement { for (Card pw : CardLists.filter(c.getController().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.PLANESWALKERS)) { // Add the attack alternatives that suffice (planeswalkers that can be attacked instead of the player) if (!defenderSpecificAlternatives.containsKey(c.getController())) { - defenderSpecificAlternatives.put(c.getController(), Lists.newArrayList()); + defenderSpecificAlternatives.put(c.getController(), Lists.newArrayList()); } defenderSpecificAlternatives.get(c.getController()).add(pw); } @@ -147,7 +147,7 @@ public class AttackRequirement { int violations = 0; // first. check to see if "must attack X or Y with at least one creature" requirements are satisfied - List toRemoveFromDefSpecific = Lists.newArrayList(); + List toRemoveFromDefSpecific = Lists.newArrayList(); if (!defenderOrPWSpecific.isEmpty()) { for (GameEntity def : defenderOrPWSpecific.keySet()) { if (defenderSpecificAlternatives.containsKey(def)) { diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index bc5441689ea..4299ce1eede 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -54,8 +54,8 @@ public class Combat { private final FCollection attackableEntries = new FCollection(); // Keyed by attackable defender (player or planeswalker) - private final Multimap attackedByBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); - private final Multimap blockedBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); + private final Multimap attackedByBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); + private final Multimap blockedBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); private final Map defendingDamageMap = Maps.newHashMap(); @@ -353,7 +353,7 @@ public class Combat { public final boolean isBlocked(final Card attacker) { AttackingBand band = getBandOfAttacker(attacker); - return band == null ? false : Boolean.TRUE.equals(band.isBlocked()); + return band != null && Boolean.TRUE.equals(band.isBlocked()); } // Some cards in Alpha may UNBLOCK an attacker, so second parameter is not always-true @@ -804,7 +804,7 @@ public class Combat { for (final Entry entry : defendingDamageMap.entrySet()) { GameEntity defender = getDefenderByAttacker(entry.getKey()); if (defender instanceof Player) { // player - ((Player) defender).addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); + defender.addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); } else if (defender instanceof Card) { // planeswalker ((Card) defender).getController().addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); @@ -843,7 +843,7 @@ public class Combat { public final boolean isUnblocked(final Card att) { AttackingBand band = getBandOfAttacker(att); - return band == null ? false : Boolean.FALSE.equals(band.isBlocked()); + return band != null && Boolean.FALSE.equals(band.isBlocked()); } public final CardCollection getUnblockedAttackers() { @@ -875,7 +875,7 @@ public class Combat { public boolean isBlocking(Card blocker) { if (blockedBands.containsValue(blocker)) { return true; // is blocking something at the moment - }; + } CombatLki lki = lkiCache.get(blocker); return null != lki && !lki.isAttacker; // was blocking something anyway diff --git a/forge-game/src/main/java/forge/game/combat/CombatLki.java b/forge-game/src/main/java/forge/game/combat/CombatLki.java index 128718a3d25..682265f0a18 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatLki.java +++ b/forge-game/src/main/java/forge/game/combat/CombatLki.java @@ -14,7 +14,7 @@ public class CombatLki { public CombatLki(boolean isAttacker, FCollectionView relatedBands) { this.isAttacker = isAttacker; - this.relatedBands = new FCollection(relatedBands);; + this.relatedBands = new FCollection(relatedBands); } public AttackingBand getFirstBand() { diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 1b88c16440f..0273d3a03cb 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -426,11 +426,7 @@ public class CombatUtil { } final List list = blocker.getController().getCreaturesInPlay(); - if (list.size() < 2 && blocker.hasKeyword("CARDNAME can't attack or block alone.")) { - return false; - } - - return true; + return list.size() >= 2 || !blocker.hasKeyword("CARDNAME can't attack or block alone."); } public static boolean canBlockMoreCreatures(final Card blocker, final CardCollectionView blockedBy) { @@ -500,8 +496,7 @@ public class CombatUtil { // Landwalk if (isUnblockableFromLandwalk(attacker, defender)) { - if (CardLists.getAmountOfKeyword(defender.getCreaturesInPlay(), "CARDNAME can block creatures with landwalk abilities as though they didn't have those abilities.") == 0) - return false; + return CardLists.getAmountOfKeyword(defender.getCreaturesInPlay(), "CARDNAME can block creatures with landwalk abilities as though they didn't have those abilities.") != 0; } return true; @@ -518,7 +513,7 @@ public class CombatUtil { IGNORE_LANDWALK_KEYWORDS = new String[size]; for (int i = 0; i < size; i++) { final String basic = MagicColor.Constant.BASIC_LANDS.get(i); - final String landwalk = basic + "walk";; + final String landwalk = basic + "walk"; LANDWALK_KEYWORDS[i] = landwalk; SNOW_LANDWALK_KEYWORDS[i] = "Snow " + landwalk.toLowerCase(); IGNORE_LANDWALK_KEYWORDS[i] = "May be blocked as though it doesn't have " + landwalk + "."; @@ -1053,7 +1048,7 @@ public class CombatUtil { for (KeywordInterface inst : blocker.getKeywords()) { String k = inst.getOriginal(); if (k.startsWith("IfReach")) { - String n[] = k.split(":"); + String[] n = k.split(":"); if (attacker.getType().hasCreatureType(n[1])) { stillblock = true; break; @@ -1074,11 +1069,7 @@ public class CombatUtil { return false; } - if (attacker.hasKeyword(Keyword.INTIMIDATE) && !blocker.isArtifact() && !blocker.sharesColorWith(attacker)) { - return false; - } - - return true; + return !attacker.hasKeyword(Keyword.INTIMIDATE) || blocker.isArtifact() || blocker.sharesColorWith(attacker); } // canBlock() public static boolean canAttackerBeBlockedWithAmount(Card attacker, int amount, Combat combat) { @@ -1114,9 +1105,7 @@ public class CombatUtil { System.out.println("Warning: it was impossible to deduce the defending player in CombatUtil#canAttackerBeBlockedWithAmount, returning 'true' (safest default)."); return true; } - if (amount < defender.getCreaturesInPlay().size()) { - return false; - } + return amount >= defender.getCreaturesInPlay().size(); } return true; diff --git a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java index cde3c921347..9c5f3b810bf 100644 --- a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java +++ b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java @@ -45,7 +45,7 @@ public class GlobalAttackRestrictions { private GlobalAttackRestrictionViolations getViolations(final Map attackers, final CardCollection possibleAttackers, final boolean returnQuickly) { final int nTooMany = max < 0 ? 0 : attackers.size() - max; if (returnQuickly && nTooMany > 0) { - return new GlobalAttackRestrictionViolations(nTooMany, MapToAmountUtil.emptyMap(), MapToAmountUtil.emptyMap()); + return new GlobalAttackRestrictionViolations(nTooMany, MapToAmountUtil.emptyMap(), MapToAmountUtil.emptyMap()); } final MapToAmount defenderTooMany = new LinkedHashMapToAmount(defenderMax.size()); diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 5f40f259d76..75d87c49e64 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -13,7 +13,6 @@ import forge.game.keyword.KeywordInterface; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.spellability.AbilityActivated; -import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetChoices; import forge.game.staticability.StaticAbility; @@ -40,7 +39,7 @@ public class CostAdjustment { Cost result = cost.copy(); boolean isStateChangeToFaceDown = false; - if (sa.isSpell() && ((Spell) sa).isCastFaceDown()) { + if (sa.isSpell() && sa.isCastFaceDown()) { // Turn face down to apply cost modifiers correctly host.turnFaceDownNoUpdate(); isStateChangeToFaceDown = true; @@ -159,7 +158,7 @@ public class CostAdjustment { boolean isStateChangeToFaceDown = false; if (sa.isSpell()) { - if (((Spell) sa).isCastFaceDown()) { + if (sa.isCastFaceDown()) { // Turn face down to apply cost modifiers correctly originalCard.turnFaceDownNoUpdate(); isStateChangeToFaceDown = true; @@ -490,7 +489,7 @@ public class CostAdjustment { return false; } } else if (type.equals("MorphDown")) { - if (!sa.isSpell() || !((Spell) sa).isCastFaceDown()) { + if (!sa.isSpell() || !sa.isCastFaceDown()) { return false; } } @@ -546,9 +545,7 @@ public class CostAdjustment { } curSa = curSa.getSubAbility(); } - if (!targetValid) { - return false; - } + return targetValid; } return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostDiscard.java b/forge-game/src/main/java/forge/game/cost/CostDiscard.java index d788b0287f4..b8073001756 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDiscard.java +++ b/forge-game/src/main/java/forge/game/cost/CostDiscard.java @@ -112,15 +112,11 @@ public class CostDiscard extends CostPartWithList { final Integer amount = this.convertAmount(); if (this.payCostFromSource()) { - if (!source.canBeDiscardedBy(ability)) { - return false; - } + return source.canBeDiscardedBy(ability); } else { if (type.equals("Hand")) { - if (!payer.canDiscardBy(ability)) { - return false; - } + return payer.canDiscardBy(ability); // this will always work } else if (type.equals("LastDrawn")) { @@ -153,14 +149,11 @@ public class CostDiscard extends CostPartWithList { } } - if ((amount != null) && (amount > handList.size() - adjustment)) { - // not enough cards in hand to pay - return false; - } + // not enough cards in hand to pay + return (amount == null) || (amount <= handList.size() - adjustment); } } - return true; } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostExert.java b/forge-game/src/main/java/forge/game/cost/CostExert.java index 60160d0d5f3..c9dc957a715 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExert.java +++ b/forge-game/src/main/java/forge/game/cost/CostExert.java @@ -93,9 +93,7 @@ public class CostExert extends CostPartWithList { final Integer amount = this.convertAmount(); - if (!needsAnnoucement && (amount != null) && (typeList.size() < amount)) { - return false; - } + return needsAnnoucement || (amount == null) || (typeList.size() >= amount); } diff --git a/forge-game/src/main/java/forge/game/cost/CostExile.java b/forge-game/src/main/java/forge/game/cost/CostExile.java index 4e4f3dc8003..61a189b8731 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExile.java +++ b/forge-game/src/main/java/forge/game/cost/CostExile.java @@ -146,9 +146,7 @@ public class CostExile extends CostPartWithList { break; } } - if (!foundPayable) { - return false; - } + return foundPayable; } return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java b/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java index cf66f777abd..d04501e37f3 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java +++ b/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java @@ -94,11 +94,7 @@ public class CostExileFromStack extends CostPart { list = CardLists.getValidCards(list, type.split(";"), payer, source, ability); final Integer amount = this.convertAmount(); - if ((amount != null) && (list.size() < amount)) { - return false; - } - - return true; + return (amount == null) || (list.size() >= amount); } diff --git a/forge-game/src/main/java/forge/game/cost/CostGainControl.java b/forge-game/src/main/java/forge/game/cost/CostGainControl.java index b77f91075ac..28940a73060 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainControl.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainControl.java @@ -83,10 +83,7 @@ public class CostGainControl extends CostPartWithList { if (amount == null) { amount = AbilityUtils.calculateAmount(source, this.getAmount(), ability); } - if (typeList.size() < amount) { - return false; - } - return true; + return typeList.size() >= amount; } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java index 495457493be..b934d3d0be7 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java +++ b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java @@ -144,7 +144,7 @@ public abstract class CostPartWithList extends CostPart { protected abstract Card doPayment(SpellAbility ability, Card targetCard); // Overload these two only together, set to true and perform payment on list protected boolean canPayListAtOnce() { return false; } - protected CardCollectionView doListPayment(SpellAbility ability, CardCollectionView targetCards) { return CardCollection.EMPTY; }; + protected CardCollectionView doListPayment(SpellAbility ability, CardCollectionView targetCards) { return CardCollection.EMPTY; } /** * TODO: Write javadoc for this method. diff --git a/forge-game/src/main/java/forge/game/cost/CostPayLife.java b/forge-game/src/main/java/forge/game/cost/CostPayLife.java index c0394e31bc4..39f59048685 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayLife.java @@ -78,11 +78,7 @@ public class CostPayLife extends CostPart { return false; } - if (payer.hasKeyword("You can't pay life to cast spells or activate abilities.")) { - return false; - } - - return true; + return !payer.hasKeyword("You can't pay life to cast spells or activate abilities."); } @Override diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java b/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java index f70b1c8d188..5c55cea15e1 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java @@ -160,9 +160,7 @@ public class CostPutCardToLib extends CostPartWithList { break; } } - if (!foundPayable) { - return false; - } + return foundPayable; } return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java index 3738d839398..63c64457ea2 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java @@ -140,9 +140,7 @@ public class CostPutCounter extends CostPartWithList { public final boolean canPay(final SpellAbility ability, final Player payer) { final Card source = ability.getHostCard(); if (this.payCostFromSource()) { - if (!source.canReceiveCounters(this.counter)) { - return false; - } + return source.canReceiveCounters(this.counter); } else { // 3 Cards have Put a -1/-1 Counter on a Creature you control. List typeList = CardLists.getValidCards(source.getGame().getCardsIn(ZoneType.Battlefield), @@ -150,12 +148,9 @@ public class CostPutCounter extends CostPartWithList { typeList = CardLists.filter(typeList, CardPredicates.canReceiveCounters(this.counter)); - if (typeList.isEmpty()) { - return false; - } + return !typeList.isEmpty(); } - return true; } /* diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java index f74a892516d..7434d7add6f 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java @@ -133,9 +133,7 @@ public class CostRemoveCounter extends CostPartWithList { final Integer amount = this.convertAmount(); if (this.payCostFromSource()) { - if ((amount != null) && ((source.getCounters(cntrs) - amount) < 0)) { - return false; - } + return (amount == null) || ((source.getCounters(cntrs) - amount) >= 0); } else { List typeList; @@ -152,9 +150,7 @@ public class CostRemoveCounter extends CostPartWithList { for (Card c : typeList) { totalCounters += c.getCounters(cntrs); } - if (totalCounters >= amount) { - return true; - } + return totalCounters >= amount; } else { // (default logic) remove X counters from a single permanent diff --git a/forge-game/src/main/java/forge/game/cost/CostReturn.java b/forge-game/src/main/java/forge/game/cost/CostReturn.java index 11b9e8b236a..2a9d6603701 100644 --- a/forge-game/src/main/java/forge/game/cost/CostReturn.java +++ b/forge-game/src/main/java/forge/game/cost/CostReturn.java @@ -102,14 +102,9 @@ public class CostReturn extends CostPartWithList { typeList = CardLists.getValidCards(typeList, this.getType().split(";"), payer, source, ability); final Integer amount = this.convertAmount(); - if (!needsAnnoucement && amount != null && typeList.size() < amount) { - return false; - } - } else if (!source.isInPlay()) { - return false; - } + return needsAnnoucement || amount == null || typeList.size() >= amount; + } else return source.isInPlay(); - return true; } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostReveal.java b/forge-game/src/main/java/forge/game/cost/CostReveal.java index 0252203d1e6..b7d08ff1807 100644 --- a/forge-game/src/main/java/forge/game/cost/CostReveal.java +++ b/forge-game/src/main/java/forge/game/cost/CostReveal.java @@ -57,9 +57,7 @@ public class CostReveal extends CostPartWithList { final Integer amount = this.convertAmount(); if (this.payCostFromSource()) { - if (!source.isInZone(ZoneType.Hand)) { - return false; - } + return source.isInZone(ZoneType.Hand); } else if (this.getType().equals("Hand")) { return true; } else if (this.getType().equals("SameColor")) { @@ -85,14 +83,11 @@ public class CostReveal extends CostPartWithList { handList = modifiedHand; } handList = CardLists.getValidCards(handList, type.split(";"), payer, source, ability); - if ((amount != null) && (amount > handList.size())) { - // not enough cards in hand to pay - return false; - } + // not enough cards in hand to pay + return (amount == null) || (amount <= handList.size()); //System.out.println("revealcost - " + amount + type + handList); } - return true; } @Override diff --git a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java index 46f121a07a2..0ac0cb3248a 100644 --- a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java +++ b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java @@ -103,19 +103,14 @@ public class CostSacrifice extends CostPartWithList { typeList = CardLists.filter(typeList, CardPredicates.canBeSacrificedBy(ability)); - if (!needsAnnoucement && (amount != null) && (typeList.size() < amount)) { - return false; - } + return needsAnnoucement || (amount == null) || (typeList.size() >= amount); // If amount is null, it's either "ALL" or "X" // if X is defined, it needs to be calculated and checked, if X is // choice, it can be Paid even if it's 0 } - else if (!source.canBeSacrificedBy(ability)) { - return false; - } + else return source.canBeSacrificedBy(ability); - return true; } @Override diff --git a/forge-game/src/main/java/forge/game/cost/CostTapType.java b/forge-game/src/main/java/forge/game/cost/CostTapType.java index e0e9b345f4e..4a400a3a4dc 100644 --- a/forge-game/src/main/java/forge/game/cost/CostTapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostTapType.java @@ -150,11 +150,7 @@ public class CostTapType extends CostPartWithList { } final Integer amount = this.convertAmount(); - if ((typeList.size() == 0) || ((amount != null) && (typeList.size() < amount))) { - return false; - } - - return true; + return (typeList.size() != 0) && ((amount == null) || (typeList.size() >= amount)); } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostUnattach.java b/forge-game/src/main/java/forge/game/cost/CostUnattach.java index fb33a53ebf3..d4ab4bd8b76 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-game/src/main/java/forge/game/cost/CostUnattach.java @@ -74,21 +74,14 @@ public class CostUnattach extends CostPartWithList { final String type = this.getType(); if (type.equals("CARDNAME")) { - if (source.isEquipping()) { - return true; - } + return source.isEquipping(); } else if (type.equals("OriginalHost")) { Card originalEquipment = ability.getOriginalHost(); - if (originalEquipment.isEquipping()) { - return true; - } + return originalEquipment.isEquipping(); } else { - if (CardLists.getValidCards(source.getEquippedBy(), type, payer, source).size() > 0) { - return true; - } + return CardLists.getValidCards(source.getEquippedBy(), type, payer, source).size() > 0; } - return false; } public Card findCardToUnattach(final Card source, Player activator, SpellAbility ability) { diff --git a/forge-game/src/main/java/forge/game/cost/CostUntapType.java b/forge-game/src/main/java/forge/game/cost/CostUntapType.java index 7db801bc88f..b52634e00f8 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUntapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostUntapType.java @@ -89,10 +89,7 @@ public class CostUntapType extends CostPartWithList { typeList = CardLists.filter(typeList, Presets.TAPPED); final Integer amount = convertAmount(); - if ((typeList.size() == 0) || ((amount != null) && (typeList.size() < amount))) { - return false; - } - return true; + return (typeList.size() != 0) && ((amount == null) || (typeList.size() >= amount)); } @Override diff --git a/forge-game/src/main/java/forge/game/cost/ICostVisitor.java b/forge-game/src/main/java/forge/game/cost/ICostVisitor.java index 5112124012e..9ca192502b3 100644 --- a/forge-game/src/main/java/forge/game/cost/ICostVisitor.java +++ b/forge-game/src/main/java/forge/game/cost/ICostVisitor.java @@ -2,36 +2,36 @@ package forge.game.cost; public interface ICostVisitor { - public T visit(CostGainControl cost); - public T visit(CostChooseCreatureType cost); - public T visit(CostDiscard cost); - public T visit(CostDamage cost); - public T visit(CostDraw cost); - public T visit(CostExile cost); - public T visit(CostExileFromStack cost); - public T visit(CostExiledMoveToGrave cost); - public T visit(CostExert cost); - public T visit(CostFlipCoin cost); - public T visit(CostMill cost); - public T visit(CostAddMana cost); - public T visit(CostPayLife cost); - public T visit(CostPayEnergy cost); - public T visit(CostGainLife cost); - public T visit(CostPartMana cost); - public T visit(CostPutCardToLib cost); - public T visit(CostTap cost); - public T visit(CostSacrifice cost); - public T visit(CostReturn cost); - public T visit(CostReveal cost); - public T visit(CostRemoveAnyCounter cost); - public T visit(CostRemoveCounter cost); - public T visit(CostPutCounter cost); - public T visit(CostUntapType cost); - public T visit(CostUntap cost); - public T visit(CostUnattach cost); - public T visit(CostTapType cost); + T visit(CostGainControl cost); + T visit(CostChooseCreatureType cost); + T visit(CostDiscard cost); + T visit(CostDamage cost); + T visit(CostDraw cost); + T visit(CostExile cost); + T visit(CostExileFromStack cost); + T visit(CostExiledMoveToGrave cost); + T visit(CostExert cost); + T visit(CostFlipCoin cost); + T visit(CostMill cost); + T visit(CostAddMana cost); + T visit(CostPayLife cost); + T visit(CostPayEnergy cost); + T visit(CostGainLife cost); + T visit(CostPartMana cost); + T visit(CostPutCardToLib cost); + T visit(CostTap cost); + T visit(CostSacrifice cost); + T visit(CostReturn cost); + T visit(CostReveal cost); + T visit(CostRemoveAnyCounter cost); + T visit(CostRemoveCounter cost); + T visit(CostPutCounter cost); + T visit(CostUntapType cost); + T visit(CostUntap cost); + T visit(CostUnattach cost); + T visit(CostTapType cost); - public static class Base implements ICostVisitor { + class Base implements ICostVisitor { @Override public T visit(CostGainControl cost) { diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java b/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java index e809ad41743..149cf8e3ea9 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java @@ -8,7 +8,7 @@ public class GameEventCardDamaged extends GameEvent { Normal, M1M1Counters, Deathtouch, - LoyaltyLoss; + LoyaltyLoss } public final Card card; diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java b/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java index 1eb9149788f..e1bb2138ffe 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java @@ -43,7 +43,7 @@ public class GameEventCardStatsChanged extends GameEvent { return "Card state changes: " + card.getName() + " (" + StringUtils.join(card.getType(), ' ') + ") " + card.getNetPower() + "/" + card.getNetToughness() + - " and " + String.valueOf(cards.size() - 1) + " more"; + " and " + (cards.size() - 1) + " more"; } } diff --git a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java index 7e038506226..8dd56af94d4 100644 --- a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java +++ b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java @@ -51,7 +51,7 @@ public interface IGameEventVisitor { // This is base class for all visitors. - public static class Base implements IGameEventVisitor{ + class Base implements IGameEventVisitor{ public T visit(GameEventAnteCardsSelected event) { return null; } public T visit(GameEventAttackersDeclared event) { return null; } public T visit(GameEventBlockersDeclared event) { return null; } diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index ead951daf98..101dc0a4a90 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -164,7 +164,7 @@ public enum Keyword { protected final boolean isMultipleRedundant; protected final String reminderText, displayName; - private Keyword(Class> type0, boolean isMultipleRedundant0, String reminderText0) { + Keyword(Class> type0, boolean isMultipleRedundant0, String reminderText0) { type = type0; isMultipleRedundant = isMultipleRedundant0; reminderText = reminderText0; @@ -176,7 +176,7 @@ public enum Keyword { String details = k; // try to get real part if (k.contains(":")) { - final String x[] = k.split(":", 2); + final String[] x = k.split(":", 2); keyword = smartValueOf(x[0]); details = x[1]; } else if (k.contains(" ")) { @@ -186,7 +186,7 @@ public enum Keyword { // other keywords that contains other stuff like Enchant if (keyword == Keyword.UNDEFINED) { - final String x[] = k.split(" ", 2); + final String[] x = k.split(" ", 2); final Keyword k2 = smartValueOf(x[0]); // Keywords that needs to be undefined diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java index 33bfe77dd56..50b99b5e66a 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java @@ -24,10 +24,10 @@ public abstract class KeywordInstance> implements K private boolean hidden; - private List triggers = Lists.newArrayList(); - private List replacements = Lists.newArrayList(); - private List abilities = Lists.newArrayList(); - private List staticAbilities = Lists.newArrayList(); + private List triggers = Lists.newArrayList(); + private List replacements = Lists.newArrayList(); + private List abilities = Lists.newArrayList(); + private List staticAbilities = Lists.newArrayList(); /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java index 83ad9b87aa8..d8b5f152605 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java @@ -21,36 +21,36 @@ public interface KeywordInterface extends Cloneable { boolean getHidden(); void setHidden(boolean val); - public void createTraits(final Card host, final boolean intrinsic); + void createTraits(final Card host, final boolean intrinsic); void createTraits(final Card host, final boolean intrinsic, final boolean clear); - public void addTrigger(final Trigger trg); + void addTrigger(final Trigger trg); - public void addReplacement(final ReplacementEffect trg); + void addReplacement(final ReplacementEffect trg); - public void addSpellAbility(final SpellAbility s); - public void addStaticAbility(final StaticAbility st); + void addSpellAbility(final SpellAbility s); + void addStaticAbility(final StaticAbility st); - public void setHostCard(final Card host); + void setHostCard(final Card host); /** * @return the triggers */ - public Collection getTriggers(); + Collection getTriggers(); /** * @return the replacements */ - public Collection getReplacements(); + Collection getReplacements(); /** * @return the abilities */ - public Collection getAbilities(); + Collection getAbilities(); /** * @return the staticAbilities */ - public Collection getStaticAbilities(); + Collection getStaticAbilities(); - public KeywordInterface copy(final Card host, final boolean lki); + KeywordInterface copy(final Card host, final boolean lki); - public boolean redundant(final Collection list); + boolean redundant(final Collection list); } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java index b1e988e5bdb..167cc20dce5 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java @@ -18,7 +18,7 @@ public class KeywordWithCostAndType extends KeywordInstance 2) { strType = k[2]; } else { - String n[] = type.split(","); + String[] n = type.split(","); for (int i = 0; i < n.length; i++) { if (CardType.isACardType(n[i])) { n[i] = n[i].toLowerCase(); diff --git a/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java b/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java index 2159f8ea430..50b5d8b2006 100644 --- a/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java +++ b/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java @@ -10,7 +10,7 @@ public class Ninjutsu extends KeywordWithCost { @Override protected void parse(String details) { if (details.contains(":")) { - String k[] = details.split(":"); + String[] k = details.split(":"); details = k[0]; if (k[1].equals("Commander")) { commander = true; diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index de59a57ef21..bf68649ae12 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -95,10 +95,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } } - if (totalMana() == safeMana) { - return false; //won't lose floating mana if all mana is of colors that aren't going to be emptied - } - return true; + return totalMana() != safeMana; //won't lose floating mana if all mana is of colors that aren't going to be emptied } public final List clearPool(boolean isEndOfPhase) { @@ -370,7 +367,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } // TODO The following may not be needed anymore? - if (((color & (byte) ManaAtom.COLORLESS) != 0) && shard.canBePaidWithManaOfColor((byte) (byte)ManaAtom.COLORLESS)) { + if (((color & (byte) ManaAtom.COLORLESS) != 0) && shard.canBePaidWithManaOfColor((byte)ManaAtom.COLORLESS)) { return true; } diff --git a/forge-game/src/main/java/forge/game/mulligan/MulliganService.java b/forge-game/src/main/java/forge/game/mulligan/MulliganService.java index 2fed6777cc5..0d787327ff1 100644 --- a/forge-game/src/main/java/forge/game/mulligan/MulliganService.java +++ b/forge-game/src/main/java/forge/game/mulligan/MulliganService.java @@ -68,7 +68,7 @@ public class MulliganService { continue; } Player p = mulligan.getPlayer(); - boolean keep = mulligan.canMulligan() ? p.getController().mulliganKeepHand(firstPlayer, mulligan.tuckCardsAfterKeepHand()) : true; + boolean keep = !mulligan.canMulligan() || p.getController().mulliganKeepHand(firstPlayer, mulligan.tuckCardsAfterKeepHand()); if (game.isGameOver()) { // conceded on mulligan prompt return; diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index fd75bb5e2b8..00ca310ff9e 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -663,7 +663,7 @@ public class PhaseHandler implements java.io.Serializable { // map: defender => (many) attacker => (many) blocker Map> blockers = Maps.newHashMap(); for (GameEntity ge : combat.getDefendersControlledBy(p)) { - MapOfLists protectThisDefender = new HashMapOfLists(CollectionSuppliers.arrayLists()); + MapOfLists protectThisDefender = new HashMapOfLists(CollectionSuppliers.arrayLists()); for (Card att : combat.getAttackersOf(ge)) { protectThisDefender.addAll(att, combat.getBlockers(att)); } diff --git a/forge-game/src/main/java/forge/game/phase/PhaseType.java b/forge-game/src/main/java/forge/game/phase/PhaseType.java index 8022b483c39..eda13a747f7 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseType.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseType.java @@ -36,10 +36,10 @@ public enum PhaseType { public final String nameForUi; public final String nameForScripts; - private PhaseType(String name) { + PhaseType(String name) { this(name, name); } - private PhaseType(String name, String name_for_scripts) { + PhaseType(String name, String name_for_scripts) { nameForUi = name; nameForScripts = name_for_scripts; } diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index 7835a67cdaf..688a295ce79 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -35,7 +35,6 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -93,11 +92,8 @@ public class Untap extends Phase { } //exerted need current player turn final Player playerTurn = c.getGame().getPhaseHandler().getPlayerTurn(); - - if (c.isExertedBy(playerTurn)) { - return false; - } - return true; + + return !c.isExertedBy(playerTurn); } public static final Predicate CANUNTAP = new Predicate() { @@ -125,7 +121,7 @@ public class Untap extends Phase { for (final Card c : bounceList) { game.getAction().moveToHand(c, null); } - list.removeAll((Collection)bounceList); + list.removeAll(bounceList); final Map restrictUntap = Maps.newHashMap(); boolean hasChosen = false; @@ -154,10 +150,7 @@ public class Untap extends Phase { if (!Untap.canUntap(c)) { return false; } - if (c.isValid(restrict, player, null, null)) { - return false; - } - return true; + return !c.isValid(restrict, player, null, null); } }); @@ -187,7 +180,7 @@ public class Untap extends Phase { Map remaining = Maps.newHashMap(restrictUntap); for (Entry entry : remaining.entrySet()) { if (entry.getValue() == 0) { - cardList.removeAll((Collection)CardLists.getValidCards(cardList, entry.getKey(), player, null)); + cardList.removeAll(CardLists.getValidCards(cardList, entry.getKey(), player, null)); restrictUntap.remove(entry.getKey()); } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 2607b412d75..9e42220c143 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -461,10 +461,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean canGainLife() { - if (hasKeyword("You can't gain life.") || hasKeyword("Your life total can't change.")) { - return false; - } - return true; + return !hasKeyword("You can't gain life.") && !hasKeyword("Your life total can't change."); } public final int loseLife(final int toLose) { @@ -513,20 +510,14 @@ public class Player extends GameEntity implements Comparable { } public final boolean canLoseLife() { - if (hasKeyword("Your life total can't change.")) { - return false; - } - return true; + return !hasKeyword("Your life total can't change."); } public final boolean canPayLife(final int lifePayment) { if (life < lifePayment) { return false; } - if ((lifePayment > 0) && hasKeyword("Your life total can't change.")) { - return false; - } - return true; + return (lifePayment <= 0) || !hasKeyword("Your life total can't change."); } public final boolean payLife(final int lifePayment, final Card source) { @@ -826,7 +817,7 @@ public class Player extends GameEntity implements Comparable { CardCollection newCardsInCommand = new CardCollection(getGame().getCardsIn(ZoneType.Command)); newCardsInCommand.removeAll(cardsInCommand); if (!newCardsInCommand.isEmpty()) { - newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + Integer.toString(dmgToBePrevented)); + newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + dmgToBePrevented); } } subtractPreventNextDamageWithEffect(shieldSource, restDamage); @@ -1067,7 +1058,7 @@ public class Player extends GameEntity implements Comparable { * @param keyword the keyword to add. */ public final void addKeyword(final String keyword) { - addChangedKeywords(ImmutableList.of(keyword), ImmutableList.of(), getGame().getNextTimestamp()); + addChangedKeywords(ImmutableList.of(keyword), ImmutableList.of(), getGame().getNextTimestamp()); } /** @@ -1185,7 +1176,7 @@ public class Player extends GameEntity implements Comparable { PlayerZone com = getZone(ZoneType.Command); for (DetachedCardEffect eff : staticAbilities.values()) { com.remove(eff); - eff.setStaticAbilities(Lists.newArrayList()); + eff.setStaticAbilities(Lists.newArrayList()); } this.updateZoneForView(com); } @@ -1201,7 +1192,7 @@ public class Player extends GameEntity implements Comparable { boolean cancelHexproof = false; for (String k : a.getKeywords()) { if (k.startsWith("IgnoreHexproof")) { - String m[] = k.split(":"); + String[] m = k.split(":"); if (isValid(m[1].split(","), a, sa.getHostCard(), sa)) { cancelHexproof = true; break; @@ -1218,10 +1209,7 @@ public class Player extends GameEntity implements Comparable { return false; } - if ((hasKeyword("You can't be the targets of spells or activated abilities") && (sa.isSpell() || (sa instanceof AbilityActivated)))) { - return false; - } - return true; + return (!hasKeyword("You can't be the targets of spells or activated abilities") || (!sa.isSpell() && (!(sa instanceof AbilityActivated)))); } @@ -1783,10 +1771,7 @@ public class Player extends GameEntity implements Comparable { adjMax += Integer.valueOf(k[1]); } } - if (landsPlayedThisTurn < adjMax) { - return true; - } - return false; + return landsPlayedThisTurn < adjMax; } public final ManaPool getManaPool() { @@ -2491,10 +2476,7 @@ public class Player extends GameEntity implements Comparable { "Skip all combat phases of this turn."); return true; } - if (hasKeyword("Skip all combat phases of this turn.")) { - return true; - } - return false; + return hasKeyword("Skip all combat phases of this turn."); } public boolean isSkippingMain() { @@ -2614,10 +2596,7 @@ public class Player extends GameEntity implements Comparable { removeKeyword("Skip your next draw step."); return true; } - if (hasKeyword("Skip your draw step.")) { - return true; - } - return false; + return hasKeyword("Skip your draw step."); } public CardCollectionView getInboundTokens() { @@ -2957,11 +2936,7 @@ public class Player extends GameEntity implements Comparable { return true; } - if (isOpponentOf(sa.getActivatingPlayer()) && hasKeyword("Spells and abilities your opponents control can't cause you to discard cards.")) { - return false; - } - - return true; + return !isOpponentOf(sa.getActivatingPlayer()) || !hasKeyword("Spells and abilities your opponents control can't cause you to discard cards."); } public boolean canSacrificeBy(SpellAbility sa) { @@ -2969,11 +2944,7 @@ public class Player extends GameEntity implements Comparable { return true; } - if (isOpponentOf(sa.getActivatingPlayer()) && hasKeyword("Spells and abilities your opponents control can't cause you to sacrifice permanents.")) { - return false; - } - - return true; + return !isOpponentOf(sa.getActivatingPlayer()) || !hasKeyword("Spells and abilities your opponents control can't cause you to sacrifice permanents."); } public boolean canSearchLibraryWith(SpellAbility sa, Player targetPlayer) { @@ -2983,11 +2954,8 @@ public class Player extends GameEntity implements Comparable { if (this.hasKeyword("CantSearchLibrary")) { return false; - } else if (targetPlayer != null && targetPlayer.equals(sa.getActivatingPlayer()) - && hasKeyword("Spells and abilities you control can't cause you to search your library.")) { - return false; - } + } else return targetPlayer == null || !targetPlayer.equals(sa.getActivatingPlayer()) + || !hasKeyword("Spells and abilities you control can't cause you to search your library."); - return true; } } diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 96f146e564f..ecea26174d9 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -43,7 +43,7 @@ import java.util.Map; */ public abstract class PlayerController { - public static enum ManaPaymentPurpose { + public enum ManaPaymentPurpose { DeclareAttacker, DeclareBlocker, Echo, @@ -51,7 +51,7 @@ public abstract class PlayerController { CumulativeUpkeep, } - public static enum BinaryChoiceType { + public enum BinaryChoiceType { HeadsOrTails, // coin TapOrUntap, PlayOrDraw, diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 08238470931..73aebdbd1c0 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -23,13 +23,9 @@ public class PlayerProperty { Game game = player.getGame(); if (property.equals("You")) { - if (!player.equals(sourceController)) { - return false; - } + return player.equals(sourceController); } else if (property.equals("Opponent")) { - if (player.equals(sourceController) || !player.isOpponentOf(sourceController)) { - return false; - } + return !player.equals(sourceController) && player.isOpponentOf(sourceController); } else if (property.startsWith("OpponentOf ")) { final String v = property.split(" ")[1]; final List players = AbilityUtils.getDefinedPlayers(source, v, spellAbility); @@ -39,42 +35,24 @@ public class PlayerProperty { } } } else if (property.equals("YourTeam")) { - if (!player.sameTeam(sourceController)) { - return false; - } + return player.sameTeam(sourceController); } else if (property.equals("Allies")) { - if (player.equals(sourceController) || player.isOpponentOf(sourceController)) { - return false; - } + return !player.equals(sourceController) && !player.isOpponentOf(sourceController); } else if (property.equals("Active")) { - if (!player.equals(game.getPhaseHandler().getPlayerTurn())) { - return false; - } + return player.equals(game.getPhaseHandler().getPlayerTurn()); } else if (property.equals("NonActive")) { - if (player.equals(game.getPhaseHandler().getPlayerTurn())) { - return false; - } + return !player.equals(game.getPhaseHandler().getPlayerTurn()); } else if (property.equals("OpponentToActive")) { final Player active = game.getPhaseHandler().getPlayerTurn(); - if (player.equals(active) || !player.isOpponentOf(active)) { - return false; - } + return !player.equals(active) && player.isOpponentOf(active); } else if (property.equals("Other")) { - if (player.equals(sourceController)) { - return false; - } + return !player.equals(sourceController); } else if (property.equals("OtherThanSourceOwner")) { - if (player.equals(source.getOwner())) { - return false; - } + return !player.equals(source.getOwner()); } else if (property.equals("isMonarch")) { - if (!player.equals(game.getMonarch())) { - return false; - } + return player.equals(game.getMonarch()); } else if (property.equals("hasBlessing")) { - if (!player.hasBlessing()) { - return false; - } + return player.hasBlessing(); } else if (property.startsWith("wasDealtCombatDamageThisCombatBy ")) { String v = property.split(" ")[1]; @@ -91,9 +69,7 @@ public class PlayerProperty { found++; } } - if (found < count) { - return false; - } + return found >= count; } else if (property.startsWith("wasDealtDamageThisGameBy ")) { String v = property.split(" ")[1]; @@ -110,9 +86,7 @@ public class PlayerProperty { found++; } } - if (found < count) { - return false; - } + return found >= count; } else if (property.startsWith("wasDealtDamageThisTurnBy ")) { String v = property.split(" ")[1]; int count = 1; @@ -129,9 +103,7 @@ public class PlayerProperty { found++; } } - if (found < count) { - return false; - } + return found >= count; } else if (property.startsWith("wasDealtCombatDamageThisTurnBy ")) { String v = property.split(" ")[1]; @@ -149,90 +121,54 @@ public class PlayerProperty { found++; } } - if (found < count) { - return false; - } + return found >= count; } else if (property.equals("attackedBySourceThisCombat")) { - if (game.getCombat() == null || !player.equals(game.getCombat().getDefenderPlayerByAttacker(source))) { - return false; - } + return game.getCombat() != null && player.equals(game.getCombat().getDefenderPlayerByAttacker(source)); } else if (property.equals("wasDealtDamageThisTurn")) { - if (player.getAssignedDamage() == 0) { - return false; - } + return player.getAssignedDamage() != 0; } else if (property.equals("wasDealtCombatDamageThisTurn")) { - if (player.getAssignedCombatDamage() == 0) { - return false; - } + return player.getAssignedCombatDamage() != 0; } else if (property.equals("LostLifeThisTurn")) { - if (player.getLifeLostThisTurn() <= 0) { - return false; - } + return player.getLifeLostThisTurn() > 0; } else if (property.equals("DeclaredAttackerThisTurn")) { - if (player.getAttackersDeclaredThisTurn() <= 0) { - return false; - } + return player.getAttackersDeclaredThisTurn() > 0; } else if (property.equals("TappedLandForManaThisTurn")) { - if (!player.hasTappedLandForManaThisTurn()) { - return false; - } + return player.hasTappedLandForManaThisTurn(); } else if (property.equals("NoCardsInHandAtBeginningOfTurn")) { - if (player.getNumCardsInHandStartedThisTurnWith() > 0) { - return false; - } + return player.getNumCardsInHandStartedThisTurnWith() <= 0; } else if (property.equals("CardsInHandAtBeginningOfTurn")) { - if (player.getNumCardsInHandStartedThisTurnWith() <= 0) { - return false; - } + return player.getNumCardsInHandStartedThisTurnWith() > 0; } else if (property.startsWith("WithCardsInHand")) { if (property.contains("AtLeast")) { int amount = Integer.parseInt(property.split("AtLeast")[1]); - if (player.getCardsIn(ZoneType.Hand).size() < amount) { - return false; - } + return player.getCardsIn(ZoneType.Hand).size() >= amount; } } else if (property.equals("IsRemembered")) { - if (!source.isRemembered(player)) { - return false; - } + return source.isRemembered(player); } else if (property.equals("IsNotRemembered")) { - if (source.isRemembered(player)) { - return false; - } + return !source.isRemembered(player); } else if (property.equals("EnchantedBy")) { - if (!player.isEnchantedBy(source)) { - return false; - } + return player.isEnchantedBy(source); } else if (property.equals("Chosen")) { - if (source.getChosenPlayer() == null || !source.getChosenPlayer().equals(player)) { - return false; - } + return source.getChosenPlayer() != null && source.getChosenPlayer().equals(player); } else if (property.startsWith("LifeEquals_")) { int life = AbilityUtils.calculateAmount(source, property.substring(11), null); - if (player.getLife() != life) { - return false; - } + return player.getLife() == life; } else if (property.equals("IsPoisoned")) { - if (player.getPoisonCounters() <= 0) { - return false; - } + return player.getPoisonCounters() > 0; } else if (property.startsWith("controls")) { final String[] type = property.substring(8).split("_"); final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type[0], sourceController, source); String comparator = type[1]; String compareTo = comparator.substring(2); int y = StringUtils.isNumeric(compareTo) ? Integer.parseInt(compareTo) : 0; - if (!Expressions.compare(list.size(), comparator, y)) { - return false; - } + return Expressions.compare(list.size(), comparator, y); } else if (property.startsWith("withMore")) { final String cardType = property.split("sThan")[0].substring(8); final Player controller = "Active".equals(property.split("sThan")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController; final CardCollectionView oppList = CardLists.filter(player.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); final CardCollectionView yourList = CardLists.filter(controller.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); - if (oppList.size() <= yourList.size()) { - return false; - } + return oppList.size() > yourList.size(); } else if (property.startsWith("withAtLeast")) { final String cardType = property.split("More")[1].split("sThan")[0]; final int amount = Integer.parseInt(property.substring(11, 12)); @@ -240,25 +176,19 @@ public class PlayerProperty { final CardCollectionView oppList = CardLists.filter(player.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); final CardCollectionView yourList = CardLists.filter(controller.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); System.out.println(yourList.size()); - if (oppList.size() < yourList.size() + amount) { - return false; - } + return oppList.size() >= yourList.size() + amount; } else if (property.startsWith("hasMore")) { final Player controller = property.contains("Than") && "Active".equals(property.split("Than")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController; if (property.substring(7).startsWith("Life") && player.getLife() <= controller.getLife()) { return false; - } else if (property.substring(7).startsWith("CardsInHand") - && player.getCardsIn(ZoneType.Hand).size() <= controller.getCardsIn(ZoneType.Hand).size()) { - return false; - } + } else return !property.substring(7).startsWith("CardsInHand") + || player.getCardsIn(ZoneType.Hand).size() > controller.getCardsIn(ZoneType.Hand).size(); } else if (property.startsWith("hasFewer")) { final Player controller = "Active".equals(property.split("Than")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController; final ZoneType zt = property.substring(8).startsWith("CreaturesInYard") ? ZoneType.Graveyard : ZoneType.Battlefield; final CardCollectionView oppList = CardLists.filter(player.getCardsIn(zt), Presets.CREATURES); final CardCollectionView yourList = CardLists.filter(controller.getCardsIn(zt), Presets.CREATURES); - if (oppList.size() >= yourList.size()) { - return false; - } + return oppList.size() < yourList.size(); } else if (property.startsWith("withMost")) { final String kind = property.substring(8); if (kind.equals("Life")) { @@ -268,9 +198,7 @@ public class PlayerProperty { highestLife = p.getLife(); } } - if (player.getLife() != highestLife) { - return false; - } + return player.getLife() == highestLife; } else if (kind.equals("PermanentInPlay")) { int typeNum = 0; @@ -286,9 +214,7 @@ public class PlayerProperty { } } - if (controlmost.size() != 1 || !controlmost.contains(player)) { - return false; - } + return controlmost.size() == 1 && controlmost.contains(player); } else if (kind.equals("CardsInHand")) { int largestHand = 0; @@ -299,9 +225,7 @@ public class PlayerProperty { withLargestHand = p; } } - if (!player.equals(withLargestHand)) { - return false; - } + return player.equals(withLargestHand); } else if (kind.startsWith("Type")) { String type = property.split("Type")[1]; @@ -325,9 +249,7 @@ public class PlayerProperty { if (checkOnly && controlmost.size() != 1) { return false; } - if (!controlmost.contains(player)) { - return false; - } + return controlmost.contains(player); } } else if (property.startsWith("withLowest")) { if (property.substring(10).equals("Life")) { @@ -342,18 +264,12 @@ public class PlayerProperty { lowestlifep.add(p); } } - if (!lowestlifep.contains(player)) { - return false; - } + return lowestlifep.contains(player); } } else if (property.startsWith("LessThanHalfStartingLifeTotal")) { - if (player.getLife() >= (int) Math.ceil(player.getStartingLife() / 2.0)) { - return false; - } + return player.getLife() < (int) Math.ceil(player.getStartingLife() / 2.0); } else if (property.startsWith("Triggered")) { - if (!AbilityUtils.getDefinedPlayers(source, property, spellAbility).contains(player)) { - return false; - } + return AbilityUtils.getDefinedPlayers(source, property, spellAbility).contains(player); } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java b/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java index 05bf6c1627d..882dd783bcc 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java @@ -59,9 +59,7 @@ public class ReplaceAddCounter extends ReplacementEffect { if (mapParams.containsKey("ValidCounterType")) { String type = this.getMapParams().get("ValidCounterType"); - if (CounterType.getType(type) != runParams.get("CounterType")) { - return false; - } + return CounterType.getType(type) == runParams.get("CounterType"); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java b/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java index 6708d29b7ed..e1e92a84ae0 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java @@ -59,9 +59,7 @@ public class ReplaceCounter extends ReplacementEffect { } if (this.getMapParams().containsKey("ValidType")) { String type = this.getMapParams().get("ValidType"); - if (type.equals("Spell") && !spellAbility.isSpell()) { - return false; - } + return !type.equals("Spell") || spellAbility.isSpell(); } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java index fa61c0e1123..5aa9da41132 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java @@ -74,9 +74,7 @@ public class ReplaceDestroy extends ReplacementEffect { } } if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get("Source"), getParam("ValidSource").split(","), getHostCard())) { - return false; - } + return matchesValid(runParams.get("Source"), getParam("ValidSource").split(","), getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java index 20499fc1de2..8354cf6418b 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java @@ -62,9 +62,7 @@ public class ReplaceDiscard extends ReplacementEffect { } } if (this.getMapParams().containsKey("DiscardFromEffect")) { - if (null == runParams.get("Source")) { - return false; - } + return null != runParams.get("Source"); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java index 4b7b2d80f38..a6547e66d49 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java @@ -55,11 +55,9 @@ public class ReplaceDraw extends ReplacementEffect { } if (this.getMapParams().containsKey("NotFirstCardInDrawStep")) { final Player p = (Player)runParams.get("Affected"); - if (p.numDrawnThisDrawStep() == 0 - && this.getHostCard().getGame().getPhaseHandler().is(PhaseType.DRAW) - && this.getHostCard().getGame().getPhaseHandler().isPlayerTurn(p)) { - return false; - } + return p.numDrawnThisDrawStep() != 0 + || !this.getHostCard().getGame().getPhaseHandler().is(PhaseType.DRAW) + || !this.getHostCard().getGame().getPhaseHandler().isPlayerTurn(p); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java index 30f56eceb9d..fffc08855ed 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java @@ -57,9 +57,7 @@ public class ReplaceDrawCards extends ReplacementEffect { String comparator = this.getMapParams().get("Number"); final String operator = comparator.substring(0, 2); final int operandValue = Integer.parseInt(comparator.substring(2)); - if (!Expressions.compare(n, operator, operandValue)) { - return false; - } + return Expressions.compare(n, operator, operandValue); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java b/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java index d269f9c044f..aa95a7a8862 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java @@ -57,9 +57,7 @@ public class ReplaceGainLife extends ReplacementEffect { } } if ("True".equals(this.getMapParams().get("SourceController"))) { - if (runParams.get("Source") == null || !runParams.get("Affected").equals(((Card)runParams.get("Source")).getController())) { - return false; - } + return runParams.get("Source") != null && runParams.get("Affected").equals(((Card) runParams.get("Source")).getController()); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java index 298f6cf470b..d6cc1b84cf2 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java @@ -29,9 +29,7 @@ public class ReplaceGameLoss extends ReplacementEffect { return false; } if (this.getMapParams().containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard())) { - return false; - } + return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java index 162d87bca99..a7af2db3f2e 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java @@ -105,9 +105,7 @@ public class ReplaceMoved extends ReplacementEffect { if (runParams.containsKey("Cause")) { SpellAbility cause = (SpellAbility) runParams.get("Cause"); if (cause != null) { - if (cause.isValid(getParam("NotCause").split(","), controller, getHostCard(), null)) { - return false; - } + return !cause.isValid(getParam("NotCause").split(","), controller, getHostCard(), null); } } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java index 90abfa87fd6..dc7c218e750 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java @@ -58,9 +58,7 @@ public class ReplaceProduceMana extends ReplacementEffect { } if (this.getMapParams().containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard())) { - return false; - } + return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java b/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java index d4c2c7a2c1f..7cfb4413ce8 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java @@ -46,9 +46,7 @@ public class ReplaceSetInMotion extends ReplacementEffect { return false; } if (this.getMapParams().containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard())) { - return false; - } + return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java index c2121b2e0d7..809dd8a00a8 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java @@ -31,9 +31,7 @@ public class ReplaceSurveil extends ReplacementEffect { } if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get("Affected"), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + return matchesValid(runParams.get("Affected"), getParam("ValidPlayer").split(","), getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java b/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java index d58cd697b4a..f8b5d4ebe78 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java @@ -45,9 +45,7 @@ public class ReplaceToken extends ReplacementEffect { if (hasParam("ValidToken")) { if (runParams.containsKey("Token")) { - if (!matchesValid(runParams.get("Token"), getParam("ValidToken").split(","), getHostCard())) { - return false; - } + return matchesValid(runParams.get("Token"), getParam("ValidToken").split(","), getHostCard()); } else { // in case RE is not updated yet return false; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java b/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java index d1d4bbe2845..67feac6bdbd 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java @@ -30,9 +30,7 @@ public class ReplaceTurnFaceUp extends ReplacementEffect { return false; } if (this.getMapParams().containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard())) { - return false; - } + return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java b/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java index d336af27279..898ec36bfea 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java @@ -63,9 +63,7 @@ public class ReplaceUntap extends ReplacementEffect { final Card card = (Card) o; // all replace untap with untapStep does have "your untap step" final Player player = card.getController(); - if (!player.getGame().getPhaseHandler().is(PhaseType.UNTAP, player)) { - return false; - } + return player.getGame().getPhaseHandler().is(PhaseType.UNTAP, player); } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java b/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java index bdbf0705124..a60f85d12ce 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java @@ -8,5 +8,5 @@ public enum ReplacementResult { Replaced, NotReplaced, Prevented, - Updated; + Updated } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java index 9d420ef7199..0f10844b665 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java @@ -29,7 +29,7 @@ public enum ReplacementType { Untap(ReplaceUntap.class); Class clasz; - private ReplacementType(Class cls) { + ReplacementType(Class cls) { clasz = cls; } diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index 9d2d71e1f38..b3b9040bf61 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -97,8 +97,7 @@ public class AbilityManaPart implements java.io.Serializable { this.addsKeywordsUntil = params.get("AddsKeywordsUntil"); this.addsCounters = params.get("AddsCounters"); this.triggersWhenSpent = params.get("TriggersWhenSpent"); - this.persistentMana = (null == params.get("PersistentMana")) ? false : - "True".equalsIgnoreCase(params.get("PersistentMana")); + this.persistentMana = (null != params.get("PersistentMana")) && "True".equalsIgnoreCase(params.get("PersistentMana")); this.manaReplaceType = params.containsKey("ManaReplaceType") ? params.get("ManaReplaceType") : ""; } @@ -489,12 +488,8 @@ public class AbilityManaPart implements java.io.Serializable { * @return a boolean. */ public final boolean isBasic() { - if (this.getOrigProduced().length() != 1 && !this.getOrigProduced().contains("Any") - && !this.getOrigProduced().contains("Chosen")) { - return false; - } - - return true; + return this.getOrigProduced().length() == 1 || this.getOrigProduced().contains("Any") + || this.getOrigProduced().contains("Chosen"); } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index fb8389a1af7..2ec5dac8bc2 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -118,7 +118,8 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean basicLandAbility = false; private SplitSide splitSide = null; - enum SplitSide { LEFT, RIGHT }; + enum SplitSide { LEFT, RIGHT } + private int totalManaSpent = 0; /** The pay costs. */ @@ -209,7 +210,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit @Override public boolean equals(final Object obj) { return obj instanceof SpellAbility && this.id == ((SpellAbility) obj).id; - }; + } @Override public void setHostCard(final Card c) { @@ -271,7 +272,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (isPwAbility()) { return false; //Loyalty ability, not a mana ability. } - if (isWrapper() && ((WrappedAbility) this).getTrigger().getMode() != TriggerType.TapsForMana) { + if (isWrapper() && this.getTrigger().getMode() != TriggerType.TapsForMana) { return false; } @@ -1428,10 +1429,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit maxTargets = Integer.parseInt(this.getHostCard().getSVar("CostCountersRemoved")); } - if (minTargets > numTargets || maxTargets < numTargets) { - return false; - } - return true; + return minTargets <= numTargets && maxTargets >= numTargets; } /** *

@@ -1722,10 +1720,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (isSpell() && text.contains("was spent to cast")) { return true; } - if (isAbility() && text.contains("mana spent to pay")) { - return true; - } - return false; + return isAbility() && text.contains("mana spent to pay"); } public void checkActivationResloveSubs() { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index c53c34bd3ce..80fe9bedd26 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -444,9 +444,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { final int svarValue = AbilityUtils.calculateAmount(host, this.getsVarToCheck(), sa); final int operandValue = AbilityUtils.calculateAmount(host, this.getsVarOperand(), sa); - if (!Expressions.compare(svarValue, this.getsVarOperator(), operandValue)) { - return false; - } + return Expressions.compare(svarValue, this.getsVarOperator(), operandValue); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index bc3e6649da4..01c1b2ea326 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -270,11 +270,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } // TODO: this is an exception for Aftermath. Needs to be somehow generalized. - if (this.getZone() != ZoneType.Graveyard && sa.isAftermath() && sa.isRightSplit()) { - return false; - } - - return true; + return this.getZone() == ZoneType.Graveyard || !sa.isAftermath() || !sa.isRightSplit(); } } return false; @@ -315,9 +311,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } } - if (!isPhase) { - return false; - } + return isPhase; } return true; } @@ -356,9 +350,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { if (sa.isSpell()) { final CardPlayOption o = c.mayPlay(sa.getMayPlay()); - if (o != null && o.getPlayer() == activator) { - return true; - } + return o != null && o.getPlayer() == activator; } return false; @@ -515,9 +507,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { final int svarValue = AbilityUtils.calculateAmount(sa.getHostCard(), this.getsVarToCheck(), sa); final int operandValue = AbilityUtils.calculateAmount(sa.getHostCard(), this.getsVarOperand(), sa); - if (!Expressions.compare(svarValue, this.getsVarOperator(), operandValue)) { - return false; - } + return Expressions.compare(svarValue, this.getsVarOperator(), operandValue); } return true; } @@ -582,9 +572,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { int gameActivationLimit = AbilityUtils.calculateAmount(c, limit, sa); this.setGameActivationLimit(gameActivationLimit); - if ((this.getGameActivationLimit() != -1) && (sa.getActivationsThisGame() >= this.getGameActivationLimit())) { - return false; - } + return (this.getGameActivationLimit() == -1) || (sa.getActivationsThisGame() < this.getGameActivationLimit()); } return true; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index bf6a8e8a045..048014c7684 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -314,7 +314,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { // try to deduce which target has been replaced // (this may be imprecise, updateTarget should specify old target if possible) for (Object obj : map.keySet()) { - if (!target.getTargets().contains((GameObject)obj)) { + if (!target.getTargets().contains(obj)) { toRemove = obj; break; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java b/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java index 8b04a632bb3..4d0a734746a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java @@ -48,7 +48,7 @@ public class SpellPermanent extends SpellApiBased { */ public SpellPermanent(final Card sourceCard) { super(sourceCard.isCreature() ? ApiType.PermanentCreature : ApiType.PermanentNoncreature, sourceCard, - new Cost(sourceCard.getManaCost(), false), null, Maps.newHashMap()); + new Cost(sourceCard.getManaCost(), false), null, Maps.newHashMap()); // reset StackDescription for something with Text this.setStackDescription(""); diff --git a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java index 305b77f6950..270e57585b2 100644 --- a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java +++ b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java @@ -773,9 +773,7 @@ public class TargetRestrictions { * @param portionAllocated the divided portion allocated */ public final void addDividedAllocation(final Object tgt, final Integer portionAllocated) { - if (this.dividedMap.containsKey(tgt)) { - this.dividedMap.remove(tgt); - } + this.dividedMap.remove(tgt); this.dividedMap.put(tgt, portionAllocated); } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 0c01ab230e9..bb4a0f6e37b 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -516,12 +516,8 @@ public class StaticAbility extends CardTraitBase implements Comparable thisTurnCast = CardUtil.getThisTurnCast(valid, card); - if (CardLists.filterControlledBy(thisTurnCast, activator).size() < limit) { - return false; - } + return CardLists.filterControlledBy(thisTurnCast, activator).size() >= limit; } return true; @@ -138,12 +136,8 @@ public class StaticAbilityCantBeCast { return false; } - if (params.containsKey("NonActivatorTurn") && (activator != null) - && activator.getGame().getPhaseHandler().isPlayerTurn(activator)) { - return false; - } - - return true; + return !params.containsKey("NonActivatorTurn") || (activator == null) + || !activator.getGame().getPhaseHandler().isPlayerTurn(activator); } /** @@ -174,12 +168,8 @@ public class StaticAbilityCantBeCast { } } - if (params.containsKey("Player") && (player != null) - && !player.isValid(params.get("Player"), hostCard.getController(), hostCard, null)) { - return false; - } - - return true; + return !params.containsKey("Player") || (player == null) + || player.isValid(params.get("Player"), hostCard.getController(), hostCard, null); } } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java index 72331cbb9af..e43f48cb517 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java @@ -17,16 +17,11 @@ public class StaticAbilityCantPutCounter { } } + // for the other part if (staticAbility.hasParam("ValidCard")) { - if (!card.isValid(staticAbility.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { - return false; - } - } else if (staticAbility.hasParam("ValidPlayer")) { - // for the other part - return false; - } + return card.isValid(staticAbility.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null); + } else return !staticAbility.hasParam("ValidPlayer"); - return true; } public static boolean applyCantPutCounter(final StaticAbility staticAbility, final Player player, @@ -40,15 +35,10 @@ public class StaticAbilityCantPutCounter { } } + // for the other part if (staticAbility.hasParam("ValidPlayer")) { - if (!player.isValid(staticAbility.getParam("ValidPlayer").split(","), hostCard.getController(), hostCard, null)) { - return false; - } - } else if (staticAbility.hasParam("ValidCard")) { - // for the other part - return false; - } + return player.isValid(staticAbility.getParam("ValidPlayer").split(","), hostCard.getController(), hostCard, null); + } else return !staticAbility.hasParam("ValidCard"); - return true; } } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java index 1667633ef1e..91ab7dc10bd 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java @@ -99,7 +99,7 @@ public class StaticAbilityCantTarget { if (params.containsKey("Hexproof") && (activator != null)) { for (String k : activator.getKeywords()) { if (k.startsWith("IgnoreHexproof")) { - String m[] = k.split(":"); + String[] m = k.split(":"); if (card.isValid(m[1].split(","), activator, source, spellAbility)) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 4126ddca865..3e6b6e3fb86 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -627,7 +627,7 @@ public final class StaticAbilityContinuous { for (String rep : addReplacements) { final ReplacementEffect actualRep = ReplacementHandler.parseReplacement(rep, affectedCard, false); actualRep.setIntrinsic(false); - affectedCard.addReplacementEffect(actualRep).setTemporary(true);; + affectedCard.addReplacementEffect(actualRep).setTemporary(true); } } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java index db69215e01e..43dd0cb64df 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java @@ -39,12 +39,8 @@ public class StaticAbilityETBTapped { final Map params = stAb.getMapParams(); final Card hostCard = stAb.getHostCard(); - if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { - return false; - } - - return true; + return !params.containsKey("ValidCard") + || card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null); } } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index e901efcb665..1ff3deaf234 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -284,9 +284,7 @@ public abstract class Trigger extends TriggerReplacementBase { if (this.mapParams.containsKey("TurnCount")) { int turn = Integer.parseInt(this.mapParams.get("TurnCount")); - if (phaseHandler.getTurn() != turn) { - return false; - } + return phaseHandler.getTurn() == turn; } return true; @@ -356,10 +354,7 @@ public abstract class Trigger extends TriggerReplacementBase { } } - if ( !meetsCommonRequirements(this.mapParams)) - return false; - - return true; + return meetsCommonRequirements(this.mapParams); } @@ -382,8 +377,7 @@ public abstract class Trigger extends TriggerReplacementBase { String condition = this.mapParams.get("Condition"); if ("AltCost".equals(condition)) { final Card moved = (Card) runParams.get("Card"); - if( null != moved && !moved.isOptionalCostPaid(OptionalCost.AltCost)) - return false; + return null == moved || moved.isOptionalCostPaid(OptionalCost.AltCost); } else if ("AttackedPlayerWithMostLife".equals(condition)) { GameEntity attacked = (GameEntity) runParams.get("Attacked"); if (attacked == null) { @@ -391,10 +385,8 @@ public abstract class Trigger extends TriggerReplacementBase { // ends up being in Defender at that point. attacked = (GameEntity) runParams.get("Defender"); } - if (attacked == null || !attacked.isValid("Player.withMostLife", - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + return attacked != null && attacked.isValid("Player.withMostLife", + this.getHostCard().getController(), this.getHostCard(), null); } else if ("AttackedPlayerWhoAttackedYouLastTurn".equals(condition)) { GameEntity attacked = (GameEntity) runParams.get("Attacked"); if (attacked == null) { @@ -411,9 +403,7 @@ public abstract class Trigger extends TriggerReplacementBase { } } - if (attacked == null || !valid) { - return false; - } + return attacked != null && valid; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java index a07aff661d8..4aba396ab93 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java @@ -49,10 +49,8 @@ public class TriggerAbandoned extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Scheme"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Scheme"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java index 5a603b715c8..efd19c6340c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java @@ -52,10 +52,8 @@ public class TriggerAdapt extends Trigger { public final boolean performTest(final Map runParams2) { final Card sac = (Card) runParams2.get("Card"); if (hasParam("ValidCard")) { - if (!sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + return sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), + getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java index f185d57a441..a4051152221 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -60,9 +60,7 @@ public class TriggerAttached extends Trigger { } if (this.mapParams.containsKey("ValidTarget")) { - if (!matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard())) { - return false; - } + return matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 89136658f35..d8a57921a46 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -73,9 +73,7 @@ public class TriggerAttackerBlocked extends Trigger { getHostCard().getController(), getHostCard() ); - if ( count == 0 ) { - return false; - } + return count != 0; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java index 4f4ae302f7a..8edc3ad202c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -73,12 +73,8 @@ public class TriggerAttackerBlockedByCreature extends Trigger { if (this.mapParams.containsKey("ValidBlocker")) { final String validBlocker = this.mapParams.get("ValidBlocker"); if (validBlocker.equals("LessPowerThanAttacker")) { - if (blocker.getNetPower() >= attacker.getNetPower()) { - return false; - } - } else if (!matchesValid(blocker, validBlocker.split(","), this.getHostCard())) { - return false; - } + return blocker.getNetPower() < attacker.getNetPower(); + } else return matchesValid(blocker, validBlocker.split(","), this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java index c9ac21fc4bd..ec0bfa5c95b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java @@ -58,10 +58,8 @@ public class TriggerAttackerUnblocked extends Trigger { } } if (this.mapParams.containsKey("ValidDefender")) { - if (!matchesValid(runParams2.get("Defender"), this.mapParams.get("ValidDefender").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Defender"), this.mapParams.get("ValidDefender").split(","), + this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java index 66ed8f5c01b..06f7e06590f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java @@ -73,10 +73,8 @@ public class TriggerAttackerUnblockedOnce extends Trigger { */ } if (hasParam("ValidAttackingPlayer")) { - if (!matchesValid(runParams2.get("AttackingPlayer"), - this.mapParams.get("ValidAttackingPlayer").split(","), this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("AttackingPlayer"), + this.mapParams.get("ValidAttackingPlayer").split(","), this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java index 72f9649bba1..8f00fbf3d33 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java @@ -76,9 +76,7 @@ public class TriggerAttackersDeclared extends Trigger { valid = true; } } - if (!valid) { - return false; - } + return valid; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java index 0f28b513ce6..971d4299bd7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -113,9 +113,7 @@ public class TriggerAttacks extends Trigger { } } } - if (!found) { - return false; - } + return found; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java index 17d9840f804..26a0deae9ef 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java @@ -24,10 +24,8 @@ public class TriggerBecomeMonarch extends Trigger { } if (this.mapParams.containsKey("BeginTurn")) { - if (!matchesValid(game.getMonarchBeginTurn(), this.mapParams.get("BeginTurn").split(","), - host)) { - return false; - } + return matchesValid(game.getMonarchBeginTurn(), this.mapParams.get("BeginTurn").split(","), + host); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java index 5a70ce99648..9b914392737 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java @@ -52,10 +52,8 @@ public class TriggerBecomeMonstrous extends Trigger { @Override public final boolean performTest(Map runParams2) { if (hasParam("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java index ab84910d4cf..f0da7bc86b9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java @@ -50,10 +50,8 @@ public class TriggerBecomeRenowned extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java index 097262f0c51..3bdfa10004f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java @@ -77,9 +77,7 @@ public class TriggerBecomesTarget extends Trigger { } } if (this.mapParams.containsKey("FirstTime")) { - if (!runParams2.containsKey("FirstTime")) { - return false; - } + return runParams2.containsKey("FirstTime"); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java index bd8a2868c51..6707812b470 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -70,9 +70,7 @@ public class TriggerBecomesTargetOnce extends Trigger { break; } } - if (!valid) { - return false; - } + return valid; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java index 1f351c52813..06f7e300693 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java @@ -76,10 +76,8 @@ public class TriggerBlocks extends Trigger { break; } } - - if (!foundMatch) { - return false; - } + + return foundMatch; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java index 2604e2d55c7..1611f9c7595 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -60,10 +60,8 @@ public class TriggerChampioned extends Trigger { } } if (this.mapParams.containsKey("ValidSource")) { - if (!source.isValid(this.mapParams.get("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + return source.isValid(this.mapParams.get("ValidSource").split(","), + this.getHostCard().getController(), this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java index 31a073b8508..b394980a87d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java @@ -58,10 +58,8 @@ public class TriggerChangesController extends Trigger { } } if (this.mapParams.containsKey("ValidOriginalController")) { - if (!matchesValid(runParams2.get("OriginalController"), this.mapParams.get("ValidOriginalController").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("OriginalController"), this.mapParams.get("ValidOriginalController").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index 0993e8dae29..f49005ac74a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -17,11 +17,7 @@ public class TriggerChangesZoneAll extends Trigger { public boolean performTest(Map runParams2) { final CardZoneTable table = (CardZoneTable) runParams2.get("Cards"); - if (filterCards(table).isEmpty()) { - return false; - } - - return true; + return !filterCards(table).isEmpty(); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java b/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java index 8caaf85c7ef..a2eec1db4d7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java @@ -59,9 +59,7 @@ public class TriggerClashed extends Trigger { } if (this.mapParams.containsKey("Won")) { - if (!this.mapParams.get("Won").equals(runParams2.get("Won"))) { - return false; - } + return this.mapParams.get("Won").equals(runParams2.get("Won")); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java index 26f64523bdc..9e8e0b4d288 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java @@ -109,9 +109,7 @@ public class TriggerCounterAdded extends Trigger { final int operand = Integer.parseInt(fullParam.substring(2)); final int actualAmount = (Integer) runParams2.get("CounterAmount"); - if (!Expressions.compare(actualAmount, operator, operand)) { - return false; - } + return Expressions.compare(actualAmount, operator, operand); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java index 8becd1a4ded..94b49909f02 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java @@ -19,11 +19,7 @@ public class TriggerCounterAddedAll extends Trigger { public boolean performTest(Map runParams2) { final GameEntityCounterTable table = (GameEntityCounterTable) runParams2.get("Objects"); - if (filterTable(table).isEmpty()) { - return false; - } - - return true; + return !filterTable(table).isEmpty(); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java index 549a3d81670..65ea6cc7e18 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java @@ -93,10 +93,8 @@ public class TriggerCounterAddedOnce extends Trigger { return false; } - if (!source.isValid(getParam("ValidSource").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + return source.isValid(getParam("ValidSource").split(","), getHostCard().getController(), + getHostCard(), null); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java index 46e0bc5fa41..eec54b27f2f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java @@ -71,9 +71,7 @@ public class TriggerCounterRemoved extends Trigger { if (hasParam("NewCounterAmount")) { final String amtString = getParam("NewCounterAmount"); int amt = Integer.parseInt(amtString); - if(amt != addedNewCounterAmount.intValue()) { - return false; - } + return amt == addedNewCounterAmount.intValue(); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java index 4e02b6d8df4..888ab7027dc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java @@ -62,9 +62,7 @@ public class TriggerCounterRemovedOnce extends Trigger { if (hasParam("CounterType")) { final String type = getParam("CounterType"); - if (!type.equals(removedType.toString())) { - return false; - } + return type.equals(removedType.toString()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java index 0b11585be24..a31fab2f15e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java @@ -80,9 +80,7 @@ public class TriggerCountered extends Trigger { if (ctrdSA != null) { if (validType.equals("Spell") && !ctrdSA.isSpell()) { return false; - } else if (validType.equals("Ability") && !ctrdSA.isAbility()) { - return false; - } + } else return !validType.equals("Ability") || ctrdSA.isAbility(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java index a13e8664d9e..d62f0f8f58c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java @@ -63,10 +63,8 @@ public class TriggerCycled extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index 7b4331ddb06..88e9ea45135 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -94,9 +94,7 @@ public class TriggerDamageDealtOnce extends Trigger { final int operand = Integer.parseInt(fullParam.substring(2)); final int actualAmount = (Integer) runParams2.get("DamageAmount"); - if (!Expressions.compare(actualAmount, operator, operand)) { - return false; - } + return Expressions.compare(actualAmount, operator, operand); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index d5a9634cc39..bed6d6bc1a3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -45,9 +45,7 @@ public class TriggerDamageDoneOnce extends Trigger { } if (this.mapParams.containsKey("ValidTarget")) { - if (!matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard())) { - return false; - } + return matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard()); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java index cd533694d4f..9686ea9fd29 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java @@ -57,9 +57,7 @@ public class TriggerDestroyed extends Trigger { } } if (hasParam("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java index f067b7a179a..ac8002f5682 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java @@ -51,10 +51,8 @@ public class TriggerDevoured extends Trigger { public final boolean performTest(final java.util.Map runParams2) { final Card sac = (Card) runParams2.get("Devoured"); if (this.mapParams.containsKey("ValidDevoured")) { - if (!sac.isValid(this.mapParams.get("ValidDevoured").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return sac.isValid(this.mapParams.get("ValidDevoured").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java index 0c60b064149..f8a5f7d8d7a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java @@ -74,9 +74,7 @@ public class TriggerDiscarded extends Trigger { } if (this.mapParams.containsKey("IsMadness")) { Boolean madness = (Boolean) runParams2.get("IsMadness"); - if (this.mapParams.get("IsMadness").equals("True") ^ madness) { - return false; - } + return !(this.mapParams.get("IsMadness").equals("True") ^ madness); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java index 7e236166d20..c9a761ac3ec 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java @@ -70,11 +70,7 @@ public class TriggerDrawn extends Trigger { } // trigger should not happen while Mulligan - if (game.getAge() == GameStage.Mulligan) { - return false; - } - - return true; + return game.getAge() != GameStage.Mulligan; } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java index a85c4479cb3..71c0af1aac8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -52,10 +52,8 @@ public class TriggerEvolved extends Trigger { public final boolean performTest(final Map runParams2) { final Card sac = (Card) runParams2.get("Card"); if (hasParam("ValidCard")) { - if (!sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + return sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), + getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java index 2005d7fdc40..d4006d908e5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java @@ -24,10 +24,8 @@ public class TriggerExerted extends Trigger { public boolean performTest(Map runParams2) { final Card exerter = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - if (!exerter.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return exerter.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java index 3592a8d0adf..e12e4320903 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java @@ -84,10 +84,8 @@ public class TriggerExiled extends Trigger { if (cause == null) { return false; } - if (!cause.getHostCard().isValid(getParam("ValidCause").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + return cause.getHostCard().isValid(getParam("ValidCause").split(","), getHostCard().getController(), + getHostCard(), null); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java index dd566071c3c..2a4093ff1b2 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -60,10 +60,8 @@ public class TriggerExploited extends Trigger { } } if (this.mapParams.containsKey("ValidSource")) { - if (!source.isValid(this.mapParams.get("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + return source.isValid(this.mapParams.get("ValidSource").split(","), + this.getHostCard().getController(), this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index 5b15c7db8da..69e458136a9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -51,10 +51,8 @@ public class TriggerExplores extends Trigger { @Override public final boolean performTest(final Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java index 65ee54f09f4..e45b2eeda7e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java @@ -53,10 +53,8 @@ public class TriggerFight extends Trigger { final Card fighter = (Card) runParams2.get("Fighter"); if (this.mapParams.containsKey("ValidCard")) { - if (!fighter.isValid(this.mapParams.get("ValidCard").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + return fighter.isValid(this.mapParams.get("ValidCard").split(","), + this.getHostCard().getController(), this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java index 3d4795f9be7..3137c5cd83f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java @@ -58,9 +58,7 @@ public class TriggerFlippedCoin extends Trigger { if (this.mapParams.containsKey("ValidResult")) { final boolean result = (Boolean) runParams2.get("Result"); final boolean valid = "Win".equals(this.mapParams.get("ValidResult")); - if (result ^ valid) { - return false; - } + return !(result ^ valid); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 0197f253336..bd43d722a0d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -57,7 +57,7 @@ public class TriggerHandler { private final List delayedTriggers = Collections.synchronizedList(new ArrayList()); private final List thisTurnDelayedTriggers = Collections.synchronizedList(new ArrayList()); - private final ListMultimap playerDefinedDelayedTriggers = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); + private final ListMultimap playerDefinedDelayedTriggers = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); private final List waitingTriggers = Collections.synchronizedList(new ArrayList()); private final Game game; @@ -536,9 +536,7 @@ public class TriggerHandler { final String dest = (String) runParams.get("Destination"); if (dest.equals("Battlefield") && runParams.get("Card") instanceof Card) { final Card card = (Card) runParams.get("Card"); - if (card.isCreature()) { - return false; - } + return !card.isCreature(); } } } // Torpor Orb check diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java index 89f3a10341d..cb82452b8a5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java @@ -73,9 +73,7 @@ public class TriggerInvestigated extends Trigger { } if (this.mapParams.containsKey("OnlyFirst")) { - if ((int) runParams2.get("Num") != 1) { - return false; - } + return (int) runParams2.get("Num") == 1; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java index 0622263bdce..2498fb1d58f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java @@ -72,9 +72,7 @@ public class TriggerLandPlayed extends Trigger { } if (this.mapParams.containsKey("NotFirstLand")) { - if (land.getController().getLandsPlayedThisTurn() < 1) { - return false; - } + return land.getController().getLandsPlayedThisTurn() >= 1; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java index 599594075a5..8c44cee9063 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java @@ -62,9 +62,7 @@ public class TriggerLifeGained extends Trigger { } if (hasParam("Spell")) { final SpellAbility spellAbility = (SpellAbility) runParams2.get("SourceSA"); - if (spellAbility == null || !spellAbility.getRootAbility().isSpell()) { - return false; - } + return spellAbility != null && spellAbility.getRootAbility().isSpell(); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java index d905e1c8b07..60998db1fdb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java @@ -59,9 +59,7 @@ public class TriggerLifeLost extends Trigger { } if (this.mapParams.containsKey("FirstTime")) { - if (!(boolean)runParams2.get("FirstTime")) { - return false; - } + return (boolean) runParams2.get("FirstTime"); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java index b9aa5c4028e..931ef32c740 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java @@ -28,10 +28,8 @@ public class TriggerLosesGame extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java index bf13399f36e..365aecf8b92 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -57,10 +57,8 @@ public class TriggerPayCumulativeUpkeep extends Trigger { } final Card card = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - if (!card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java index f9e7ecabf45..c6a9c567f8e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -57,10 +57,8 @@ public class TriggerPayEcho extends Trigger { } final Card card = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - if (!card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java index 0dcdb617893..4616f0db3a9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java @@ -51,9 +51,7 @@ public class TriggerPayLife extends Trigger { @Override public final boolean performTest(final Map runParams2) { if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), getParam("ValidPlayer").split(","), getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java index 843368ac05d..3fbe945effc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java @@ -50,10 +50,8 @@ public class TriggerPhase extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java index a9cac8b0db5..c3b4aa6e789 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java @@ -17,10 +17,8 @@ public class TriggerPhaseIn extends Trigger { final Card phaser = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - if (!phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java index d0abe3e4747..530544ea3c4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -20,13 +20,9 @@ public class TriggerPhaseOut extends Trigger { if (this.mapParams.get("ValidCard").equals("Card.Self")) { // Since Phased out cards aren't visible in .isValid, use a special check here. // NOTE: All Phase Out Triggers should use ValidCard$ Card.Self - if (phaser != this.getHostCard()) { - return false; - } - } else if (!phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return phaser == this.getHostCard(); + } else return phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java index f8d1d6c18e4..87ed5e4666e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java @@ -42,9 +42,7 @@ public class TriggerPlanarDice extends Trigger { if (this.mapParams.containsKey("Result")) { PlanarDice cond = PlanarDice.smartValueOf(this.mapParams.get("Result")); - if (cond != ((PlanarDice) runParams2.get("Result"))) { - return false; - } + return cond == runParams2.get("Result"); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java index cd9f836c466..42483ab6abc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java @@ -57,9 +57,7 @@ public class TriggerRegenerated extends Trigger { } } if (hasParam("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java index 59d8d29d926..e75ff3c88c0 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -22,9 +22,7 @@ public class TriggerRevealed extends Trigger { } if (this.mapParams.containsKey("Miracle")) { Boolean madness = (Boolean) runParams2.get("Miracle"); - if (this.mapParams.get("Miracle").equals("True") ^ madness) { - return false; - } + return !(this.mapParams.get("Miracle").equals("True") ^ madness); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index 64e545483fb..4ece31285c7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -114,8 +114,7 @@ public class TriggerSacrificed extends Trigger { } } - if (!withKeyword) - return false; + return withKeyword; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java index 209f3bd5571..70be461dde3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java @@ -50,10 +50,8 @@ public class TriggerScry extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java index 538b82670ff..52dc26d35bb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java @@ -61,9 +61,7 @@ public class TriggerSearchedLibrary extends Trigger { if (this.mapParams.containsKey("SearchOwnLibrary")) { @SuppressWarnings("unchecked") List targets = (List) runParams2.get("Target"); - if (!targets.contains(runParams2.get("Player"))) { - return false; - } + return targets.contains(runParams2.get("Player")); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index bdc94181666..6b3bd7fa926 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -59,13 +59,9 @@ public class TriggerSetInMotion extends Trigger { if (this.mapParams.containsKey("SchemeType")) { if (this.mapParams.get("SchemeType").equals("NonOngoing")) { - if (((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing)) { - return false; - } + return !((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing); } else if (this.mapParams.get("SchemeType").equals("Ongoing")) { - if (!((Card)runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing)) { - return false; - } + return ((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java index e8abae4f522..a351e9b31b6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java @@ -62,9 +62,7 @@ public class TriggerShuffled extends Trigger { } if (this.mapParams.containsKey("ShuffleBySelfControlled")) { SpellAbility source = (SpellAbility) runParams2.get("Source"); - if (!source.getActivatingPlayer().equals(runParams2.get("Player"))) { - return false; - } + return source.getActivatingPlayer().equals(runParams2.get("Player")); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index 0dc88c7c789..14312a228a3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -252,9 +252,7 @@ public class TriggerSpellAbilityCast extends Trigger { break; } } - if (!sameNameFound) { - return false; - } + return sameNameFound; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java index 26bb022c137..cd0ee3d47f4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java @@ -78,10 +78,8 @@ public class TriggerSpellAbilityCopy extends Trigger { } } if (hasParam("ValidActivatingPlayer")) { - if (si == null || !matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer") - .split(","), getHostCard())) { - return false; - } + return si != null && matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer") + .split(","), getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java index 2d3ee1dbb19..a0d16afa570 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java @@ -69,9 +69,7 @@ public class TriggerSurveil extends Trigger { } if (hasParam("OnlyFirst")) { - if ((int) runParams2.get("NumThisTurn") != 1) { - return false; - } + return (int) runParams2.get("NumThisTurn") == 1; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index 44185a79ef7..70ec3905557 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -60,13 +60,9 @@ public class TriggerTaps extends Trigger { } if (hasParam("Attacker")) { if ("True".equalsIgnoreCase(getParam("Attacker"))) { - if (!(Boolean)runParams2.get("Attacker")) { - return false; - } + return (Boolean) runParams2.get("Attacker"); } else if ("False".equalsIgnoreCase(getParam("Attacker"))) { - if ((Boolean)runParams2.get("Attacker")) { - return false; - } + return !((Boolean) runParams2.get("Attacker")); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 348492cb775..293f2abbdaa 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -91,9 +91,7 @@ public class TriggerTapsForMana extends Trigger { } String produced = (String) prod; if ("ChosenColor".equals(mapParams.get("Produced"))) { - if (!this.getHostCard().hasChosenColor() || !produced.contains(MagicColor.toShortString(this.getHostCard().getChosenColor()))) { - return false; - } + return this.getHostCard().hasChosenColor() && produced.contains(MagicColor.toShortString(this.getHostCard().getChosenColor())); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java index 49bedc53cea..b1237117a44 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java @@ -45,10 +45,8 @@ public class TriggerTransformed extends Trigger { @Override public boolean performTest(Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Transformer"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Transformer"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java index 032a6733081..aa0ac8a718d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java @@ -12,10 +12,8 @@ public class TriggerTurnBegin extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java index 1136077e14b..41d27376928 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java @@ -50,10 +50,8 @@ public class TriggerTurnFaceUp extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 1c62481089e..952a21bb6f9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -98,7 +98,7 @@ public enum TriggerType { private final Constructor constructor; - private TriggerType(Class clasz) { + TriggerType(Class clasz) { constructor = findConstructor(clasz); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index 8b96b06fd3f..51b07e3c862 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -60,10 +60,8 @@ public class TriggerUnattach extends Trigger { } if (hasParam("ValidAttachment")) { - if (!attach.isValid(getParam("ValidAttachment").split(","), getHostCard() - .getController(), getHostCard(), null)) { - return false; - } + return attach.isValid(getParam("ValidAttachment").split(","), getHostCard() + .getController(), getHostCard(), null); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java index 7c583f1467d..3029fa3177f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java @@ -54,10 +54,8 @@ public class TriggerUntaps extends Trigger { final Card untapper = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - if (!untapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return untapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 2fb39bf9915..bdaf3207197 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -618,7 +618,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable() { @Override public boolean apply(final Card c) { - if (!c.mayPlay(who).isEmpty() || c.mayPlayerLook(who)) { - return true; - } - return false; + return !c.mayPlay(who).isEmpty() || c.mayPlayerLook(who); } }; } diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 7800e400519..000da073c7c 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -51,10 +51,10 @@ public class Zone implements java.io.Serializable, Iterable { protected final ZoneType zoneType; protected final Game game; - protected final transient MapOfLists cardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); - protected final transient MapOfLists cardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); - protected final transient MapOfLists latestStateCardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); - protected final transient MapOfLists latestStateCardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists cardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists cardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists latestStateCardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists latestStateCardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); public Zone(final ZoneType zone0, Game game0) { zoneType = zone0; diff --git a/forge-game/src/main/java/forge/game/zone/ZoneType.java b/forge-game/src/main/java/forge/game/zone/ZoneType.java index 283c309df0e..9f358f902de 100644 --- a/forge-game/src/main/java/forge/game/zone/ZoneType.java +++ b/forge-game/src/main/java/forge/game/zone/ZoneType.java @@ -22,10 +22,10 @@ public enum ZoneType { PlanarDeck(true), None(true); - public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(new ZoneType[]{Battlefield, Graveyard, Exile, Command/*, Hand*/}); + public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(Battlefield, Graveyard, Exile, Command/*, Hand*/); private final boolean holdsHiddenInfo; - private ZoneType(boolean holdsHidden) { + ZoneType(boolean holdsHidden) { holdsHiddenInfo = holdsHidden; } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index bae4622580e..232788992bd 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -172,10 +172,10 @@ public enum TrackableProperty { private final TrackableType type; private final FreezeMode freezeMode; - private TrackableProperty(TrackableType type0) { + TrackableProperty(TrackableType type0) { this(type0, FreezeMode.RespectsFreeze); } - private TrackableProperty(TrackableType type0, FreezeMode freezeMode0) { + TrackableProperty(TrackableType type0, FreezeMode freezeMode0) { type = type0; freezeMode = freezeMode0; } diff --git a/forge-game/src/main/java/forge/util/MessageUtil.java b/forge-game/src/main/java/forge/util/MessageUtil.java index efdbc0c040f..ea46eeb77e3 100644 --- a/forge-game/src/main/java/forge/util/MessageUtil.java +++ b/forge-game/src/main/java/forge/util/MessageUtil.java @@ -9,7 +9,7 @@ import forge.game.spellability.SpellAbility; public class MessageUtil { - private MessageUtil() { }; + private MessageUtil() { } public static String formatMessage(String message, Player player, Object related) { if (related instanceof Player && message.indexOf("{player") >= 0) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index 4bafc436d96..e502263eee2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -221,7 +221,7 @@ public final class CEditorQuest extends CDeckEditor { if (n == 0) { s = "Remove custom rating"; } else { - s = "Rate this card as " + Integer.toString(n) + " stars"; + s = "Rate this card as " + n + " stars"; } GuiUtils.addMenuItem(cmb.getMenu(), s, KeyStroke.getKeyStroke(48 + n, 0), diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java index c9f8f5c0fb2..11e1c512e83 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java @@ -83,10 +83,10 @@ public final class CEditorQuestCardShop extends ACEditorBase { private List fullCatalogCards; // remember changed gui elements - private String CCTabLabel = new String(); - private String CCAddLabel = new String(); - private String CDTabLabel = new String(); - private String CDRemLabel = new String(); + private String CCTabLabel = ""; + private String CCAddLabel = ""; + private String CDTabLabel = ""; + private String CDRemLabel = ""; private String prevRem4Label = null; private String prevRem4Tooltip = null; private Runnable prevRem4Cmd = null; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java index f465232242b..588cf960802 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java @@ -79,8 +79,8 @@ public class ContestGauntletLister extends JPanel { name = gd.getName(); name = name.substring(GauntletIO.PREFIX_LOCKED.length()); - progress = String.valueOf(Math.round( - ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100)) + " %"; + progress = Math.round( + ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100) + " %"; if (gd.getUserDeck() == null) { progress = "---"; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java index 1938459912c..b0e9d04cfdb 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java @@ -110,8 +110,8 @@ public class QuickGauntletLister extends JPanel { row.add(new FLabel.Builder().text(String.valueOf(gd.getDecks().size())) .fontAlign(SwingConstants.RIGHT).build(), "w 90px!, h 20px!, gap 0 0 5px 0"); - row.add(new FLabel.Builder().text(String.valueOf(Math.round( - ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100)) + "%") + row.add(new FLabel.Builder().text(Math.round( + ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100) + "%") .fontAlign(SwingConstants.RIGHT).build(), "w 90px!, h 20px!, gap 0 0 5px 0"); this.add(row, "w 98%!, h 30px!, gap 1% 0 0 0"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 3813522c759..65454ac06ce 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -49,7 +49,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FLabel lblTitleNew = new FLabel.Builder().text(localizer.getMessage("lblStartanewQuest")).opaque(true).fontSize(16).build(); - String str=new String( ForgeConstants.QUEST_SAVE_DIR.replace('\\', '/')); + String str= ForgeConstants.QUEST_SAVE_DIR.replace('\\', '/'); private final FLabel lblOldQuests = new FLabel.Builder().text(localizer.getMessage("lblOldQuestData").replace("%s",str)).fontAlign(SwingConstants.CENTER).fontSize(12).build(); private final QuestFileLister lstQuests = new QuestFileLister(); private final FScrollPane scrQuests = new FScrollPane(lstQuests, false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java index 002165d9255..31b8aa1a43b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java @@ -89,7 +89,7 @@ public class ViewItem extends FPanel { ViewItem.this.lblIcon.setIcon(i); ViewItem.this.lblName.setText(bazaarItem.getPurchaseName()); - ViewItem.this.lblPrice.setText("Cost: " + String.valueOf(bazaarItem.getBuyingPrice(qA)) + " credits"); + ViewItem.this.lblPrice.setText("Cost: " + bazaarItem.getBuyingPrice(qA) + " credits"); String desc = bazaarItem.getPurchaseDescription(qA); ViewItem.this.tarDesc.setText(FSkin.encodeSymbols(desc, false)); //encode in case there are mana symbols in description diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 1d6b5532257..dc80e578182 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -101,7 +101,6 @@ import forge.util.gui.SOptionPane; import forge.view.FView; import forge.view.arcane.CardPanel; import forge.view.arcane.FloatingZone; -import forge.match.input.*; /** * Constructs instance of match UI controller, used as a single point of diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java index 9e9fcb0df1d..8b4717a3929 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java @@ -174,7 +174,7 @@ public class VAssignDamage { final JPanel pnlDefenders = new JPanel(); pnlDefenders.setOpaque(false); int cols = attackerHasTrample ? blockers.size() + 1 : blockers.size(); - final String wrap = "wrap " + Integer.toString(cols); + final String wrap = "wrap " + cols; pnlDefenders.setLayout(new MigLayout("insets 0, gap 0, ax center, " + wrap)); final FScrollPane scrDefenders = new FScrollPane(pnlDefenders, false); diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java index 1bfcdd2b460..9c53990d84d 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java @@ -282,7 +282,7 @@ public class FImagePanel extends JPanel { at.translate(this.getWidth() / 2, this.getHeight() / 2); // 3. rotate around (0,0). - at.rotate(Math.toRadians((double) degreesOfRotation)); + at.rotate(Math.toRadians(degreesOfRotation)); // 2. scale image. if (createScaleTransform) { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java index 79fa196ba8f..79c32a486cc 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java @@ -213,7 +213,7 @@ public class PlayerDetailsPanel extends JPanel { } public void setToolTip(final String... args) { - super.setToolTipText(String.format(tooltip, (Object[]) args)); + super.setToolTipText(String.format(tooltip, args)); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 0ae68b24e79..e3d2270d7dd 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -693,7 +693,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl titleText.setText(card.getCurrentState().getName()); final int damage = card.getDamage(); - damageText.setText(damage > 0 ? "\u00BB " + String.valueOf(damage) + " \u00AB" : ""); + damageText.setText(damage > 0 ? "\u00BB " + damage + " \u00AB" : ""); // Card Id overlay cardIdText.setText(card.getCurrentState().getDisplayId()); diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java index 3eedba838c6..d74ac25ac6d 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java @@ -109,7 +109,7 @@ public class PlanarConquestCommanderGeneraterGA extends PlanarConquestGeneraterG @Override protected Deck mutateObject(Deck parent1) { PaperCard allele = parent1.getCommanders().get(0); - if(!standardMap.keySet().contains(allele.getName())){ + if(!standardMap.containsKey(allele.getName())){ return null; } return getDeckForCard(allele); diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java index 1ff8140c537..5d352e0d51a 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java @@ -174,7 +174,7 @@ public class PlanarConquestGeneraterGA extends AbstractGeneticAlgorithm { @Override protected Deck mutateObject(Deck parent1) { PaperCard allele = parent1.getMain().get(MyRandom.getRandom().nextInt(8)); - if(!standardMap.keySet().contains(allele.getName())){ + if(!standardMap.containsKey(allele.getName())){ return null; } return getDeckForCard(allele); @@ -184,8 +184,8 @@ public class PlanarConquestGeneraterGA extends AbstractGeneticAlgorithm { protected Deck createChild(Deck parent1, Deck parent2) { PaperCard allele = parent1.getMain().get(MyRandom.getRandom().nextInt(8)); PaperCard allele2 = parent2.getMain().get(MyRandom.getRandom().nextInt(8)); - if(!standardMap.keySet().contains(allele.getName()) - ||!standardMap.keySet().contains(allele2.getName()) + if(!standardMap.containsKey(allele.getName()) + ||!standardMap.containsKey(allele2.getName()) ||allele.getName().equals(allele2.getName())){ return null; } diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index d5a932cefda..d80bc49cdae 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -77,7 +77,7 @@ public class Main { boolean fullscreenFlag = true; if (FileUtil.doesFileExist(desktopModeAssetsDir + "screen_resolution.ini")) { res = FileUtil.readFileToString(desktopModeAssetsDir + "screen_resolution.ini").split("x"); - fullscreenFlag = res.length == 3 ? Integer.parseInt(res[2].trim()) > 0 : true; + fullscreenFlag = res.length != 3 || Integer.parseInt(res[2].trim()) > 0; if (res.length >= 2) { desktopScreenWidth = Integer.parseInt(res[0].trim()); desktopScreenHeight = Integer.parseInt(res[1].trim()); diff --git a/forge-gui-mobile/src/forge/animation/AbilityEffect.java b/forge-gui-mobile/src/forge/animation/AbilityEffect.java index 868d527863b..755aa68d16a 100644 --- a/forge-gui-mobile/src/forge/animation/AbilityEffect.java +++ b/forge-gui-mobile/src/forge/animation/AbilityEffect.java @@ -11,7 +11,7 @@ public enum AbilityEffect { private GifAnimation animation; private AudioClip soundClip; - private AbilityEffect(String gif0, String wav0) { + AbilityEffect(String gif0, String wav0) { gif = gif0; wav = wav0; } diff --git a/forge-gui-mobile/src/forge/animation/GifDecoder.java b/forge-gui-mobile/src/forge/animation/GifDecoder.java index a0aa82ad767..301bec02894 100644 --- a/forge-gui-mobile/src/forge/animation/GifDecoder.java +++ b/forge-gui-mobile/src/forge/animation/GifDecoder.java @@ -254,7 +254,7 @@ public class GifDecoder { if (frameCount <= 0) return null; n = n % frameCount; - return ((GifFrame) frames.elementAt(n)).image; + return frames.elementAt(n).image; } /** @@ -692,7 +692,7 @@ public class GifDecoder { Pixmap frame = getFrame(0); int width = frame.getWidth(); int height = frame.getHeight(); - int vzones = (int)Math.sqrt((double)nrFrames); + int vzones = (int)Math.sqrt(nrFrames); int hzones = vzones; while(vzones * hzones < nrFrames) vzones++; diff --git a/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java b/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java index 457a337d2ec..768eb1e4efe 100644 --- a/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java +++ b/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java @@ -40,12 +40,12 @@ import com.badlogic.gdx.utils.Array; public class BitmapFontWriter { /** The output format. */ - public static enum OutputFormat { + public enum OutputFormat { /** AngelCodeFont text format */ Text, /** AngelCodeFont XML format */ - XML; + XML } /** The output format */ diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index cbc10b877c3..72536fe686b 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -291,7 +291,7 @@ public class CardZoom extends FOverlay { protected void doLayout(float width, float height) { } - public static interface ActivateHandler { + public interface ActivateHandler { String getActivateAction(int index); void setSelectedIndex(int index); void activate(int index); diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 56cbcaf5288..c3cb2a257b2 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -135,7 +135,7 @@ public class FDeckEditor extends TabPageScreen { return controller; } - private EditorType(DeckController controller0, Predicate cardFilter0) { + EditorType(DeckController controller0, Predicate cardFilter0) { controller = controller0; cardFilter = cardFilter0; } diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index bfdcf634a56..4daa745c651 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -901,10 +901,7 @@ public abstract class ItemManager extends FContainer im @Override protected boolean hideBackdropOnPress(float x, float y) { Rectangle bounds = currentView.getSelectionBounds(); - if (bounds == null || bounds.contains(x, y)) { - return false; //don't hide on press if within selection bounds - } - return true; + return bounds != null && !bounds.contains(x, y); //don't hide on press if within selection bounds } @Override diff --git a/forge-gui-mobile/src/forge/menu/FDropDown.java b/forge-gui-mobile/src/forge/menu/FDropDown.java index f308b38578e..0f2f67bd893 100644 --- a/forge-gui-mobile/src/forge/menu/FDropDown.java +++ b/forge-gui-mobile/src/forge/menu/FDropDown.java @@ -187,10 +187,7 @@ public abstract class FDropDown extends FScrollPane { protected boolean hideBackdropOnPress(float x, float y) { FDisplayObject owner = getDropDownOwner(); - if (owner == null || !owner.screenPos.contains(x, y)) { - return true; //auto-hide when backdrop pressed unless over owner - } - return false; + return owner == null || !owner.screenPos.contains(x, y); //auto-hide when backdrop pressed unless over owner } protected boolean preventOwnerHandlingBackupTap(float x, float y, int count) { diff --git a/forge-gui-mobile/src/forge/menu/FDropDownMenu.java b/forge-gui-mobile/src/forge/menu/FDropDownMenu.java index 6636a51f257..7385252fb5d 100644 --- a/forge-gui-mobile/src/forge/menu/FDropDownMenu.java +++ b/forge-gui-mobile/src/forge/menu/FDropDownMenu.java @@ -71,9 +71,6 @@ public abstract class FDropDownMenu extends FDropDown { @Override public boolean tap(float x, float y, int count) { super.tap(x, y, count); - if (getDropDownOwner() instanceof FSubMenu) { - return false; //return false so owning sub menu can be hidden - } - return true; + return !(getDropDownOwner() instanceof FSubMenu); //return false so owning sub menu can be hidden } } diff --git a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java index 146de6b6217..b1f2c67e1e9 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java @@ -719,7 +719,7 @@ public class PlayerPanel extends FContainer { public Set getAiOptions() { return isSimulatedAi() ? ImmutableSet.of(AIOption.USE_SIMULATION) - : Collections.emptySet(); + : Collections.emptySet(); } private boolean isSimulatedAi() { return isAi() && useAiSimulation; diff --git a/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java b/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java index 869730c6237..58b5b19c993 100644 --- a/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java +++ b/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java @@ -82,8 +82,7 @@ public class NewGauntletScreen extends LaunchScreen { if (numOpponents == null) { return; } ListChooser chooser = new ListChooser( - "Choose allowed deck types for opponents", 0, 11, Arrays.asList(new DeckType[] { - DeckType.CUSTOM_DECK, + "Choose allowed deck types for opponents", 0, 11, Arrays.asList(DeckType.CUSTOM_DECK, DeckType.PRECONSTRUCTED_DECK, DeckType.QUEST_OPPONENT_DECK, DeckType.COLOR_DECK, @@ -93,8 +92,7 @@ public class NewGauntletScreen extends LaunchScreen { DeckType.MODERN_CARDGEN_DECK, DeckType.LEGACY_CARDGEN_DECK, DeckType.VINTAGE_CARDGEN_DECK, - DeckType.THEME_DECK - }), null, new Callback>() { + DeckType.THEME_DECK), null, new Callback>() { @Override public void run(final List allowedDeckTypes) { if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { return; } diff --git a/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java b/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java index 1ff05bc4dfd..c38c3f6c48b 100644 --- a/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java @@ -32,7 +32,7 @@ public class LoadGameMenu extends FPopupMenu { private final Class screenClass; private FScreen screen; - private LoadGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { + LoadGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { screenClass = screenClass0; item = new FMenuItem(caption0, icon0, new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java index e1756cf2434..0bd6829888b 100644 --- a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java @@ -36,7 +36,7 @@ public class NewGameMenu extends FPopupMenu { private final Class screenClass; private FScreen screen; - private NewGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { + NewGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { screenClass = screenClass0; item = new FMenuItem(caption0, icon0, new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index c72bcf226e3..563d8d3c765 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -325,7 +325,7 @@ public class VStack extends FDropDown { CardZoom.show(stackInstance.getSourceCard()); } })); - }; + } }; menu.show(this, x, y); diff --git a/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java b/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java index 7b7dcf882cb..f796b3d55d3 100644 --- a/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java +++ b/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java @@ -21,7 +21,7 @@ public class OnlineMenu extends FPopupMenu { private final Class screenClass; private FScreen screen; - private OnlineScreen(final String caption0, final FImage icon0, final Class screenClass0) { + OnlineScreen(final String caption0, final FImage icon0, final Class screenClass0) { screenClass = screenClass0; item = new FMenuItem(caption0, icon0, new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/sound/AudioClip.java b/forge-gui-mobile/src/forge/sound/AudioClip.java index e7ec8c305f0..792125836d5 100644 --- a/forge-gui-mobile/src/forge/sound/AudioClip.java +++ b/forge-gui-mobile/src/forge/sound/AudioClip.java @@ -74,9 +74,6 @@ public class AudioClip implements IAudioClip { } public final boolean isDone() { - if (clip == null) { - return false; - } - return true; //TODO: Make this smarter if Sound supports marking as done + return clip != null;//TODO: Make this smarter if Sound supports marking as done } } diff --git a/forge-gui-mobile/src/forge/toolbox/FDialog.java b/forge-gui-mobile/src/forge/toolbox/FDialog.java index a935e0d72a3..19b8c8aec42 100644 --- a/forge-gui-mobile/src/forge/toolbox/FDialog.java +++ b/forge-gui-mobile/src/forge/toolbox/FDialog.java @@ -145,7 +145,7 @@ public abstract class FDialog extends FOverlay { public boolean isButtonEnabled(int index) { FButton button = getButton(index); - return button != null ? button.isEnabled() : false; + return button != null && button.isEnabled(); } public void setButtonEnabled(int index, boolean enabled) { @@ -283,9 +283,7 @@ public abstract class FDialog extends FOverlay { if (revealPercent != newRevealPercent) { revealPercent = newRevealPercent; updateDisplayTop(); - if (physicsObj.isMoving()) { - return true; - } + return physicsObj.isMoving(); } } diff --git a/forge-gui-mobile/src/forge/toolbox/FEvent.java b/forge-gui-mobile/src/forge/toolbox/FEvent.java index fd6d83ba6bc..7fc207b66d2 100644 --- a/forge-gui-mobile/src/forge/toolbox/FEvent.java +++ b/forge-gui-mobile/src/forge/toolbox/FEvent.java @@ -36,7 +36,7 @@ public class FEvent { return args; } - public static interface FEventHandler { + public interface FEventHandler { void handleEvent(FEvent e); } } diff --git a/forge-gui-mobile/src/forge/toolbox/FScrollPane.java b/forge-gui-mobile/src/forge/toolbox/FScrollPane.java index 809b715c8ad..0534860961e 100644 --- a/forge-gui-mobile/src/forge/toolbox/FScrollPane.java +++ b/forge-gui-mobile/src/forge/toolbox/FScrollPane.java @@ -232,9 +232,7 @@ public abstract class FScrollPane extends FContainer { if (physicsObj.isMoving()) { //avoid storing last fling stop time if scroll manually stopped physicsObj.advance(dt); Vector2 pos = physicsObj.getPosition(); - if (setScrollPositions(pos.x, pos.y) && physicsObj.isMoving()) { - return true; - } + return setScrollPositions(pos.x, pos.y) && physicsObj.isMoving(); } //end fling animation if can't scroll anymore or physics object is no longer moving diff --git a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java index b52029fbb89..178cab2932c 100644 --- a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java @@ -81,7 +81,7 @@ public abstract class AchievementCollection implements Iterable { } protected AchievementCollection(String name0, String filename0, boolean isLimitedFormat0) { - this(name0, filename0, isLimitedFormat0, (String) null); + this(name0, filename0, isLimitedFormat0, null); } protected AchievementCollection(String name0, String filename0, boolean isLimitedFormat0, String path0) { @@ -125,7 +125,7 @@ public abstract class AchievementCollection implements Iterable { final List achievementListFile = FileUtil.readFile(path); for (final String s : achievementListFile) { if (!s.isEmpty()) { - String k[] = StringUtils.split(s, "|"); + String[] k = StringUtils.split(s, "|"); add(k[0],k[1],k[2]); } } diff --git a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java index 4765d8c9c1f..f159ad97243 100644 --- a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java @@ -72,11 +72,8 @@ public class ChallengeAchievements extends AchievementCollection { } public static boolean checkValidGameMode(final Game game) { - if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto) - || game.getRules().hasAppliedVariant(GameType.Puzzle)) { - // these modes use a fixed pre-defined deck format, so challenge achievements don't apply in them - return false; - } - return true; + // these modes use a fixed pre-defined deck format, so challenge achievements don't apply in them + return !game.getRules().hasAppliedVariant(GameType.MomirBasic) && !game.getRules().hasAppliedVariant(GameType.MoJhoSto) + && !game.getRules().hasAppliedVariant(GameType.Puzzle); } } diff --git a/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java b/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java index 47bb95c6b56..a876029d2e5 100644 --- a/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java +++ b/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java @@ -15,10 +15,7 @@ public class MatchWinStreak extends StreakAchievement { @Override protected Boolean eval(Player player, Game game) { if (game.getMatch().isMatchOver()) { - if (game.getMatch().isWonBy(player.getLobbyPlayer())) { - return true; - } - return false; + return game.getMatch().isWonBy(player.getLobbyPlayer()); } return null; } diff --git a/forge-gui/src/main/java/forge/achievement/VariantWins.java b/forge-gui/src/main/java/forge/achievement/VariantWins.java index 9e1630dc810..a1124b95e17 100644 --- a/forge-gui/src/main/java/forge/achievement/VariantWins.java +++ b/forge-gui/src/main/java/forge/achievement/VariantWins.java @@ -23,9 +23,7 @@ public class VariantWins extends ProgressiveAchievement { if (game.getRules().hasAppliedVariant(variant)) { return true; } - if (variant == GameType.Archenemy && game.getRules().hasAppliedVariant(GameType.ArchenemyRumble)) { - return true; //lump Archenemy Rumble into same achievement as Archenemy - } + return variant == GameType.Archenemy && game.getRules().hasAppliedVariant(GameType.ArchenemyRumble); //lump Archenemy Rumble into same achievement as Archenemy } return false; } diff --git a/forge-gui/src/main/java/forge/assets/FSkinProp.java b/forge-gui/src/main/java/forge/assets/FSkinProp.java index 2a3fd620fd6..91ac4331eed 100644 --- a/forge-gui/src/main/java/forge/assets/FSkinProp.java +++ b/forge-gui/src/main/java/forge/assets/FSkinProp.java @@ -297,7 +297,7 @@ public enum FSkinProp { private int[] coords; private PropType type; - private FSkinProp(final int[] coords0, final PropType type0) { + FSkinProp(final int[] coords0, final PropType type0) { coords = coords0; type = type0; } diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index 54e92455c8d..e86d433f44e 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -46,7 +46,7 @@ public class CardDetailUtil { public final int r, g, b; - private DetailColors(final int r0, final int g0, final int b0) { + DetailColors(final int r0, final int g0, final int b0) { r = r0; g = g0; b = b0; diff --git a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java index 91159243231..88caacc8442 100644 --- a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java +++ b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java @@ -162,7 +162,7 @@ public class CardReaderExperiments { Matcher m = p.matcher(line); if (m.matches()) { StringBuilder newLineBuilder = new StringBuilder(); - newLineBuilder.append(line.substring(0, m.start(1))); + newLineBuilder.append(line, 0, m.start(1)); for (String sym : m.group(1).split(" ")) { newLineBuilder.append("{" + sym + "}"); } diff --git a/forge-gui/src/main/java/forge/card/CardScriptParser.java b/forge-gui/src/main/java/forge/card/CardScriptParser.java index a62037712cc..c171329f248 100644 --- a/forge-gui/src/main/java/forge/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/card/CardScriptParser.java @@ -119,10 +119,7 @@ public final class CardScriptParser { if (!(part.startsWith("P") || part.startsWith("2") || isManaSymbol(part.charAt(0)))) { return false; } - if ((!isManaSymbol(part.charAt(1))) || part.charAt(0) == part.charAt(1)) { - return false; - } - return true; + return (isManaSymbol(part.charAt(1))) && part.charAt(0) != part.charAt(1); } return false; } @@ -344,10 +341,7 @@ public final class CardScriptParser { if (DEFINED_CARDS.contains(defined)) { return true; } - if (Iterables.any(DEFINED_CARDS_STARTSWITH, startsWith(defined))) { - return true; - } - return false; + return Iterables.any(DEFINED_CARDS_STARTSWITH, startsWith(defined)); } private static boolean isDefinedPlayerLegal(final String defined) { final boolean non = defined.startsWith("Non"), flipped = defined.startsWith("Flipped"); @@ -363,10 +357,7 @@ public final class CardScriptParser { if (DEFINED_PLAYERS.contains(defined)) { return true; } - if (Iterables.any(DEFINED_PLAYERS_STARTSWITH, startsWith(defined))) { - return true; - } - return false; + return Iterables.any(DEFINED_PLAYERS_STARTSWITH, startsWith(defined)); } private static final Set VALID_INCLUSIVE = ImmutableSortedSet.of( @@ -472,10 +463,7 @@ public final class CardScriptParser { if (VALID_EXCLUSIVE.contains(valid)) { return true; } - if (Iterables.any(VALID_EXCLUSIVE_STARTSWITH, startsWith(valid))) { - return true; - } - return false; + return Iterables.any(VALID_EXCLUSIVE_STARTSWITH, startsWith(valid)); } private static final class KeyValuePair { diff --git a/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java b/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java index 1d38d76c8ac..2cbab5ab4d1 100644 --- a/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java @@ -80,7 +80,7 @@ public final class CardArchetypeLDAGenerator { System.out.print("t" + t + ": "); int i = 0; while (topic.size()<=40&&i=0.005d) { topicCards.add(cardName); diff --git a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java index c8ef0a89a58..9227ae62637 100644 --- a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java @@ -100,7 +100,7 @@ public final class CardRelationMatrixGenerator { for (PaperCard card:cardList){ int col=cardIntegerMap.get(card.getName()); int[] distances = matrix[col]; - int max = (Integer) Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); + int max = Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); if (max>0) { ArrayIndexComparator comparator = new ArrayIndexComparator(ArrayUtils.toObject(distances)); Integer[] indices = comparator.createIndexArray(); @@ -118,7 +118,7 @@ public final class CardRelationMatrixGenerator { ++j; } deckPool.add(new AbstractMap.SimpleEntry(cardToAdd,distances[indices[cardList.size()-1-k]])); - }; + } if(excludeThisCard){ continue; } @@ -181,7 +181,7 @@ public final class CardRelationMatrixGenerator { for (PaperCard card:legends){ int col=legendIntegerMap.get(card.getName()); int[] distances = matrix[col]; - int max = (Integer) Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); + int max = Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); if (max>0) { List> deckPool=new ArrayList<>(); for(int k=0;k evaluator; - private FilterOption(String name0, Class type0, FilterOperator[] operatorOptions0, FilterEvaluator evaluator0) { + FilterOption(String name0, Class type0, FilterOperator[] operatorOptions0, FilterEvaluator evaluator0) { name = name0; type = type0; operatorOptions = operatorOptions0; @@ -680,7 +680,7 @@ public class AdvancedSearch { private final FilterValueCount valueCount; private final OperatorEvaluator evaluator; - private FilterOperator(String caption0, String formatStr0, FilterValueCount valueCount0, OperatorEvaluator evaluator0) { + FilterOperator(String caption0, String formatStr0, FilterValueCount valueCount0, OperatorEvaluator evaluator0) { caption = caption0; formatStr = formatStr0; valueCount = valueCount0; @@ -1302,7 +1302,7 @@ public class AdvancedSearch { private final String token; - private Operator(String token0) { + Operator(String token0) { token = token0; } diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java b/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java index e6e202bba64..c4c8c550464 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java @@ -7,7 +7,7 @@ import com.google.common.base.Function; import forge.item.InventoryItem; public class ItemColumnConfig { - public static enum SortState { + public enum SortState { NONE, ASC, DESC diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java index 0280c8ab604..b08cb5247f2 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java @@ -114,7 +114,7 @@ public enum ItemManagerConfig { private Prop imageColumnCount; private Prop viewIndex; - private ItemManagerConfig(final Map cols0, boolean showUniqueCardsOption0, boolean uniqueCardsOnly0, boolean hideFilters0, GroupDef groupBy0, ColumnDef pileBy0, int imageColumnCount0, int viewIndex0) { + ItemManagerConfig(final Map cols0, boolean showUniqueCardsOption0, boolean uniqueCardsOnly0, boolean hideFilters0, GroupDef groupBy0, ColumnDef pileBy0, int imageColumnCount0, int viewIndex0) { cols = cols0; for (ItemColumnConfig colConfig : cols.values()) { colConfig.establishDefaults(); diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java index a55282600a2..4969909ac9d 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java @@ -190,7 +190,7 @@ public final class ItemManagerModel { for (final ItemColumn col : colsToSort) { oneColSorters.add(new ItemPoolSorter( col.getFnSort(), - col.getConfig().getSortState().equals(SortState.ASC) ? true : false)); + col.getConfig().getSortState().equals(SortState.ASC))); } return new Sorter(oneColSorters); diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index b880cf717b6..78a6a894b06 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -28,7 +28,7 @@ import java.util.Map.Entry; */ public final class SItemManagerUtil { /** An enum to encapsulate metadata for the stats/filter objects. */ - public static enum StatTypes implements IHasSkinProp { + public enum StatTypes implements IHasSkinProp { WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.Presets.IS_WHITE, "lblWhitecards"), BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.Presets.IS_BLUE, "lblBluecards"), BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.Presets.IS_BLACK, "lblBlackcards"), @@ -78,7 +78,7 @@ public final class SItemManagerUtil { public final Predicate predicate; public final String label; - private StatTypes(final FSkinProp skinProp0, final Predicate predicate0, final String label0) { + StatTypes(final FSkinProp skinProp0, final Predicate predicate0, final String label0) { skinProp = skinProp0; predicate = predicate0; final Localizer localizer = Localizer.getInstance(); diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraft.java b/forge-gui/src/main/java/forge/limited/BoosterDraft.java index ef22d7b8e76..09d22dca69e 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraft.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraft.java @@ -346,7 +346,7 @@ public class BoosterDraft implements IBoosterDraft { @Override public Deck[] getDecks() { - Deck decks[] = new Deck[7]; + Deck[] decks = new Deck[7]; for (int i = 1; i < N_PLAYERS; i++) { decks[i - 1] = ((LimitedPlayerAI) this.players.get(i)).buildDeck(); } diff --git a/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java index b618dd63c6b..b126ef47b27 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java @@ -44,7 +44,7 @@ public class CardThemedConquestDeckBuilder extends CardThemedDeckBuilder { } numSpellsNeeded = ((Double)Math.floor(targetSize*(getCreaturePercentage()+getSpellPercentage()))).intValue(); numCreaturesToStart = ((Double)Math.ceil(targetSize*(getCreaturePercentage()))).intValue(); - landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue();; + landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue(); if (logColorsToConsole) { System.out.println(keyCard.getName()); System.out.println("Pre Colors: " + colors.toEnumSet().toString()); diff --git a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java index 769e7a34801..1188f0e943b 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java @@ -132,7 +132,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } numSpellsNeeded = ((Double)Math.floor(targetSize*(getCreaturePercentage()+getSpellPercentage()))).intValue(); numCreaturesToStart = ((Double)Math.ceil(targetSize*(getCreaturePercentage()))).intValue(); - landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue();; + landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue(); if (logColorsToConsole) { System.out.println(keyCard.getName()); System.out.println("Pre Colors: " + colors.toEnumSet().toString()); diff --git a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java index 2f52015e1e8..7ce7fbd8828 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java +++ b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java @@ -8,7 +8,7 @@ public enum LimitedPoolType { Chaos("Chaos Draft"); private final String displayName; - private LimitedPoolType(String name) { + LimitedPoolType(String name) { displayName = name; } diff --git a/forge-gui/src/main/java/forge/match/GameLobby.java b/forge-gui/src/main/java/forge/match/GameLobby.java index 9951217dcb3..797ecec2a73 100644 --- a/forge-gui/src/main/java/forge/match/GameLobby.java +++ b/forge-gui/src/main/java/forge/match/GameLobby.java @@ -158,7 +158,7 @@ public abstract class GameLobby implements IHasGameType { public void addSlot() { final int newIndex = getNumberOfSlots(); final LobbySlotType type = allowNetworking ? LobbySlotType.OPEN : LobbySlotType.AI; - addSlot(new LobbySlot(type, null, newIndex, newIndex, false, !allowNetworking, Collections.emptySet())); + addSlot(new LobbySlot(type, null, newIndex, newIndex, false, !allowNetworking, Collections.emptySet())); } protected final void addSlot(final LobbySlot slot) { if (slot == null) { @@ -485,7 +485,7 @@ public abstract class GameLobby implements IHasGameType { return null; } } - schemes = schemePool == null ? Collections.emptyList() : schemePool.toFlatList(); + schemes = schemePool == null ? Collections.emptyList() : schemePool.toFlatList(); } //Planechase @@ -498,7 +498,7 @@ public abstract class GameLobby implements IHasGameType { return null; } } - planes = planePool == null ? Collections.emptyList() : planePool.toFlatList(); + planes = planePool == null ? Collections.emptyList() : planePool.toFlatList(); } //Vanguard diff --git a/forge-gui/src/main/java/forge/match/HostedMatch.java b/forge-gui/src/main/java/forge/match/HostedMatch.java index 7535a28d20f..34919b479c2 100644 --- a/forge-gui/src/main/java/forge/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/match/HostedMatch.java @@ -98,7 +98,7 @@ public class HostedMatch { throw new IllegalArgumentException(); } - this.guis = guis == null ? ImmutableMap.of() : guis; + this.guis = guis == null ? ImmutableMap.of() : guis; final boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL); for (final RegisteredPlayer rp : players) { rp.setRandomFoil(useRandomFoil); @@ -160,7 +160,7 @@ public class HostedMatch { final GameView gameView = getGameView(); humanCount = 0; - final MapOfLists playersPerGui = new HashMapOfLists(CollectionSuppliers.arrayLists()); + final MapOfLists playersPerGui = new HashMapOfLists(CollectionSuppliers.arrayLists()); for (int iPlayer = 0; iPlayer < players.size(); iPlayer++) { final RegisteredPlayer rp = match.getPlayers().get(iPlayer); final Player p = players.get(iPlayer); diff --git a/forge-gui/src/main/java/forge/match/LobbySlot.java b/forge-gui/src/main/java/forge/match/LobbySlot.java index 9deb226fe04..bd33cff83e9 100644 --- a/forge-gui/src/main/java/forge/match/LobbySlot.java +++ b/forge-gui/src/main/java/forge/match/LobbySlot.java @@ -137,7 +137,7 @@ public final class LobbySlot implements Serializable { } public void setAiOptions(final Set aiOptions) { - this.aiOptions = aiOptions == null ? ImmutableSet.of() : ImmutableSet.copyOf(aiOptions); + this.aiOptions = aiOptions == null ? ImmutableSet.of() : ImmutableSet.copyOf(aiOptions); } } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/match/LobbySlotType.java b/forge-gui/src/main/java/forge/match/LobbySlotType.java index 8e764b232b4..2c8e6bce624 100644 --- a/forge-gui/src/main/java/forge/match/LobbySlotType.java +++ b/forge-gui/src/main/java/forge/match/LobbySlotType.java @@ -4,5 +4,5 @@ public enum LobbySlotType { LOCAL, AI, OPEN, - REMOTE; + REMOTE } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/match/LocalLobby.java b/forge-gui/src/main/java/forge/match/LocalLobby.java index ca7b66724ad..f8fa6f7a8e7 100644 --- a/forge-gui/src/main/java/forge/match/LocalLobby.java +++ b/forge-gui/src/main/java/forge/match/LocalLobby.java @@ -3,7 +3,6 @@ package forge.match; import java.util.Collections; import forge.GuiBase; -import forge.ai.AIOption; import forge.interfaces.IGuiGame; public final class LocalLobby extends GameLobby { @@ -15,10 +14,10 @@ public final class LocalLobby extends GameLobby { final String humanName = localName(); final int[] avatarIndices = localAvatarIndices(); - final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, true, Collections.emptySet()); + final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, true, Collections.emptySet()); addSlot(slot0); - final LobbySlot slot1 = new LobbySlot(LobbySlotType.AI, null, avatarIndices[1], 1, false, true, Collections.emptySet()); + final LobbySlot slot1 = new LobbySlot(LobbySlotType.AI, null, avatarIndices[1], 1, false, true, Collections.emptySet()); addSlot(slot1); } diff --git a/forge-gui/src/main/java/forge/match/NextGameDecision.java b/forge-gui/src/main/java/forge/match/NextGameDecision.java index 88e11189c41..52cf84d9b0d 100644 --- a/forge-gui/src/main/java/forge/match/NextGameDecision.java +++ b/forge-gui/src/main/java/forge/match/NextGameDecision.java @@ -3,5 +3,5 @@ package forge.match; public enum NextGameDecision { NEW, CONTINUE, - QUIT; + QUIT } diff --git a/forge-gui/src/main/java/forge/match/input/InputLockUI.java b/forge-gui/src/main/java/forge/match/input/InputLockUI.java index 5b525ee7c69..657f77ec96f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputLockUI.java +++ b/forge-gui/src/main/java/forge/match/input/InputLockUI.java @@ -55,7 +55,7 @@ public class InputLockUI implements Input { } FThreads.invokeInEdtLater(showMessageFromEdt); } - }; + } private final Runnable showMessageFromEdt = new Runnable() { @Override diff --git a/forge-gui/src/main/java/forge/model/CardBlock.java b/forge-gui/src/main/java/forge/model/CardBlock.java index a3893102354..ba8d16b08d9 100644 --- a/forge-gui/src/main/java/forge/model/CardBlock.java +++ b/forge-gui/src/main/java/forge/model/CardBlock.java @@ -181,10 +181,7 @@ public final class CardBlock implements Comparable { if (!this.landSet.equals(other.landSet)) { return false; } - if (!this.name.equals(other.name)) { - return false; - } - return true; + return this.name.equals(other.name); } /* diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index edbe8779551..2e2f04ba571 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -276,7 +276,7 @@ public final class FModel { } else if (s.length() > 1) { if (tList != null) { if (s.contains(":")) { - String k[] = s.split(":"); + String[] k = s.split(":"); tList.add(k[0]); CardType.Constant.pluralTypes.put(k[0], k[1]); } else { diff --git a/forge-gui/src/main/java/forge/model/MetaSet.java b/forge-gui/src/main/java/forge/model/MetaSet.java index 9da30c7dbf7..ee881f7e512 100644 --- a/forge-gui/src/main/java/forge/model/MetaSet.java +++ b/forge-gui/src/main/java/forge/model/MetaSet.java @@ -108,7 +108,7 @@ public class MetaSet { private final String shortHand; public final String descriptiveName; - private MetaSetType(String shortname, String descName) { + MetaSetType(String shortname, String descName) { shortHand = shortname; descriptiveName = descName; } diff --git a/forge-gui/src/main/java/forge/net/OfflineLobby.java b/forge-gui/src/main/java/forge/net/OfflineLobby.java index 18827184027..e8827558e1a 100644 --- a/forge-gui/src/main/java/forge/net/OfflineLobby.java +++ b/forge-gui/src/main/java/forge/net/OfflineLobby.java @@ -2,7 +2,6 @@ package forge.net; import java.util.Collections; -import forge.ai.AIOption; import forge.interfaces.IGuiGame; import forge.match.GameLobby; import forge.match.LobbySlot; @@ -16,10 +15,10 @@ public final class OfflineLobby extends GameLobby { final String humanName = localName(); final int[] avatarIndices = localAvatarIndices(); - final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, false, Collections.emptySet()); + final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, false, Collections.emptySet()); addSlot(slot0); - final LobbySlot slot1 = new LobbySlot(LobbySlotType.OPEN, null, -1, -1, false, false, Collections.emptySet()); + final LobbySlot slot1 = new LobbySlot(LobbySlotType.OPEN, null, -1, -1, false, false, Collections.emptySet()); addSlot(slot1); } diff --git a/forge-gui/src/main/java/forge/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/net/ProtocolMethod.java index b75acdce1cf..e220668832f 100644 --- a/forge-gui/src/main/java/forge/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/net/ProtocolMethod.java @@ -101,23 +101,23 @@ public enum ProtocolMethod { CLIENT(IGameController.class); private final Class toInvoke; - private Mode(final Class toInvoke) { + Mode(final Class toInvoke) { this.toInvoke = toInvoke; } - }; + } private final ProtocolMethod.Mode mode; private final Class returnType; private final Class[] args; - private ProtocolMethod(final ProtocolMethod.Mode mode) { + ProtocolMethod(final ProtocolMethod.Mode mode) { this(mode, Void.TYPE); } - private ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType) { + ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType) { this(mode, returnType, (Class[]) null); } @SafeVarargs - private ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType, final Class ... args) { + ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType, final Class... args) { this.mode = mode; this.returnType = returnType; this.args = args == null ? new Class[] {} : args; diff --git a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java index 93f11d7be96..30d977378a1 100644 --- a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java +++ b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java @@ -231,7 +231,7 @@ final class GameClientHandler extends GameProtocolHandler { if (trackableObject.getTracker() == null) { trackableObject.setTracker(this.tracker); // walk the props - EnumMap props = (EnumMap) trackableObject.getProps(); + EnumMap props = trackableObject.getProps(); if (!(props == null)) { for (Object propObj : props.values()) { updateTrackers(new Object[]{propObj}); diff --git a/forge-gui/src/main/java/forge/net/server/FServerManager.java b/forge-gui/src/main/java/forge/net/server/FServerManager.java index 826dd0ea895..4a17201fd69 100644 --- a/forge-gui/src/main/java/forge/net/server/FServerManager.java +++ b/forge-gui/src/main/java/forge/net/server/FServerManager.java @@ -223,7 +223,7 @@ public final class FServerManager { NetworkInterface n = NetworkInterface.getByInetAddress(s.getLocalAddress()); Enumeration en = n.getInetAddresses(); while (en.hasMoreElements()) { - InetAddress addr = (InetAddress) en.nextElement(); + InetAddress addr = en.nextElement(); if (addr instanceof Inet4Address) { if (preferIPv6) { continue; diff --git a/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java b/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java index 84c489c40c5..9fd87b8b132 100644 --- a/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java +++ b/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java @@ -4,7 +4,6 @@ import java.util.Collections; import org.apache.commons.lang3.StringUtils; -import forge.ai.AIOption; import forge.interfaces.IGuiGame; import forge.match.GameLobby; import forge.match.LobbySlot; @@ -14,8 +13,8 @@ public final class ServerGameLobby extends GameLobby { public ServerGameLobby() { super(true); - addSlot(new LobbySlot(LobbySlotType.LOCAL, localName(), localAvatarIndices()[0], 0, true, false, Collections.emptySet())); - addSlot(new LobbySlot(LobbySlotType.OPEN, null, -1, 1, false, false, Collections.emptySet())); + addSlot(new LobbySlot(LobbySlotType.LOCAL, localName(), localAvatarIndices()[0], 0, true, false, Collections.emptySet())); + addSlot(new LobbySlot(LobbySlotType.OPEN, null, -1, 1, false, false, Collections.emptySet())); } public int connectPlayer(final String name, final int avatarIndex) { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java index 74048caf5b2..6bff8b41e60 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java @@ -29,10 +29,7 @@ public class ConquestCommander implements InventoryItem, IXmlWritable { @Override public boolean apply(PaperCard pc) { CardRules rules = pc.getRules(); - if (rules.canBeCommander() || rules.getType().isPlaneswalker()) { - return false; //prevent including additional commanders or planeswalkers in starting deck - } - return true; + return !rules.canBeCommander() && !rules.getType().isPlaneswalker(); //prevent including additional commanders or planeswalkers in starting deck } })), false), null); } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java index 8e7bec55fe3..e5878551219 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java @@ -27,7 +27,7 @@ public class ConquestPreferences extends PreferencesStore predicate; private String caption; - private AEtherFilter(final FSkinProp skinProp0, final Predicate predicate0, final String caption0) { + AEtherFilter(final FSkinProp skinProp0, final Predicate predicate0, final String caption0) { skinProp = skinProp0; predicate = predicate0; caption = caption0; @@ -509,8 +509,7 @@ public class ConquestUtil { public boolean apply(PaperCard card) { int cardCmc = card.getRules().getManaCost().getCMC(); if (cardCmc < cmcMin) { return false; } - if (cmcMax != -1 && cardCmc > cmcMax) { return false; } - return true; + return cmcMax == -1 || cardCmc <= cmcMax; } } } diff --git a/forge-gui/src/main/java/forge/player/GamePlayerUtil.java b/forge-gui/src/main/java/forge/player/GamePlayerUtil.java index 448670a30ce..a7a93d85006 100644 --- a/forge-gui/src/main/java/forge/player/GamePlayerUtil.java +++ b/forge-gui/src/main/java/forge/player/GamePlayerUtil.java @@ -17,7 +17,7 @@ import forge.util.MyRandom; import forge.util.gui.SOptionPane; public final class GamePlayerUtil { - private GamePlayerUtil() { }; + private GamePlayerUtil() { } private static final LobbyPlayer guiPlayer = new LobbyPlayerHuman("Human"); public static final LobbyPlayer getGuiPlayer() { diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 02e4ec6c80b..c283bf771e5 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -159,7 +159,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { return PaymentDecision.card(discarded); } - final String type = new String(discardType); + final String type = discardType; final String[] validType = type.split(";"); hand = CardLists.getValidCards(hand, validType, player, source, ability); @@ -860,7 +860,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } if (num == 0) { return PaymentDecision.number(0); - }; + } inp = new InputSelectCardsFromList(controller, num, num, hand, ability); inp.setMessage("Select %d more " + cost.getDescriptiveType() + " card(s) to reveal."); diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index c1e1325af7d..93b4b31678a 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -514,7 +514,7 @@ public class HumanPlay { } } else if (part instanceof CostPutCardToLib) { - int amount = Integer.parseInt(((CostPutCardToLib) part).getAmount()); + int amount = Integer.parseInt(part.getAmount()); final ZoneType from = ((CostPutCardToLib) part).getFrom(); final boolean sameZone = ((CostPutCardToLib) part).isSameZone(); CardCollectionView listView; @@ -562,9 +562,7 @@ public class HumanPlay { } else { // Tainted Specter, Gurzigost, etc. boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "put into library." + orString); - if (!hasPaid) { - return false; - } + return hasPaid; } return true; } @@ -576,7 +574,7 @@ public class HumanPlay { part.payAsDecided(p, pd, sourceAbility); } else if (part instanceof CostGainControl) { - int amount = Integer.parseInt(((CostGainControl)part).getAmount()); + int amount = Integer.parseInt(part.getAmount()); CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), part.getType(), p, source); boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "gain control." + orString); if (!hasPaid) { return false; } diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index d02362f46cc..84c5bd0555d 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -335,7 +335,7 @@ public class HumanPlaySpellAbility { for (final String aVar : announce.split(",")) { final String varName = aVar.trim(); if ("CreatureType".equals(varName)) { - final String choice = pc.chooseSomeType("Creature", ability, CardType.Constant.CREATURE_TYPES, Collections.emptyList()); + final String choice = pc.chooseSomeType("Creature", ability, CardType.Constant.CREATURE_TYPES, Collections.emptyList()); ability.getHostCard().setChosenType(choice); } if ("ChooseNumber".equals(varName)) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index c7fefdc1b5d..16bf87f71b2 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -776,7 +776,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } else { toBottom = game.getCardList(getGui().many("Select cards to be put on the bottom of your library", "Cards to put on the bottom", -1, CardView.getCollection(topN), null)); - topN.removeAll((Collection) toBottom); + topN.removeAll(toBottom); if (topN.isEmpty()) { toTop = null; } else if (topN.size() == 1) { @@ -814,7 +814,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } else { toGrave = game.getCardList(getGui().many("Select cards to be put into the graveyard", "Cards to put in the graveyard", -1, CardView.getCollection(topN), null)); - topN.removeAll((Collection) toGrave); + topN.removeAll(toGrave); if (topN.isEmpty()) { toTop = null; } else if (topN.size() == 1) { @@ -1404,7 +1404,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final boolean call) { final String[] labelsSrc = call ? new String[] { "heads", "tails" } : new String[] { "win the flip", "lose the flip" }; - final ImmutableList.Builder strResults = ImmutableList.builder(); + final ImmutableList.Builder strResults = ImmutableList.builder(); for (int i = 0; i < results.length; i++) { strResults.add(labelsSrc[results[i] ? 0 : 1]); } @@ -1665,8 +1665,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont boolean preselect = FModel.getPreferences() .getPrefBoolean(FPref.UI_PRESELECT_PREVIOUS_ABILITY_ORDER); orderedSAVs = getGui().order("Reorder simultaneous abilities", "Resolve first", 0, 0, - preselect ? Lists.newArrayList() : orderedSAVs, - preselect ? orderedSAVs : Lists.newArrayList(), null, false); + preselect ? Lists.newArrayList() : orderedSAVs, + preselect ? orderedSAVs : Lists.newArrayList(), null, false); } else { orderedSAVs = getGui().order("Select order for simultaneous abilities", "Resolve first", orderedSAVs, null); @@ -1829,10 +1829,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return false; } final Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); - if (priorityPlayer == null || priorityPlayer != player) { - return false; - } - return true; + return priorityPlayer != null && priorityPlayer == player; } @Override @@ -2741,7 +2738,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (final Player player : game.getPlayers()) { if (player.getId() == entity.getKey()) { found = true; - rememberedActions.add(Pair.of((GameEntityView) player.getView(), true)); + rememberedActions.add(Pair.of(player.getView(), true)); break; } } @@ -2749,7 +2746,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (final Card card : cards) { if (card.getId() == entity.getKey()) { found = true; - rememberedActions.add(Pair.of((GameEntityView) card.getView(), false)); + rememberedActions.add(Pair.of(card.getView(), false)); break; } } diff --git a/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java b/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java index 7d48de0651f..17f71d1e6e2 100644 --- a/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java +++ b/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java @@ -12,7 +12,7 @@ import forge.game.player.PlayerView; public class PlayerZoneUpdates implements Iterable, Serializable { private static final long serialVersionUID = 7023549243041119023L; - private final Map updates = Collections.synchronizedMap(Maps.newHashMap()); + private final Map updates = Collections.synchronizedMap(Maps.newHashMap()); public PlayerZoneUpdates() { } diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 342d2184991..7ff4316eb99 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -306,7 +306,7 @@ public final class ForgeConstants { public static final String GRAVEYARD_ORDERING_ALWAYS = "Always"; // Set boolean constant for landscape mode for gdx port - public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini") ? true : false; + public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini"); public enum CounterDisplayLocation { diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index d4a35b4db97..9aa8e691bd0 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -240,7 +240,7 @@ public class ForgePreferences extends PreferencesStore { private final String strDefaultVal; - private FPref(final String s0) { + FPref(final String s0) { this.strDefaultVal = s0; } diff --git a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java index 25a8dbce4dd..17711e08509 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java +++ b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java @@ -74,7 +74,7 @@ public class ForgeProfileProperties { cardPicsDir = getDir(props, CARD_PICS_DIR_KEY, cacheDir + "pics" + File.separator + "cards" + File.separator); cardPicsSubDirs = getMap(props, CARD_PICS_SUB_DIRS_KEY); decksDir = getDir(props, DECKS_DIR_KEY, userDir + "decks" + File.separator); - decksConstructedDir = getDir(props, DECKS_CONSTRUCTED_DIR_KEY, decksDir + "constructed" + File.separator);; + decksConstructedDir = getDir(props, DECKS_CONSTRUCTED_DIR_KEY, decksDir + "constructed" + File.separator); serverPort = getInt(props, SERVER_PORT_KEY, 36743); // "Forge" using phone keypad //ensure directories exist diff --git a/forge-gui/src/main/java/forge/puzzle/Puzzle.java b/forge-gui/src/main/java/forge/puzzle/Puzzle.java index b513fc0732a..39904881b7e 100644 --- a/forge-gui/src/main/java/forge/puzzle/Puzzle.java +++ b/forge-gui/src/main/java/forge/puzzle/Puzzle.java @@ -222,6 +222,6 @@ public class Puzzle extends GameState implements InventoryItem, Comparable sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); + private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); private final IStorage allDuels; /** diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java index 0fdc9660461..eadd2ed28d4 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java @@ -42,7 +42,7 @@ import java.util.List; public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface { private List archetypes; - private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); + private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); private GameFormat baseFormat; public QuestEventLDADuelManager(GameFormat baseFormat){ diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java index 024fd3c56bc..91b008abbd4 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java @@ -25,9 +25,9 @@ public abstract class QuestRewardCard implements IQuestRewardCard { if (s.startsWith("desc:") || s.startsWith("Desc:")) { final String[] tmp = s.split(":"); if (tmp.length > 1) { - buildDesc = new String(tmp[1]); + buildDesc = tmp[1]; } else { - buildDesc = new String(); + buildDesc = ""; } } else if (buildDesc != null) { if (s.contains(":")) { diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 46ab8eda6fa..63be897d389 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -677,7 +677,7 @@ public class QuestUtil { } public static String getDeckConformanceProblems(Deck deck){ - String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java index d7881334f57..3e6a5d0fe29 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java @@ -130,7 +130,7 @@ public class QuestUtilUnlockSets { * * @return unmodifiable list, assorted sets that are not currently in the format. */ - private static final List emptyEditions = ImmutableList.of(); + private static final List emptyEditions = ImmutableList.of(); private static final EnumSet unlockableSetTypes = EnumSet.of(CardEdition.Type.CORE, CardEdition.Type.EXPANSION, CardEdition.Type.REPRINT, CardEdition.Type.STARTER); diff --git a/forge-gui/src/main/java/forge/quest/SellRules.java b/forge-gui/src/main/java/forge/quest/SellRules.java index 8d8ca9e8d45..36de28da65f 100644 --- a/forge-gui/src/main/java/forge/quest/SellRules.java +++ b/forge-gui/src/main/java/forge/quest/SellRules.java @@ -60,11 +60,7 @@ public class SellRules { if (quest.getWin() < minWins) { return false; } - if (quest.getDifficulty() < minDifficulty || quest.getDifficulty() > maxDifficulty) { - return false; - } - - return true; + return quest.getDifficulty() >= minDifficulty && quest.getDifficulty() <= maxDifficulty; } /** diff --git a/forge-gui/src/main/java/forge/quest/StartingPoolType.java b/forge-gui/src/main/java/forge/quest/StartingPoolType.java index 513a49f1da0..dc1bd6dbe3c 100644 --- a/forge-gui/src/main/java/forge/quest/StartingPoolType.java +++ b/forge-gui/src/main/java/forge/quest/StartingPoolType.java @@ -12,7 +12,7 @@ public enum StartingPoolType { private final String caption; - private StartingPoolType(String caption0) { + StartingPoolType(String caption0) { caption = caption0; } diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java index 86ac871228b..07cb6165f9e 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java @@ -53,8 +53,8 @@ public enum QuestItemType { private final Class bazaarControllerClass; private final Class modelClass; - private QuestItemType(final String key, final Class controllerClass0, - final Class modelClass0) { + QuestItemType(final String key, final Class controllerClass0, + final Class modelClass0) { this.saveFileKey = key; this.bazaarControllerClass = controllerClass0; this.modelClass = modelClass0; diff --git a/forge-gui/src/main/java/forge/quest/data/StarRating.java b/forge-gui/src/main/java/forge/quest/data/StarRating.java index 37f5f30213b..1c91b4ed4d7 100644 --- a/forge-gui/src/main/java/forge/quest/data/StarRating.java +++ b/forge-gui/src/main/java/forge/quest/data/StarRating.java @@ -44,10 +44,6 @@ public class StarRating { return false; } - if (rating != other.rating) { - return false; - } - - return true; + return rating == other.rating; } } diff --git a/forge-gui/src/main/java/forge/sound/EventVisualizer.java b/forge-gui/src/main/java/forge/sound/EventVisualizer.java index 057293b7e60..0f2cc2c71fd 100644 --- a/forge-gui/src/main/java/forge/sound/EventVisualizer.java +++ b/forge-gui/src/main/java/forge/sound/EventVisualizer.java @@ -301,7 +301,7 @@ public class EventVisualizer extends IGameEventVisitor.Base imp if (null != c) { effect = c.getSVar("SoundEffect"); } - return effect.isEmpty() ? false : true; + return !effect.isEmpty(); } diff --git a/forge-gui/src/main/java/forge/sound/IAudioClip.java b/forge-gui/src/main/java/forge/sound/IAudioClip.java index 1fc08bb123c..479eccc4da3 100644 --- a/forge-gui/src/main/java/forge/sound/IAudioClip.java +++ b/forge-gui/src/main/java/forge/sound/IAudioClip.java @@ -1,8 +1,8 @@ package forge.sound; public interface IAudioClip { - public void play(); - public boolean isDone(); - public void stop(); - public void loop(); + void play(); + boolean isDone(); + void stop(); + void loop(); } diff --git a/forge-gui/src/main/java/forge/sound/MusicPlaylist.java b/forge-gui/src/main/java/forge/sound/MusicPlaylist.java index c5cbbb3d1ea..d5acc57718d 100644 --- a/forge-gui/src/main/java/forge/sound/MusicPlaylist.java +++ b/forge-gui/src/main/java/forge/sound/MusicPlaylist.java @@ -14,7 +14,7 @@ public enum MusicPlaylist { private int mostRecentTrackIdx = -1; private String[] filenames; - private MusicPlaylist(String subDir0) { + MusicPlaylist(String subDir0) { subDir = subDir0; } diff --git a/forge-gui/src/main/java/forge/tournament/TournamentData.java b/forge-gui/src/main/java/forge/tournament/TournamentData.java index 66c76ffd74e..c045179161f 100644 --- a/forge-gui/src/main/java/forge/tournament/TournamentData.java +++ b/forge-gui/src/main/java/forge/tournament/TournamentData.java @@ -57,7 +57,7 @@ public class TournamentData { public void stamp() { final DateFormat dateFormat = new SimpleDateFormat("MM-dd-yy, H:m"); - timestamp = dateFormat.format(new Date()).toString(); + timestamp = dateFormat.format(new Date()); } /** Resets a Tournament data to an unplayed state, then stamps and saves. */ diff --git a/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java b/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java index a49c54fae00..31c9ae300ff 100644 --- a/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java +++ b/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java @@ -57,7 +57,7 @@ public class TournamentSwiss extends AbstractTournament { if (byePlayer != null) { groupPlayers.remove(byePlayer); - TournamentPairing byePair = new TournamentPairing(activeRound, Lists.newArrayList(byePlayer)); + TournamentPairing byePair = new TournamentPairing(activeRound, Lists.newArrayList(byePlayer)); byePair.setBye(true); activePairings.add(byePair); } diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index fa08293340f..cf219331dc8 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -118,7 +118,7 @@ public abstract class ImageFetcher { protected abstract Runnable getDownloadTask(String[] toArray, String destPath, Runnable notifyObservers); - public static interface Callback { - public void onImageFetched(); + public interface Callback { + void onImageFetched(); } } \ No newline at end of file From a4d34bb85894199fbbc7112a4ba3b0882cfd6238 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 3 Sep 2019 11:20:10 +0800 Subject: [PATCH 12/68] Retained some schemas --- .../java/forge/ai/AiAttackController.java | 12 +- .../src/main/java/forge/ai/AiController.java | 18 +- .../src/main/java/forge/ai/ComputerUtil.java | 46 +++-- .../main/java/forge/ai/ComputerUtilCard.java | 10 +- .../java/forge/ai/ComputerUtilCombat.java | 31 ++-- .../main/java/forge/ai/ComputerUtilMana.java | 16 +- .../src/main/java/forge/ai/SpecialCardAi.java | 39 ++-- .../main/java/forge/ai/SpellAbilityAi.java | 5 +- .../main/java/forge/ai/ability/AnimateAi.java | 9 +- .../java/forge/ai/ability/CountersMoveAi.java | 12 +- .../forge/ai/ability/CountersMultiplyAi.java | 15 +- .../java/forge/ai/ability/CountersPutAi.java | 18 +- .../java/forge/ai/ability/DamageAllAi.java | 16 +- .../java/forge/ai/ability/DamageDealAi.java | 5 +- .../main/java/forge/ai/ability/DestroyAi.java | 8 +- .../java/forge/ai/ability/DestroyAllAi.java | 15 +- .../main/java/forge/ai/ability/DrawAi.java | 24 ++- .../main/java/forge/ai/ability/FightAi.java | 14 +- .../java/forge/ai/ability/FlipACoinAi.java | 4 +- .../ai/ability/LifeExchangeVariantAi.java | 4 +- .../java/forge/ai/ability/LifeGainAi.java | 8 +- .../java/forge/ai/ability/LifeLoseAi.java | 8 +- .../java/forge/ai/ability/ManifestAi.java | 8 +- .../forge/ai/ability/PeekAndRevealAi.java | 6 +- .../main/java/forge/ai/ability/PoisonAi.java | 14 +- .../main/java/forge/ai/ability/RevealAi.java | 6 +- .../java/forge/ai/ability/SetStateAi.java | 5 +- forge-core/src/main/java/forge/ImageKeys.java | 4 +- .../src/main/java/forge/LobbyPlayer.java | 9 +- .../src/main/java/forge/card/CardType.java | 5 +- .../main/java/forge/deck/DeckRecognizer.java | 5 +- .../src/main/java/forge/item/PaperCard.java | 6 +- .../java/forge/game/combat/CombatUtil.java | 6 +- .../java/forge/game/cost/CostDiscard.java | 8 +- .../java/forge/game/cost/CostPayLife.java | 6 +- .../main/java/forge/game/player/Player.java | 10 +- .../forge/game/player/PlayerProperty.java | 172 +++++++++++++----- .../game/replacement/ReplaceAddCounter.java | 4 +- .../game/replacement/ReplaceCounter.java | 4 +- .../game/replacement/ReplaceDestroy.java | 4 +- .../game/replacement/ReplaceDiscard.java | 4 +- .../forge/game/replacement/ReplaceDraw.java | 8 +- .../game/replacement/ReplaceDrawCards.java | 4 +- .../game/replacement/ReplaceGainLife.java | 4 +- .../game/replacement/ReplaceGameLoss.java | 4 +- .../forge/game/replacement/ReplaceMoved.java | 4 +- .../game/replacement/ReplaceProduceMana.java | 4 +- .../game/replacement/ReplaceSetInMotion.java | 4 +- .../game/replacement/ReplaceSurveil.java | 4 +- .../forge/game/replacement/ReplaceToken.java | 4 +- .../game/replacement/ReplaceTurnFaceUp.java | 4 +- .../forge/game/replacement/ReplaceUntap.java | 4 +- .../forge/game/spellability/SpellAbility.java | 5 +- .../spellability/SpellAbilityCondition.java | 4 +- .../spellability/SpellAbilityRestriction.java | 22 ++- .../game/staticability/StaticAbility.java | 12 +- .../StaticAbilityCantAttach.java | 4 +- .../StaticAbilityCantAttackBlock.java | 4 +- .../StaticAbilityCantBeCast.java | 20 +- .../StaticAbilityCantPutCounter.java | 22 ++- .../main/java/forge/game/trigger/Trigger.java | 22 ++- .../forge/game/trigger/TriggerAbandoned.java | 6 +- .../java/forge/game/trigger/TriggerAdapt.java | 6 +- .../forge/game/trigger/TriggerAttached.java | 4 +- .../game/trigger/TriggerAttackerBlocked.java | 4 +- .../TriggerAttackerBlockedByCreature.java | 8 +- .../trigger/TriggerAttackerUnblocked.java | 6 +- .../trigger/TriggerAttackerUnblockedOnce.java | 6 +- .../trigger/TriggerAttackersDeclared.java | 4 +- .../forge/game/trigger/TriggerAttacks.java | 4 +- .../game/trigger/TriggerBecomeMonarch.java | 6 +- .../game/trigger/TriggerBecomeMonstrous.java | 6 +- .../game/trigger/TriggerBecomeRenowned.java | 6 +- .../game/trigger/TriggerBecomesTarget.java | 4 +- .../trigger/TriggerBecomesTargetOnce.java | 4 +- .../forge/game/trigger/TriggerBlocks.java | 4 +- .../forge/game/trigger/TriggerChampioned.java | 6 +- .../trigger/TriggerChangesController.java | 6 +- .../forge/game/trigger/TriggerClashed.java | 4 +- .../game/trigger/TriggerCounterAdded.java | 4 +- .../game/trigger/TriggerCounterAddedOnce.java | 6 +- .../game/trigger/TriggerCounterRemoved.java | 4 +- .../trigger/TriggerCounterRemovedOnce.java | 4 +- .../forge/game/trigger/TriggerCountered.java | 4 +- .../game/trigger/TriggerDamageDealtOnce.java | 4 +- .../game/trigger/TriggerDamageDoneOnce.java | 4 +- .../forge/game/trigger/TriggerDestroyed.java | 4 +- .../forge/game/trigger/TriggerDiscarded.java | 4 +- .../java/forge/game/trigger/TriggerDrawn.java | 6 +- .../forge/game/trigger/TriggerExiled.java | 6 +- .../forge/game/trigger/TriggerExploited.java | 6 +- .../game/trigger/TriggerFlippedCoin.java | 4 +- .../forge/game/trigger/TriggerHandler.java | 4 +- .../game/trigger/TriggerInvestigated.java | 4 +- .../forge/game/trigger/TriggerLandPlayed.java | 4 +- .../forge/game/trigger/TriggerLifeGained.java | 4 +- .../forge/game/trigger/TriggerLifeLost.java | 4 +- .../trigger/TriggerPayCumulativeUpkeep.java | 6 +- .../forge/game/trigger/TriggerPayEcho.java | 6 +- .../forge/game/trigger/TriggerPhaseOut.java | 10 +- .../forge/game/trigger/TriggerPlanarDice.java | 4 +- .../game/trigger/TriggerRegenerated.java | 4 +- .../forge/game/trigger/TriggerRevealed.java | 4 +- .../forge/game/trigger/TriggerSacrificed.java | 3 +- .../game/trigger/TriggerSearchedLibrary.java | 4 +- .../game/trigger/TriggerSetInMotion.java | 8 +- .../forge/game/trigger/TriggerShuffled.java | 4 +- .../game/trigger/TriggerSpellAbilityCast.java | 4 +- .../game/trigger/TriggerSpellAbilityCopy.java | 6 +- .../forge/game/trigger/TriggerSurveil.java | 4 +- .../java/forge/game/trigger/TriggerTaps.java | 8 +- .../game/trigger/TriggerTapsForMana.java | 4 +- .../forge/game/trigger/TriggerUnattach.java | 6 +- .../forge/game/trigger/TriggerUntaps.java | 6 +- .../java/forge/achievement/VariantWins.java | 4 +- .../java/forge/card/CardScriptParser.java | 5 +- .../src/main/java/forge/model/CardBlock.java | 5 +- .../src/main/java/forge/player/HumanPlay.java | 4 +- .../java/forge/quest/data/StarRating.java | 6 +- 119 files changed, 783 insertions(+), 292 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 35b2d140432..fa658e72bbe 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -602,7 +602,12 @@ public class AiAttackController { return true; } - return totalPoisonDamage >= 10 - opp.getPoisonCounters(); + if (totalPoisonDamage >= 10 - opp.getPoisonCounters()) { + return true; + } + + return false; + } private final GameEntity chooseDefender(final Combat c, final boolean bAssault) { @@ -1450,7 +1455,10 @@ public class AiAttackController { if (color != null) { return color; } - return artifact;//should never get here + if (artifact != null) { + return artifact; + } + return null;//should never get here } private void doLightmineFieldAttackLogic(List attackersLeft, int numForcedAttackers, boolean playAggro) { diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 3a10b030309..f9a6de01010 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1516,9 +1516,13 @@ public class AiController { // Hopefully there's not much to do with the extra mana immediately, can wait for Main 2 return true; } - // Might need an extra land to cast something, or for some kind of an ETB ability with a cost or an - // alternative cost (if we cast it in Main 1), or to use an activated ability on the battlefield - return (predictedMana > totalCMCInHand || !canCastWithLandDrop) && (!hasRelevantAbsOTB || isTapLand) && !hasLandBasedEffect; + if ((predictedMana <= totalCMCInHand && canCastWithLandDrop) || (hasRelevantAbsOTB && !isTapLand) || hasLandBasedEffect) { + // Might need an extra land to cast something, or for some kind of an ETB ability with a cost or an + // alternative cost (if we cast it in Main 1), or to use an activated ability on the battlefield + return false; + } + + return true; } private final SpellAbility getSpellAbilityToPlay() { @@ -1637,8 +1641,12 @@ public class AiController { return SpellApiToAi.Converter.get(spell.getApi()).doTriggerAI(player, spell, mandatory); if (spell instanceof WrappedAbility) return doTrigger(((WrappedAbility)spell).getWrappedAbility(), mandatory); - // For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about - return spell.getPayCosts() == Cost.Zero && spell.getTargetRestrictions() == null; + if (spell.getPayCosts() == Cost.Zero && spell.getTargetRestrictions() == null) { + // For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about + return true; + } + + return false; } /** diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index ffc4d8815dd..b21cc4435e4 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -795,7 +795,11 @@ public class ComputerUtil { return true; } - return ComputerUtilCard.hasActiveUndyingOrPersist(c); + if (ComputerUtilCard.hasActiveUndyingOrPersist(c)) { + return true; + } + + return false; } }); } @@ -1155,25 +1159,30 @@ public class ComputerUtil { final int highestCMC = Math.max(6, Aggregates.max(nonLandsInHand, CardPredicates.Accessors.fnGetCmc)); final int discardCMC = discard.getCMC(); if (discard.isLand()) { - // Don't need more land. - return landsInPlay.size() >= highestCMC + if (landsInPlay.size() >= highestCMC || (landsInPlay.size() + landsInHand.size() > 6 && landsInHand.size() > 1) - || (landsInPlay.size() > 3 && nonLandsInHand.size() == 0); + || (landsInPlay.size() > 3 && nonLandsInHand.size() == 0)) { + // Don't need more land. + return true; + } } else { //non-land if (discardCMC > landsInPlay.size() + landsInHand.size() + 2) { // not castable for some time. return true; - } else // Probably don't need small stuff now. - if (!game.getPhaseHandler().isPlayerTurn(ai) + } else if (!game.getPhaseHandler().isPlayerTurn(ai) && game.getPhaseHandler().getPhase().isAfter(PhaseType.MAIN2) && discardCMC > landsInPlay.size() + landsInHand.size() && discardCMC > landsInPlay.size() + 1 && nonLandsInHand.size() > 1) { // not castable for at least one other turn. return true; - } else return landsInPlay.size() > 5 && discard.getCMC() <= 1 - && !discard.hasProperty("hasXCost", ai, null, null); + } else if (landsInPlay.size() > 5 && discard.getCMC() <= 1 + && !discard.hasProperty("hasXCost", ai, null, null)) { + // Probably don't need small stuff now. + return true; + } } + return false; } // returns true if it's better to wait until blockers are declared @@ -1914,12 +1923,16 @@ public class ComputerUtil { if (predictThreatenedObjects(ai, null).contains(source)) { return true; } - return game.getPhaseHandler().inCombat() && - ComputerUtilCombat.combatantWouldBeDestroyed(ai, source, game.getCombat()); + if (game.getPhaseHandler().inCombat() && + ComputerUtilCombat.combatantWouldBeDestroyed(ai, source, game.getCombat())) { + return true; + } } else if (zone.getZoneType() == ZoneType.Exile && sa.getMayPlay() != null) { // play cards in exile that can only be played that turn if (game.getPhaseHandler().getPhase() == PhaseType.MAIN2) { - return source.mayPlay(sa.getMayPlay()) != null; + if (source.mayPlay(sa.getMayPlay()) != null) { + return true; + } } } return false; @@ -2847,8 +2860,10 @@ public class ComputerUtil { return false; } else if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "LoseLife"))) { return false; - } else return !Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "LichDraw")); - + } else if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "LichDraw"))) { + return false; + } + return true; } public static boolean lifegainNegative(final Player player, final Card source) { @@ -3046,7 +3061,10 @@ public class ComputerUtil { if ((serious) && (ComputerUtilCombat.lifeInSeriousDanger(ai, combat, payment))) { return true; } - return (!serious) && (ComputerUtilCombat.lifeInDanger(ai, combat, payment)); + if ((!serious) && (ComputerUtilCombat.lifeInDanger(ai, combat, payment))) { + return true; + } + return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index b00dccd66b5..21197757d99 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1742,14 +1742,20 @@ public class ComputerUtilCard { if (!c.isCreature()) { return false; } - return c.hasKeyword("CARDNAME can't attack or block.") || (c.hasKeyword("CARDNAME doesn't untap during your untap step.") && c.isTapped()) || (c.getOwner() == ai && ai.getOpponents().contains(c.getController())); + if (c.hasKeyword("CARDNAME can't attack or block.") || (c.hasKeyword("CARDNAME doesn't untap during your untap step.") && c.isTapped()) || (c.getOwner() == ai && ai.getOpponents().contains(c.getController()))) { + return true; + } + return false; } public static boolean hasActiveUndyingOrPersist(final Card c) { if (c.hasKeyword(Keyword.UNDYING) && c.getCounters(CounterType.P1P1) == 0) { return true; } - return c.hasKeyword(Keyword.PERSIST) && c.getCounters(CounterType.M1M1) == 0; + if (c.hasKeyword(Keyword.PERSIST) && c.getCounters(CounterType.M1M1) == 0) { + return true; + } + return false; } public static boolean isPresentOnBattlefield(final Game game, final String cardName) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 5c56a8f84a6..9c030f3a2d4 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -879,18 +879,19 @@ public class ComputerUtilCombat { } else if (mode == TriggerType.DamageDone) { willTrigger = true; if (trigParams.containsKey("ValidSource")) { - if (CardTraitBase.matchesValid(defender, trigParams.get("ValidSource").split(","), source) + if (!(CardTraitBase.matchesValid(defender, trigParams.get("ValidSource").split(","), source) && defender.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(attacker, trigParams.get("ValidTarget").split(","), source))) { - return true; + || CardTraitBase.matchesValid(attacker, trigParams.get("ValidTarget").split(","), source)))) { + return false; } - return CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), source) + if (!(CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), source) && attacker.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(defender, trigParams.get("ValidTarget").split(","), source)); + || CardTraitBase.matchesValid(defender, trigParams.get("ValidTarget").split(","), source)))) { + return false; + } } - return false; } return willTrigger; @@ -1789,7 +1790,11 @@ public class ComputerUtilCombat { } // all damage will be prevented - return attacker.hasKeyword("PreventAllDamageBy Creature.blockingSource"); + if (attacker.hasKeyword("PreventAllDamageBy Creature.blockingSource")) { + return true; + } + + return false; } // can the blocker destroy the attacker? @@ -1912,7 +1917,9 @@ public class ComputerUtilCombat { return false; } } - return attackerLife <= 2 * defenderDamage; + if (attackerLife <= 2 * defenderDamage) { + return true; + } } // defender double strike else { // no double strike for defender @@ -1936,7 +1943,7 @@ public class ComputerUtilCombat { return defenderDamage >= attackerLife; } // defender no double strike - // should never arrive here + return false;// should never arrive here } // canDestroyAttacker // For AI safety measures like Regeneration @@ -2157,7 +2164,9 @@ public class ComputerUtilCombat { return false; } } - return defenderLife <= 2 * attackerDamage; + if (defenderLife <= 2 * attackerDamage) { + return true; + } } // attacker double strike else { // no double strike for attacker @@ -2181,7 +2190,7 @@ public class ComputerUtilCombat { return attackerDamage >= defenderLife; } // attacker no double strike - // should never arrive here + return false;// should never arrive here } // canDestroyBlocker diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 5ac65671de7..8e9c0f84e2d 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -880,10 +880,12 @@ public class ComputerUtilMana { // For combat tricks, always obey mana reservation if (curPhase == PhaseType.COMBAT_DECLARE_BLOCKERS || curPhase == PhaseType.CLEANUP) { - AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK); - } else if (!(ai.getGame().getPhaseHandler().isPlayerTurn(ai)) && (curPhase == PhaseType.COMBAT_DECLARE_BLOCKERS || curPhase == PhaseType.CLEANUP)) { - AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK); - AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + if (!(ai.getGame().getPhaseHandler().isPlayerTurn(ai))) { + AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK); + AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + } + else + AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK); } else { if ((AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK)) || (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK))) { @@ -905,8 +907,10 @@ public class ComputerUtilMana { AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2); } else { - // This mana source is held elsewhere for a Main Phase 2 spell. - return AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2); + if (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2)) { + // This mana source is held elsewhere for a Main Phase 2 spell. + return true; + } } return false; diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 6124365e7f8..27700e2455b 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -377,12 +377,15 @@ public class SpecialCardAi { // Already enough to kill the blockers and survive, don't overpump return false; } - // Can't kill or cripple anyone, as well as can't Trample over, so don't pump - return !oppCantDie || source.hasKeyword(Keyword.TRAMPLE) || source.hasKeyword(Keyword.WITHER) - || source.hasKeyword(Keyword.INFECT) || predictedPT.getLeft() > oppT; + if (oppCantDie && !source.hasKeyword(Keyword.TRAMPLE) && !source.hasKeyword(Keyword.WITHER) + && !source.hasKeyword(Keyword.INFECT) && predictedPT.getLeft() <= oppT) { + // Can't kill or cripple anyone, as well as can't Trample over, so don't pump + return false; + } // If we got here, it should be a favorable combat pump, resulting in at least one // opposing creature dying, and hopefully with the Pummeler surviving combat. + return true; } public static boolean predictOverwhelmingDamage(final Player ai, final SpellAbility sa) { @@ -471,13 +474,15 @@ public class SpecialCardAi { } if (isExileMode) { - // We probably need a low-CMC card to exile to it, exiling a higher CMC spell may be suboptimal - // since the AI does not prioritize/value cards vs. permission at the moment. if (blueCards.size() < 2) { // Need to have something else in hand that is blue in addition to Force of Will itself, // otherwise the AI will fail to play the card and the card will disappear from the pool return false; - } else return !CardLists.filter(blueCards, CardPredicates.lessCMC(3)).isEmpty(); + } else if (CardLists.filter(blueCards, CardPredicates.lessCMC(3)).isEmpty()) { + // We probably need a low-CMC card to exile to it, exiling a higher CMC spell may be suboptimal + // since the AI does not prioritize/value cards vs. permission at the moment. + return false; + } } return true; @@ -891,13 +896,15 @@ public class SpecialCardAi { } } else if (blackViseOTB && computerHandSize + exiledWithNecro - 1 >= 4) { // try not to overdraw in presence of Black Vise - return false; - } else // Only activate in AI's own turn (sans the exception above) - if (computerHandSize + exiledWithNecro - 1 >= maxHandSize) { + return false; + } else if (computerHandSize + exiledWithNecro - 1 >= maxHandSize) { // Only draw until we reach max hand size return false; - } else return ph.isPlayerTurn(ai) && ph.is(PhaseType.MAIN2); - + } else if (!ph.isPlayerTurn(ai) || !ph.is(PhaseType.MAIN2)) { + // Only activate in AI's own turn (sans the exception above) + return false; + } + return true; } } @@ -1426,12 +1433,14 @@ public class SpecialCardAi { } else if (blackViseOTB && computerHandSize + 1 > 4) { // try not to overdraw in presence of Black Vise return false; - } else // Only activate in AI's own turn (sans the exception above) - if (computerHandSize + 1 > maxHandSize) { + } else if (computerHandSize + 1 > maxHandSize) { // Only draw until we reach max hand size return false; - } else return ph.isPlayerTurn(ai); - + } else if (!ph.isPlayerTurn(ai)) { + // Only activate in AI's own turn (sans the exception above) + return false; + } + return true; } } diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index b2f95d717fe..d86989d87a8 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -133,7 +133,10 @@ public abstract class SpellAbilityAi { if (!ComputerUtilCost.checkSacrificeCost(ai, cost, source, sa)) { return false; } - return ComputerUtilCost.checkRemoveCounterCost(cost, source, sa); + if (!ComputerUtilCost.checkRemoveCounterCost(cost, source, sa)) { + return false; + } + return true; } /** diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 5270bea95d1..17748584c9f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -117,9 +117,12 @@ public class AnimateAi extends SpellAbilityAi { boolean activateAsPotentialBlocker = sa.hasParam("UntilYourNextTurn") && ai.getGame().getPhaseHandler().getNextTurn() != ai && source.isPermanent(); - return !ph.isPlayerTurn(ai) || ai.getLife() >= 6 || opponent.getLife() <= 6 - || !Iterables.any(opponent.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES) - || sa.hasParam("AILogic") || sa.hasParam("Permanent") || activateAsPotentialBlocker; + if (ph.isPlayerTurn(ai) && ai.getLife() < 6 && opponent.getLife() > 6 + && Iterables.any(opponent.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES) + && !sa.hasParam("AILogic") && !sa.hasParam("Permanent") && !activateAsPotentialBlocker) { + return false; + } + return true; } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java index 7c973b99d45..bf142184a33 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java @@ -327,7 +327,11 @@ public class CountersMoveAi extends SpellAbilityAi { return true; } } - return CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST); + if (CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) { + return true; + } + + return false; } }); @@ -421,7 +425,11 @@ public class CountersMoveAi extends SpellAbilityAi { } // source would leave the game - return !card.hasSVar("EndOfTurnLeavePlay"); + if (!card.hasSVar("EndOfTurnLeavePlay")) { + return true; + } + + return false; } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java index 78dec0f8c0a..b20e99ace3b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java @@ -45,7 +45,10 @@ public class CountersMultiplyAi extends SpellAbilityAi { if (c.getCounters(counterType) <= 0) { return false; } - return c.canReceiveCounters(counterType); + if (!c.canReceiveCounters(counterType)) { + return false; + } + } else { for (Map.Entry e : c.getCounters().entrySet()) { // has negative counter it would double @@ -85,7 +88,11 @@ public class CountersMultiplyAi extends SpellAbilityAi { } } } - return !ComputerUtil.waitForBlocking(sa); + if (ComputerUtil.waitForBlocking(sa)) { + return false; + } + + return true; } @Override @@ -126,7 +133,9 @@ public class CountersMultiplyAi extends SpellAbilityAi { if (c.getCounters(counterType) <= 0) { return false; } - return c.canReceiveCounters(counterType); + if (!c.canReceiveCounters(counterType)) { + return false; + } } return true; 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 30e8e0f8b0f..d139920d0a4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -592,7 +592,11 @@ public class CountersPutAi extends SpellAbilityAi { } } - return !ComputerUtil.waitForBlocking(sa); + if (ComputerUtil.waitForBlocking(sa)) { + return false; + } + + return true; } @Override @@ -1067,8 +1071,10 @@ public class CountersPutAi extends SpellAbilityAi { } int totBlkPower = Aggregates.sum(combat.getBlockers(source), CardPredicates.Accessors.fnGetNetPower); - return source.getNetToughness() <= totBlkPower - && source.getNetToughness() + amount > totBlkPower; + if (source.getNetToughness() <= totBlkPower + && source.getNetToughness() + amount > totBlkPower) { + return true; + } } } else if (combat.isBlocking(source)) { for (Card blocked : combat.getAttackersBlockedBy(source)) { @@ -1079,8 +1085,10 @@ public class CountersPutAi extends SpellAbilityAi { } int totAtkPower = Aggregates.sum(combat.getAttackersBlockedBy(source), CardPredicates.Accessors.fnGetNetPower); - return source.getNetToughness() <= totAtkPower - && source.getNetToughness() + amount > totAtkPower; + if (source.getNetToughness() <= totAtkPower + && source.getNetToughness() + amount > totAtkPower) { + return true; + } } return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java index addba35d061..cbede1c1a11 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java @@ -233,8 +233,12 @@ public class DamageAllAi extends SpellAbilityAi { return true; } - return computerList.isEmpty() || ComputerUtilCard.evaluateCreatureList(computerList) <= ComputerUtilCard - .evaluateCreatureList(humanList); + if (!computerList.isEmpty() && ComputerUtilCard.evaluateCreatureList(computerList) > ComputerUtilCard + .evaluateCreatureList(humanList)) { + return false; + } + + return true; } /** @@ -316,7 +320,11 @@ public class DamageAllAi extends SpellAbilityAi { return true; } - return computerList.isEmpty() || ComputerUtilCard.evaluateCreatureList(computerList) + 50 < ComputerUtilCard - .evaluateCreatureList(humanList); + if (!computerList.isEmpty() && ComputerUtilCard.evaluateCreatureList(computerList) + 50 >= ComputerUtilCard + .evaluateCreatureList(humanList)) { + return false; + } + + return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index c683d8a14bf..f4af5ec56dc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -845,7 +845,10 @@ public class DamageDealAi extends DamageAiBase { if (!positive && !(saMe instanceof AbilitySub)) { return false; } - return urgent || SpellAbilityAi.playReusable(ai, saMe); + if (!urgent && !SpellAbilityAi.playReusable(ai, saMe)) { + return false; + } + return true; } /** diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index b229dd1ca51..69c5bf22fc0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -295,9 +295,11 @@ public class DestroyAi extends SpellAbilityAi { return false; } - return !list.isEmpty() - && CardLists.filterControlledBy(list, ai).isEmpty() - && !CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty(); + if (list.isEmpty() + || !CardLists.filterControlledBy(list, ai).isEmpty() + || CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty()) { + return false; + } } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index 3e36251b077..a84aa9d8643 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -146,7 +146,10 @@ public class DestroyAllAi extends SpellAbilityAi { AiBlockController block = new AiBlockController(ai); block.assignBlockersForCombat(combat); - return ComputerUtilCombat.lifeInSeriousDanger(ai, combat); + if (ComputerUtilCombat.lifeInSeriousDanger(ai, combat)) { + return true; + } + return false; } // only lands involved else if (CardLists.getNotType(opplist, "Land").isEmpty() && CardLists.getNotType(ailist, "Land").isEmpty()) { if (ai.isCardInPlay("Crucible of Worlds") && !opponent.isCardInPlay("Crucible of Worlds") && !opplist.isEmpty()) { @@ -161,9 +164,13 @@ public class DestroyAllAi extends SpellAbilityAi { } } // check if the AI would lose more lands than the opponent would - return ComputerUtilCard.evaluatePermanentList(ailist) <= ComputerUtilCard.evaluatePermanentList(opplist) + 1; + if (ComputerUtilCard.evaluatePermanentList(ailist) > ComputerUtilCard.evaluatePermanentList(opplist) + 1) { + return false; + } } // otherwise evaluate both lists by CMC and pass only if human permanents are more valuable - else return (ComputerUtilCard.evaluatePermanentList(ailist) + 3) < ComputerUtilCard.evaluatePermanentList(opplist); - + else if ((ComputerUtilCard.evaluatePermanentList(ailist) + 3) >= ComputerUtilCard.evaluatePermanentList(opplist)) { + return false; + } + return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java index 5bd958880c1..212f0bbdab6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java @@ -68,7 +68,10 @@ public class DrawAi extends SpellAbilityAi { return false; } - return canLoot(ai, sa); + if (!canLoot(ai, sa)) { + return false; + } + return true; } /* @@ -104,7 +107,11 @@ public class DrawAi extends SpellAbilityAi { } } - return ComputerUtilCost.checkRemoveCounterCost(cost, source, sa); + if (!ComputerUtilCost.checkRemoveCounterCost(cost, source, sa)) { + return false; + } + + return true; } /* @@ -195,7 +202,9 @@ public class DrawAi extends SpellAbilityAi { if (numHand == 0 && numDraw == numDiscard) { return false; // no looting since everything is dumped } - return numHand + numDraw >= numDiscard; // net loss of cards + if (numHand + numDraw < numDiscard) { + return false; // net loss of cards + } } return true; } @@ -477,8 +486,11 @@ public class DrawAi extends SpellAbilityAi { // ability is not targeted if (numCards >= computerLibrarySize) { - return ai.isCardInPlay("Laboratory Maniac"); + if (ai.isCardInPlay("Laboratory Maniac")) { + return true; + } // Don't deck yourself + return false; } if (numCards == 0 && !drawback) { @@ -491,7 +503,9 @@ public class DrawAi extends SpellAbilityAi { && !assumeSafeX) { // Don't draw too many cards and then risk discarding cards at // EOT - return drawback; + if (!drawback) { + return false; + } } } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java index 94549a872b8..9a3b0965c42 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java @@ -273,9 +273,10 @@ public class FightAi extends SpellAbilityAi { if (!canKill(opponent, fighter, -pumpDefense)) { // can survive return true; } else { - // trade - return MyRandom.getRandom().nextInt(20) < (opponent.getCMC() - fighter.getCMC()); - } + if (MyRandom.getRandom().nextInt(20)<(opponent.getCMC() - fighter.getCMC())) { // trade + return true; + } + } } return false; } @@ -288,7 +289,10 @@ public class FightAi extends SpellAbilityAi { || ComputerUtil.canRegenerate(opponent.getController(), opponent)) { return false; } - return fighter.hasKeyword(Keyword.DEATHTOUCH) - || ComputerUtilCombat.getDamageToKill(opponent) <= fighter.getNetPower() + pumpAttack; + if (fighter.hasKeyword(Keyword.DEATHTOUCH) + || ComputerUtilCombat.getDamageToKill(opponent) <= fighter.getNetPower() + pumpAttack) { + return true; + } + return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java b/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java index 2afefc36f03..7d61025c40d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java @@ -20,7 +20,9 @@ public class FlipACoinAi extends SpellAbilityAi { if (AILogic.equals("Never")) { return false; } else if (AILogic.equals("PhaseOut")) { - return ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard()); + if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard())) { + return false; + } } else if (AILogic.equals("KillOrcs")) { if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN) ) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java index a01bcf4ce67..e1432844d01 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java @@ -120,7 +120,9 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { MagicStack stack = game.getStack(); if (!stack.isEmpty()) { SpellAbility saTop = stack.peekAbility(); - return ComputerUtil.predictDamageFromSpell(saTop, ai) >= aiLife; + if (ComputerUtil.predictDamageFromSpell(saTop, ai) >= aiLife) { + return true; + } } } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java index 981c5f10d7b..41751f85882 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java @@ -49,7 +49,9 @@ public class LifeGainAi extends SpellAbilityAi { return false; } - return ComputerUtilCost.checkRemoveCounterCost(cost, source); + if (!ComputerUtilCost.checkRemoveCounterCost(cost, source)) { + return false; + } } else { // don't sac possible blockers if (!ph.getPhase().equals(PhaseType.COMBAT_DECLARE_BLOCKERS) @@ -61,7 +63,9 @@ public class LifeGainAi extends SpellAbilityAi { skipCheck |= ComputerUtilCost.isSacrificeSelfCost(cost) && !source.isCreature(); if (!skipCheck) { - return ComputerUtilCost.checkSacrificeCost(ai, cost, source, sa, false); + if (!ComputerUtilCost.checkSacrificeCost(ai, cost, source, sa,false)) { + return false; + } } } } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java index a4a6a80981f..087261271c2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java @@ -146,8 +146,12 @@ public class LifeLoseAi extends SpellAbilityAi { return false; } - return SpellAbilityAi.isSorcerySpeed(sa) || sa.hasParam("ActivationPhases") || SpellAbilityAi.playReusable(ai, sa) - || ComputerUtil.activateForCost(sa, ai); + if (SpellAbilityAi.isSorcerySpeed(sa) || sa.hasParam("ActivationPhases") || SpellAbilityAi.playReusable(ai, sa) + || ComputerUtil.activateForCost(sa, ai)) { + return true; + } + + return false; } /* diff --git a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java index 947db225886..57e70f7fe58 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java @@ -80,7 +80,9 @@ public class ManifestAi extends SpellAbilityAi { // Set PayX here to maximum value. int x = ComputerUtilMana.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(x)); - return x > 0; + if (x <= 0) { + return false; + } } return true; @@ -119,7 +121,9 @@ public class ManifestAi extends SpellAbilityAi { return false; // card has ETBTrigger or ETBReplacement - return !card.hasETBTrigger(false) && !card.hasETBReplacement(); + if (card.hasETBTrigger(false) || card.hasETBReplacement()) { + return false; + } } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java index 008172bebcc..bd6dedc12ec 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java @@ -24,8 +24,10 @@ public class PeekAndRevealAi extends SpellAbilityAi { return false; } if ("Main2".equals(sa.getParam("AILogic"))) { - return !aiPlayer.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2); - } + if (aiPlayer.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)) { + return false; + } + } // So far this only appears on Triggers, but will expand // once things get converted from Dig + NoMove return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java b/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java index 5161d672432..0eba3082f50 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java @@ -75,10 +75,12 @@ public class PoisonAi extends SpellAbilityAi { } Player max = players.max(PlayerPredicates.compareByPoison()); - // ai is one of the max - return ai.getPoisonCounters() != max.getPoisonCounters(); + if (ai.getPoisonCounters() == max.getPoisonCounters()) { + // ai is one of the max + return false; + } } - + return true; } private boolean tgtPlayer(Player ai, SpellAbility sa, boolean mandatory) { @@ -90,8 +92,10 @@ public class PoisonAi extends SpellAbilityAi { public boolean apply(Player input) { if (input.cantLose()) { return false; - } else return input.canReceiveCounters(CounterType.POISON); - + } else if (!input.canReceiveCounters(CounterType.POISON)) { + return false; + } + return true; } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/RevealAi.java b/forge-ai/src/main/java/forge/ai/ability/RevealAi.java index 7598d45a700..676d706d06b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RevealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RevealAi.java @@ -80,7 +80,11 @@ public class RevealAi extends RevealAiBase { } - return revealHandTargetAI(ai, sa/*, false, mandatory*/); + if (!revealHandTargetAI(ai, sa/*, false, mandatory*/)) { + return false; + } + + return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 408fa9a62a4..79104d062a6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -33,7 +33,10 @@ public class SetStateAi extends SpellAbilityAi { return false; } - return "Transform".equals(mode) || "Flip".equals(mode); + if("Transform".equals(mode) || "Flip".equals(mode)) { + return true; + } + return false; } @Override diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index ee1bca83312..3e5192ba642 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -133,7 +133,7 @@ public final class ImageKeys { // if there's an art variant try without it if (setlessFilename.matches(".*[0-9]*$")) { file = findFile(dir, setlessFilename.replaceAll("[0-9]*$", "")); - return file; + if (file != null) { return file; } } } } else if (filename.contains("/")) { @@ -144,7 +144,7 @@ public final class ImageKeys { // try lowering the art index to the minimum for regular cards if (setlessFilename.contains(".full")) { file = findFile(dir, setlessFilename.replaceAll("[0-9]*[.]full", "1.full")); - return file; + if (file != null) { return file; } } } diff --git a/forge-core/src/main/java/forge/LobbyPlayer.java b/forge-core/src/main/java/forge/LobbyPlayer.java index 171d4e04e96..79139ec3a75 100644 --- a/forge-core/src/main/java/forge/LobbyPlayer.java +++ b/forge-core/src/main/java/forge/LobbyPlayer.java @@ -47,8 +47,13 @@ public abstract class LobbyPlayer { } LobbyPlayer other = (LobbyPlayer) obj; if (name == null) { - return other.name == null; - } else return name.equals(other.name); + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; } public int getAvatarIndex() { diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index f7c85f94bb7..21cd142f63a 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -598,7 +598,10 @@ public final class CardType implements Comparable, CardTypeView { if (multiWordTypes[0].startsWith(type) && !multiWordTypes[0].equals(type)) { return true; } - return multiWordTypes[1].startsWith(type) && !multiWordTypes[1].equals(type); + if (multiWordTypes[1].startsWith(type) && !multiWordTypes[1].equals(type)) { + return true; + } + return false; } public static class Constant { diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index 52d2005fd3f..0cae2a03261 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -216,7 +216,10 @@ public class DeckRecognizer { if (line.toLowerCase().contains("schemes")) { return true; } - return line.toLowerCase().contains("vanguard"); + if (line.toLowerCase().contains("vanguard")) { + return true; + } + return false; } public void setDateConstraint(int month, Integer year) { diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index f69036aa1c9..4200b240e4d 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -159,7 +159,11 @@ public final class PaperCard implements Comparable, InventoryItemFro if (!edition.equals(other.edition)) { return false; } - return (other.foil == foil) && (other.artIndex == artIndex); + if ((other.foil != foil) || (other.artIndex != artIndex)) { + return false; + } + + return true; } /* diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 0273d3a03cb..5f020665993 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -1069,7 +1069,11 @@ public class CombatUtil { return false; } - return !attacker.hasKeyword(Keyword.INTIMIDATE) || blocker.isArtifact() || blocker.sharesColorWith(attacker); + if (attacker.hasKeyword(Keyword.INTIMIDATE) && !blocker.isArtifact() && !blocker.sharesColorWith(attacker)) { + return false; + } + + return true; } // canBlock() public static boolean canAttackerBeBlockedWithAmount(Card attacker, int amount, Combat combat) { diff --git a/forge-game/src/main/java/forge/game/cost/CostDiscard.java b/forge-game/src/main/java/forge/game/cost/CostDiscard.java index b8073001756..517b374b6b8 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDiscard.java +++ b/forge-game/src/main/java/forge/game/cost/CostDiscard.java @@ -149,11 +149,13 @@ public class CostDiscard extends CostPartWithList { } } - // not enough cards in hand to pay - return (amount == null) || (amount <= handList.size() - adjustment); + if ((amount != null) && (amount > handList.size() - adjustment)) { + // not enough cards in hand to pay + return false; + } } } - + return true; } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostPayLife.java b/forge-game/src/main/java/forge/game/cost/CostPayLife.java index 39f59048685..c0394e31bc4 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayLife.java @@ -78,7 +78,11 @@ public class CostPayLife extends CostPart { return false; } - return !payer.hasKeyword("You can't pay life to cast spells or activate abilities."); + if (payer.hasKeyword("You can't pay life to cast spells or activate abilities.")) { + return false; + } + + return true; } @Override diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 9e42220c143..d4214940983 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2476,7 +2476,10 @@ public class Player extends GameEntity implements Comparable { "Skip all combat phases of this turn."); return true; } - return hasKeyword("Skip all combat phases of this turn."); + if (hasKeyword("Skip all combat phases of this turn.")) { + return true; + } + return false; } public boolean isSkippingMain() { @@ -2596,7 +2599,10 @@ public class Player extends GameEntity implements Comparable { removeKeyword("Skip your next draw step."); return true; } - return hasKeyword("Skip your draw step."); + if (hasKeyword("Skip your draw step.")) { + return true; + } + return false; } public CardCollectionView getInboundTokens() { diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 73aebdbd1c0..f1c17abdf59 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -23,9 +23,13 @@ public class PlayerProperty { Game game = player.getGame(); if (property.equals("You")) { - return player.equals(sourceController); + if (!player.equals(sourceController)) { + return false; + } } else if (property.equals("Opponent")) { - return !player.equals(sourceController) && player.isOpponentOf(sourceController); + if (player.equals(sourceController) || !player.isOpponentOf(sourceController)) { + return false; + } } else if (property.startsWith("OpponentOf ")) { final String v = property.split(" ")[1]; final List players = AbilityUtils.getDefinedPlayers(source, v, spellAbility); @@ -35,24 +39,42 @@ public class PlayerProperty { } } } else if (property.equals("YourTeam")) { - return player.sameTeam(sourceController); + if (!player.sameTeam(sourceController)) { + return false; + } } else if (property.equals("Allies")) { - return !player.equals(sourceController) && !player.isOpponentOf(sourceController); + if (player.equals(sourceController) || player.isOpponentOf(sourceController)) { + return false; + } } else if (property.equals("Active")) { - return player.equals(game.getPhaseHandler().getPlayerTurn()); + if (!player.equals(game.getPhaseHandler().getPlayerTurn())) { + return false; + } } else if (property.equals("NonActive")) { - return !player.equals(game.getPhaseHandler().getPlayerTurn()); + if (player.equals(game.getPhaseHandler().getPlayerTurn())) { + return false; + } } else if (property.equals("OpponentToActive")) { final Player active = game.getPhaseHandler().getPlayerTurn(); - return !player.equals(active) && player.isOpponentOf(active); + if (player.equals(active) || !player.isOpponentOf(active)) { + return false; + } } else if (property.equals("Other")) { - return !player.equals(sourceController); + if (player.equals(sourceController)) { + return false; + } } else if (property.equals("OtherThanSourceOwner")) { - return !player.equals(source.getOwner()); + if (player.equals(source.getOwner())) { + return false; + } } else if (property.equals("isMonarch")) { - return player.equals(game.getMonarch()); + if (!player.equals(game.getMonarch())) { + return false; + } } else if (property.equals("hasBlessing")) { - return player.hasBlessing(); + if (!player.hasBlessing()) { + return false; + } } else if (property.startsWith("wasDealtCombatDamageThisCombatBy ")) { String v = property.split(" ")[1]; @@ -69,7 +91,9 @@ public class PlayerProperty { found++; } } - return found >= count; + if (found < count) { + return false; + } } else if (property.startsWith("wasDealtDamageThisGameBy ")) { String v = property.split(" ")[1]; @@ -86,7 +110,9 @@ public class PlayerProperty { found++; } } - return found >= count; + if (found < count) { + return false; + } } else if (property.startsWith("wasDealtDamageThisTurnBy ")) { String v = property.split(" ")[1]; int count = 1; @@ -103,7 +129,9 @@ public class PlayerProperty { found++; } } - return found >= count; + if (found < count) { + return false; + } } else if (property.startsWith("wasDealtCombatDamageThisTurnBy ")) { String v = property.split(" ")[1]; @@ -121,54 +149,90 @@ public class PlayerProperty { found++; } } - return found >= count; + if (found < count) { + return false; + } } else if (property.equals("attackedBySourceThisCombat")) { - return game.getCombat() != null && player.equals(game.getCombat().getDefenderPlayerByAttacker(source)); + if (game.getCombat() == null || !player.equals(game.getCombat().getDefenderPlayerByAttacker(source))) { + return false; + } } else if (property.equals("wasDealtDamageThisTurn")) { - return player.getAssignedDamage() != 0; + if (player.getAssignedDamage() == 0) { + return false; + } } else if (property.equals("wasDealtCombatDamageThisTurn")) { - return player.getAssignedCombatDamage() != 0; + if (player.getAssignedCombatDamage() == 0) { + return false; + } } else if (property.equals("LostLifeThisTurn")) { - return player.getLifeLostThisTurn() > 0; + if (player.getLifeLostThisTurn() <= 0) { + return false; + } } else if (property.equals("DeclaredAttackerThisTurn")) { - return player.getAttackersDeclaredThisTurn() > 0; + if (player.getAttackersDeclaredThisTurn() <= 0) { + return false; + } } else if (property.equals("TappedLandForManaThisTurn")) { - return player.hasTappedLandForManaThisTurn(); + if (!player.hasTappedLandForManaThisTurn()) { + return false; + } } else if (property.equals("NoCardsInHandAtBeginningOfTurn")) { - return player.getNumCardsInHandStartedThisTurnWith() <= 0; + if (player.getNumCardsInHandStartedThisTurnWith() > 0) { + return false; + } } else if (property.equals("CardsInHandAtBeginningOfTurn")) { - return player.getNumCardsInHandStartedThisTurnWith() > 0; + if (player.getNumCardsInHandStartedThisTurnWith() <= 0) { + return false; + } } else if (property.startsWith("WithCardsInHand")) { if (property.contains("AtLeast")) { int amount = Integer.parseInt(property.split("AtLeast")[1]); - return player.getCardsIn(ZoneType.Hand).size() >= amount; + if (player.getCardsIn(ZoneType.Hand).size() < amount) { + return false; + } } } else if (property.equals("IsRemembered")) { - return source.isRemembered(player); + if (!source.isRemembered(player)) { + return false; + } } else if (property.equals("IsNotRemembered")) { - return !source.isRemembered(player); + if (source.isRemembered(player)) { + return false; + } } else if (property.equals("EnchantedBy")) { - return player.isEnchantedBy(source); + if (!player.isEnchantedBy(source)) { + return false; + } } else if (property.equals("Chosen")) { - return source.getChosenPlayer() != null && source.getChosenPlayer().equals(player); + if (source.getChosenPlayer() == null || !source.getChosenPlayer().equals(player)) { + return false; + } } else if (property.startsWith("LifeEquals_")) { int life = AbilityUtils.calculateAmount(source, property.substring(11), null); - return player.getLife() == life; + if (player.getLife() != life) { + return false; + } } else if (property.equals("IsPoisoned")) { - return player.getPoisonCounters() > 0; + if (player.getPoisonCounters() <= 0) { + return false; + } } else if (property.startsWith("controls")) { final String[] type = property.substring(8).split("_"); final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type[0], sourceController, source); String comparator = type[1]; String compareTo = comparator.substring(2); int y = StringUtils.isNumeric(compareTo) ? Integer.parseInt(compareTo) : 0; - return Expressions.compare(list.size(), comparator, y); + if (!Expressions.compare(list.size(), comparator, y)) { + return false; + } } else if (property.startsWith("withMore")) { final String cardType = property.split("sThan")[0].substring(8); final Player controller = "Active".equals(property.split("sThan")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController; final CardCollectionView oppList = CardLists.filter(player.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); final CardCollectionView yourList = CardLists.filter(controller.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); - return oppList.size() > yourList.size(); + if (oppList.size() <= yourList.size()) { + return false; + } } else if (property.startsWith("withAtLeast")) { final String cardType = property.split("More")[1].split("sThan")[0]; final int amount = Integer.parseInt(property.substring(11, 12)); @@ -176,19 +240,25 @@ public class PlayerProperty { final CardCollectionView oppList = CardLists.filter(player.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); final CardCollectionView yourList = CardLists.filter(controller.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); System.out.println(yourList.size()); - return oppList.size() >= yourList.size() + amount; + if (oppList.size() < yourList.size() + amount) { + return false; + } } else if (property.startsWith("hasMore")) { final Player controller = property.contains("Than") && "Active".equals(property.split("Than")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController; if (property.substring(7).startsWith("Life") && player.getLife() <= controller.getLife()) { return false; - } else return !property.substring(7).startsWith("CardsInHand") - || player.getCardsIn(ZoneType.Hand).size() > controller.getCardsIn(ZoneType.Hand).size(); + } else if (property.substring(7).startsWith("CardsInHand") + && player.getCardsIn(ZoneType.Hand).size() <= controller.getCardsIn(ZoneType.Hand).size()) { + return false; + } } else if (property.startsWith("hasFewer")) { final Player controller = "Active".equals(property.split("Than")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController; final ZoneType zt = property.substring(8).startsWith("CreaturesInYard") ? ZoneType.Graveyard : ZoneType.Battlefield; final CardCollectionView oppList = CardLists.filter(player.getCardsIn(zt), Presets.CREATURES); final CardCollectionView yourList = CardLists.filter(controller.getCardsIn(zt), Presets.CREATURES); - return oppList.size() < yourList.size(); + if (oppList.size() >= yourList.size()) { + return false; + } } else if (property.startsWith("withMost")) { final String kind = property.substring(8); if (kind.equals("Life")) { @@ -198,7 +268,9 @@ public class PlayerProperty { highestLife = p.getLife(); } } - return player.getLife() == highestLife; + if (player.getLife() != highestLife) { + return false; + } } else if (kind.equals("PermanentInPlay")) { int typeNum = 0; @@ -214,7 +286,9 @@ public class PlayerProperty { } } - return controlmost.size() == 1 && controlmost.contains(player); + if (controlmost.size() != 1 || !controlmost.contains(player)) { + return false; + } } else if (kind.equals("CardsInHand")) { int largestHand = 0; @@ -225,7 +299,9 @@ public class PlayerProperty { withLargestHand = p; } } - return player.equals(withLargestHand); + if (!player.equals(withLargestHand)) { + return false; + } } else if (kind.startsWith("Type")) { String type = property.split("Type")[1]; @@ -249,7 +325,9 @@ public class PlayerProperty { if (checkOnly && controlmost.size() != 1) { return false; } - return controlmost.contains(player); + if (!controlmost.contains(player)) { + return false; + } } } else if (property.startsWith("withLowest")) { if (property.substring(10).equals("Life")) { @@ -264,14 +342,20 @@ public class PlayerProperty { lowestlifep.add(p); } } - return lowestlifep.contains(player); + if (!lowestlifep.contains(player)) { + return false; + } } } else if (property.startsWith("LessThanHalfStartingLifeTotal")) { - return player.getLife() < (int) Math.ceil(player.getStartingLife() / 2.0); + if (player.getLife() >= (int) Math.ceil(player.getStartingLife() / 2.0)) { + return false; + } } else if (property.startsWith("Triggered")) { - return AbilityUtils.getDefinedPlayers(source, property, spellAbility).contains(player); + if (!AbilityUtils.getDefinedPlayers(source, property, spellAbility).contains(player)) { + return false; + } } return true; } -} +} \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java b/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java index 882dd783bcc..05bf6c1627d 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java @@ -59,7 +59,9 @@ public class ReplaceAddCounter extends ReplacementEffect { if (mapParams.containsKey("ValidCounterType")) { String type = this.getMapParams().get("ValidCounterType"); - return CounterType.getType(type) == runParams.get("CounterType"); + if (CounterType.getType(type) != runParams.get("CounterType")) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java b/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java index e1e92a84ae0..6708d29b7ed 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java @@ -59,7 +59,9 @@ public class ReplaceCounter extends ReplacementEffect { } if (this.getMapParams().containsKey("ValidType")) { String type = this.getMapParams().get("ValidType"); - return !type.equals("Spell") || spellAbility.isSpell(); + if (type.equals("Spell") && !spellAbility.isSpell()) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java index 5aa9da41132..fa61c0e1123 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java @@ -74,7 +74,9 @@ public class ReplaceDestroy extends ReplacementEffect { } } if (hasParam("ValidSource")) { - return matchesValid(runParams.get("Source"), getParam("ValidSource").split(","), getHostCard()); + if (!matchesValid(runParams.get("Source"), getParam("ValidSource").split(","), getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java index 8354cf6418b..20499fc1de2 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java @@ -62,7 +62,9 @@ public class ReplaceDiscard extends ReplacementEffect { } } if (this.getMapParams().containsKey("DiscardFromEffect")) { - return null != runParams.get("Source"); + if (null == runParams.get("Source")) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java index a6547e66d49..4b7b2d80f38 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java @@ -55,9 +55,11 @@ public class ReplaceDraw extends ReplacementEffect { } if (this.getMapParams().containsKey("NotFirstCardInDrawStep")) { final Player p = (Player)runParams.get("Affected"); - return p.numDrawnThisDrawStep() != 0 - || !this.getHostCard().getGame().getPhaseHandler().is(PhaseType.DRAW) - || !this.getHostCard().getGame().getPhaseHandler().isPlayerTurn(p); + if (p.numDrawnThisDrawStep() == 0 + && this.getHostCard().getGame().getPhaseHandler().is(PhaseType.DRAW) + && this.getHostCard().getGame().getPhaseHandler().isPlayerTurn(p)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java index fffc08855ed..30f56eceb9d 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java @@ -57,7 +57,9 @@ public class ReplaceDrawCards extends ReplacementEffect { String comparator = this.getMapParams().get("Number"); final String operator = comparator.substring(0, 2); final int operandValue = Integer.parseInt(comparator.substring(2)); - return Expressions.compare(n, operator, operandValue); + if (!Expressions.compare(n, operator, operandValue)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java b/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java index aa95a7a8862..d269f9c044f 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java @@ -57,7 +57,9 @@ public class ReplaceGainLife extends ReplacementEffect { } } if ("True".equals(this.getMapParams().get("SourceController"))) { - return runParams.get("Source") != null && runParams.get("Affected").equals(((Card) runParams.get("Source")).getController()); + if (runParams.get("Source") == null || !runParams.get("Affected").equals(((Card)runParams.get("Source")).getController())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java index d6cc1b84cf2..298f6cf470b 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java @@ -29,7 +29,9 @@ public class ReplaceGameLoss extends ReplacementEffect { return false; } if (this.getMapParams().containsKey("ValidPlayer")) { - return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard()); + if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java index a7af2db3f2e..162d87bca99 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java @@ -105,7 +105,9 @@ public class ReplaceMoved extends ReplacementEffect { if (runParams.containsKey("Cause")) { SpellAbility cause = (SpellAbility) runParams.get("Cause"); if (cause != null) { - return !cause.isValid(getParam("NotCause").split(","), controller, getHostCard(), null); + if (cause.isValid(getParam("NotCause").split(","), controller, getHostCard(), null)) { + return false; + } } } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java index dc7c218e750..90abfa87fd6 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java @@ -58,7 +58,9 @@ public class ReplaceProduceMana extends ReplacementEffect { } if (this.getMapParams().containsKey("ValidCard")) { - return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard()); + if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java b/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java index 7cfb4413ce8..d4c2c7a2c1f 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java @@ -46,7 +46,9 @@ public class ReplaceSetInMotion extends ReplacementEffect { return false; } if (this.getMapParams().containsKey("ValidPlayer")) { - return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard()); + if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java index 809dd8a00a8..ad6a9478245 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java @@ -31,7 +31,9 @@ public class ReplaceSurveil extends ReplacementEffect { } if (hasParam("ValidPlayer")) { - return matchesValid(runParams.get("Affected"), getParam("ValidPlayer").split(","), getHostCard()); + if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java b/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java index f8b5d4ebe78..d58cd697b4a 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java @@ -45,7 +45,9 @@ public class ReplaceToken extends ReplacementEffect { if (hasParam("ValidToken")) { if (runParams.containsKey("Token")) { - return matchesValid(runParams.get("Token"), getParam("ValidToken").split(","), getHostCard()); + if (!matchesValid(runParams.get("Token"), getParam("ValidToken").split(","), getHostCard())) { + return false; + } } else { // in case RE is not updated yet return false; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java b/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java index 67feac6bdbd..d1d4bbe2845 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java @@ -30,7 +30,9 @@ public class ReplaceTurnFaceUp extends ReplacementEffect { return false; } if (this.getMapParams().containsKey("ValidCard")) { - return matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard()); + if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard())) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java b/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java index 898ec36bfea..d336af27279 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java @@ -63,7 +63,9 @@ public class ReplaceUntap extends ReplacementEffect { final Card card = (Card) o; // all replace untap with untapStep does have "your untap step" final Player player = card.getController(); - return player.getGame().getPhaseHandler().is(PhaseType.UNTAP, player); + if (!player.getGame().getPhaseHandler().is(PhaseType.UNTAP, player)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 2ec5dac8bc2..cfa028365c6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1720,7 +1720,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (isSpell() && text.contains("was spent to cast")) { return true; } - return isAbility() && text.contains("mana spent to pay"); + if (isAbility() && text.contains("mana spent to pay")) { + return true; + } + return false; } public void checkActivationResloveSubs() { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index 80fe9bedd26..c53c34bd3ce 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -444,7 +444,9 @@ public class SpellAbilityCondition extends SpellAbilityVariables { final int svarValue = AbilityUtils.calculateAmount(host, this.getsVarToCheck(), sa); final int operandValue = AbilityUtils.calculateAmount(host, this.getsVarOperand(), sa); - return Expressions.compare(svarValue, this.getsVarOperator(), operandValue); + if (!Expressions.compare(svarValue, this.getsVarOperator(), operandValue)) { + return false; + } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 01c1b2ea326..bc3e6649da4 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -270,7 +270,11 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } // TODO: this is an exception for Aftermath. Needs to be somehow generalized. - return this.getZone() == ZoneType.Graveyard || !sa.isAftermath() || !sa.isRightSplit(); + if (this.getZone() != ZoneType.Graveyard && sa.isAftermath() && sa.isRightSplit()) { + return false; + } + + return true; } } return false; @@ -311,7 +315,9 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } } - return isPhase; + if (!isPhase) { + return false; + } } return true; } @@ -350,7 +356,9 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { if (sa.isSpell()) { final CardPlayOption o = c.mayPlay(sa.getMayPlay()); - return o != null && o.getPlayer() == activator; + if (o != null && o.getPlayer() == activator) { + return true; + } } return false; @@ -507,7 +515,9 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { final int svarValue = AbilityUtils.calculateAmount(sa.getHostCard(), this.getsVarToCheck(), sa); final int operandValue = AbilityUtils.calculateAmount(sa.getHostCard(), this.getsVarOperand(), sa); - return Expressions.compare(svarValue, this.getsVarOperator(), operandValue); + if (!Expressions.compare(svarValue, this.getsVarOperator(), operandValue)) { + return false; + } } return true; } @@ -572,7 +582,9 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { int gameActivationLimit = AbilityUtils.calculateAmount(c, limit, sa); this.setGameActivationLimit(gameActivationLimit); - return (this.getGameActivationLimit() == -1) || (sa.getActivationsThisGame() < this.getGameActivationLimit()); + if ((this.getGameActivationLimit() != -1) && (sa.getActivationsThisGame() >= this.getGameActivationLimit())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index bb4a0f6e37b..d429b7e3d70 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -516,8 +516,12 @@ public class StaticAbility extends CardTraitBase implements Comparable thisTurnCast = CardUtil.getThisTurnCast(valid, card); - return CardLists.filterControlledBy(thisTurnCast, activator).size() >= limit; + if (CardLists.filterControlledBy(thisTurnCast, activator).size() < limit) { + return false; + } } return true; @@ -136,8 +138,12 @@ public class StaticAbilityCantBeCast { return false; } - return !params.containsKey("NonActivatorTurn") || (activator == null) - || !activator.getGame().getPhaseHandler().isPlayerTurn(activator); + if (params.containsKey("NonActivatorTurn") && (activator != null) + && activator.getGame().getPhaseHandler().isPlayerTurn(activator)) { + return false; + } + + return true; } /** @@ -168,8 +174,12 @@ public class StaticAbilityCantBeCast { } } - return !params.containsKey("Player") || (player == null) - || player.isValid(params.get("Player"), hostCard.getController(), hostCard, null); + if (params.containsKey("Player") && (player != null) + && !player.isValid(params.get("Player"), hostCard.getController(), hostCard, null)) { + return false; + } + + return true; } } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java index e43f48cb517..c66923a5168 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java @@ -19,9 +19,14 @@ public class StaticAbilityCantPutCounter { // for the other part if (staticAbility.hasParam("ValidCard")) { - return card.isValid(staticAbility.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null); - } else return !staticAbility.hasParam("ValidPlayer"); - + if (!card.isValid(staticAbility.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + return false; + } + } else if (staticAbility.hasParam("ValidPlayer")) { + // for the other part + return false; + } + return true; } public static boolean applyCantPutCounter(final StaticAbility staticAbility, final Player player, @@ -37,8 +42,13 @@ public class StaticAbilityCantPutCounter { // for the other part if (staticAbility.hasParam("ValidPlayer")) { - return player.isValid(staticAbility.getParam("ValidPlayer").split(","), hostCard.getController(), hostCard, null); - } else return !staticAbility.hasParam("ValidCard"); - + if (!player.isValid(staticAbility.getParam("ValidPlayer").split(","), hostCard.getController(), hostCard, null)) { + return false; + } + } else if (staticAbility.hasParam("ValidCard")) { + // for the other part + return false; + } + return true; } } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 1ff3deaf234..e901efcb665 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -284,7 +284,9 @@ public abstract class Trigger extends TriggerReplacementBase { if (this.mapParams.containsKey("TurnCount")) { int turn = Integer.parseInt(this.mapParams.get("TurnCount")); - return phaseHandler.getTurn() == turn; + if (phaseHandler.getTurn() != turn) { + return false; + } } return true; @@ -354,7 +356,10 @@ public abstract class Trigger extends TriggerReplacementBase { } } - return meetsCommonRequirements(this.mapParams); + if ( !meetsCommonRequirements(this.mapParams)) + return false; + + return true; } @@ -377,7 +382,8 @@ public abstract class Trigger extends TriggerReplacementBase { String condition = this.mapParams.get("Condition"); if ("AltCost".equals(condition)) { final Card moved = (Card) runParams.get("Card"); - return null == moved || moved.isOptionalCostPaid(OptionalCost.AltCost); + if( null != moved && !moved.isOptionalCostPaid(OptionalCost.AltCost)) + return false; } else if ("AttackedPlayerWithMostLife".equals(condition)) { GameEntity attacked = (GameEntity) runParams.get("Attacked"); if (attacked == null) { @@ -385,8 +391,10 @@ public abstract class Trigger extends TriggerReplacementBase { // ends up being in Defender at that point. attacked = (GameEntity) runParams.get("Defender"); } - return attacked != null && attacked.isValid("Player.withMostLife", - this.getHostCard().getController(), this.getHostCard(), null); + if (attacked == null || !attacked.isValid("Player.withMostLife", + this.getHostCard().getController(), this.getHostCard(), null)) { + return false; + } } else if ("AttackedPlayerWhoAttackedYouLastTurn".equals(condition)) { GameEntity attacked = (GameEntity) runParams.get("Attacked"); if (attacked == null) { @@ -403,7 +411,9 @@ public abstract class Trigger extends TriggerReplacementBase { } } - return attacked != null && valid; + if (attacked == null || !valid) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java index 4aba396ab93..a07aff661d8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java @@ -49,8 +49,10 @@ public class TriggerAbandoned extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - return matchesValid(runParams2.get("Scheme"), this.mapParams.get("ValidCard").split(","), - this.getHostCard()); + if (!matchesValid(runParams2.get("Scheme"), this.mapParams.get("ValidCard").split(","), + this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java index efd19c6340c..5a603b715c8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java @@ -52,8 +52,10 @@ public class TriggerAdapt extends Trigger { public final boolean performTest(final Map runParams2) { final Card sac = (Card) runParams2.get("Card"); if (hasParam("ValidCard")) { - return sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null); + if (!sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), + getHostCard(), null)) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java index a4051152221..f185d57a441 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -60,7 +60,9 @@ public class TriggerAttached extends Trigger { } if (this.mapParams.containsKey("ValidTarget")) { - return matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard()); + if (!matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index d8a57921a46..89136658f35 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -73,7 +73,9 @@ public class TriggerAttackerBlocked extends Trigger { getHostCard().getController(), getHostCard() ); - return count != 0; + if ( count == 0 ) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java index 8edc3ad202c..be66cc09438 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -73,8 +73,12 @@ public class TriggerAttackerBlockedByCreature extends Trigger { if (this.mapParams.containsKey("ValidBlocker")) { final String validBlocker = this.mapParams.get("ValidBlocker"); if (validBlocker.equals("LessPowerThanAttacker")) { - return blocker.getNetPower() < attacker.getNetPower(); - } else return matchesValid(blocker, validBlocker.split(","), this.getHostCard()); + if (blocker.getNetPower() >= attacker.getNetPower()) { + return false; + } + } else if (!matchesValid(blocker, validBlocker.split(","), this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java index ec0bfa5c95b..c9ac21fc4bd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java @@ -58,8 +58,10 @@ public class TriggerAttackerUnblocked extends Trigger { } } if (this.mapParams.containsKey("ValidDefender")) { - return matchesValid(runParams2.get("Defender"), this.mapParams.get("ValidDefender").split(","), - this.getHostCard()); + if (!matchesValid(runParams2.get("Defender"), this.mapParams.get("ValidDefender").split(","), + this.getHostCard())) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java index 06f7e06590f..66ed8f5c01b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java @@ -73,8 +73,10 @@ public class TriggerAttackerUnblockedOnce extends Trigger { */ } if (hasParam("ValidAttackingPlayer")) { - return matchesValid(runParams2.get("AttackingPlayer"), - this.mapParams.get("ValidAttackingPlayer").split(","), this.getHostCard()); + if (!matchesValid(runParams2.get("AttackingPlayer"), + this.mapParams.get("ValidAttackingPlayer").split(","), this.getHostCard())) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java index 8f00fbf3d33..72f9649bba1 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java @@ -76,7 +76,9 @@ public class TriggerAttackersDeclared extends Trigger { valid = true; } } - return valid; + if (!valid) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java index 971d4299bd7..0f28b513ce6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -113,7 +113,9 @@ public class TriggerAttacks extends Trigger { } } } - return found; + if (!found) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java index 26a0deae9ef..17d9840f804 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java @@ -24,8 +24,10 @@ public class TriggerBecomeMonarch extends Trigger { } if (this.mapParams.containsKey("BeginTurn")) { - return matchesValid(game.getMonarchBeginTurn(), this.mapParams.get("BeginTurn").split(","), - host); + if (!matchesValid(game.getMonarchBeginTurn(), this.mapParams.get("BeginTurn").split(","), + host)) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java index 9b914392737..5a70ce99648 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java @@ -52,8 +52,10 @@ public class TriggerBecomeMonstrous extends Trigger { @Override public final boolean performTest(Map runParams2) { if (hasParam("ValidCard")) { - return matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), - this.getHostCard()); + if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), + this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java index f0da7bc86b9..ab84910d4cf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java @@ -50,8 +50,10 @@ public class TriggerBecomeRenowned extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard()); + if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java index 3bdfa10004f..097262f0c51 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java @@ -77,7 +77,9 @@ public class TriggerBecomesTarget extends Trigger { } } if (this.mapParams.containsKey("FirstTime")) { - return runParams2.containsKey("FirstTime"); + if (!runParams2.containsKey("FirstTime")) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java index 6707812b470..bd8a2868c51 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -70,7 +70,9 @@ public class TriggerBecomesTargetOnce extends Trigger { break; } } - return valid; + if (!valid) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java index 06f7e300693..441348ace95 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java @@ -77,7 +77,9 @@ public class TriggerBlocks extends Trigger { } } - return foundMatch; + if (!foundMatch) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java index 1611f9c7595..2604e2d55c7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -60,8 +60,10 @@ public class TriggerChampioned extends Trigger { } } if (this.mapParams.containsKey("ValidSource")) { - return source.isValid(this.mapParams.get("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard(), null); + if (!source.isValid(this.mapParams.get("ValidSource").split(","), + this.getHostCard().getController(), this.getHostCard(), null)) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java index b394980a87d..31a073b8508 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java @@ -58,8 +58,10 @@ public class TriggerChangesController extends Trigger { } } if (this.mapParams.containsKey("ValidOriginalController")) { - return matchesValid(runParams2.get("OriginalController"), this.mapParams.get("ValidOriginalController").split(","), - this.getHostCard()); + if (!matchesValid(runParams2.get("OriginalController"), this.mapParams.get("ValidOriginalController").split(","), + this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java b/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java index a2eec1db4d7..8caaf85c7ef 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java @@ -59,7 +59,9 @@ public class TriggerClashed extends Trigger { } if (this.mapParams.containsKey("Won")) { - return this.mapParams.get("Won").equals(runParams2.get("Won")); + if (!this.mapParams.get("Won").equals(runParams2.get("Won"))) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java index 9e8e0b4d288..26f64523bdc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java @@ -109,7 +109,9 @@ public class TriggerCounterAdded extends Trigger { final int operand = Integer.parseInt(fullParam.substring(2)); final int actualAmount = (Integer) runParams2.get("CounterAmount"); - return Expressions.compare(actualAmount, operator, operand); + if (!Expressions.compare(actualAmount, operator, operand)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java index 65ea6cc7e18..549a3d81670 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java @@ -93,8 +93,10 @@ public class TriggerCounterAddedOnce extends Trigger { return false; } - return source.isValid(getParam("ValidSource").split(","), getHostCard().getController(), - getHostCard(), null); + if (!source.isValid(getParam("ValidSource").split(","), getHostCard().getController(), + getHostCard(), null)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java index eec54b27f2f..46e0bc5fa41 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java @@ -71,7 +71,9 @@ public class TriggerCounterRemoved extends Trigger { if (hasParam("NewCounterAmount")) { final String amtString = getParam("NewCounterAmount"); int amt = Integer.parseInt(amtString); - return amt == addedNewCounterAmount.intValue(); + if(amt != addedNewCounterAmount.intValue()) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java index 888ab7027dc..4e02b6d8df4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java @@ -62,7 +62,9 @@ public class TriggerCounterRemovedOnce extends Trigger { if (hasParam("CounterType")) { final String type = getParam("CounterType"); - return type.equals(removedType.toString()); + if (!type.equals(removedType.toString())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java index a31fab2f15e..0b11585be24 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java @@ -80,7 +80,9 @@ public class TriggerCountered extends Trigger { if (ctrdSA != null) { if (validType.equals("Spell") && !ctrdSA.isSpell()) { return false; - } else return !validType.equals("Ability") || ctrdSA.isAbility(); + } else if (validType.equals("Ability") && !ctrdSA.isAbility()) { + return false; + } } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index 88e9ea45135..7b4331ddb06 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -94,7 +94,9 @@ public class TriggerDamageDealtOnce extends Trigger { final int operand = Integer.parseInt(fullParam.substring(2)); final int actualAmount = (Integer) runParams2.get("DamageAmount"); - return Expressions.compare(actualAmount, operator, operand); + if (!Expressions.compare(actualAmount, operator, operand)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index bed6d6bc1a3..d5a9634cc39 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -45,7 +45,9 @@ public class TriggerDamageDoneOnce extends Trigger { } if (this.mapParams.containsKey("ValidTarget")) { - return matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard()); + if (!matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard())) { + return false; + } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java index 9686ea9fd29..cd533694d4f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java @@ -57,7 +57,9 @@ public class TriggerDestroyed extends Trigger { } } if (hasParam("ValidCard")) { - return matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard()); + if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard())) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java index f8a5f7d8d7a..0c60b064149 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java @@ -74,7 +74,9 @@ public class TriggerDiscarded extends Trigger { } if (this.mapParams.containsKey("IsMadness")) { Boolean madness = (Boolean) runParams2.get("IsMadness"); - return !(this.mapParams.get("IsMadness").equals("True") ^ madness); + if (this.mapParams.get("IsMadness").equals("True") ^ madness) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java index c9a761ac3ec..7e236166d20 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java @@ -70,7 +70,11 @@ public class TriggerDrawn extends Trigger { } // trigger should not happen while Mulligan - return game.getAge() != GameStage.Mulligan; + if (game.getAge() == GameStage.Mulligan) { + return false; + } + + return true; } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java index e12e4320903..3592a8d0adf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java @@ -84,8 +84,10 @@ public class TriggerExiled extends Trigger { if (cause == null) { return false; } - return cause.getHostCard().isValid(getParam("ValidCause").split(","), getHostCard().getController(), - getHostCard(), null); + if (!cause.getHostCard().isValid(getParam("ValidCause").split(","), getHostCard().getController(), + getHostCard(), null)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java index 2a4093ff1b2..dd566071c3c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -60,8 +60,10 @@ public class TriggerExploited extends Trigger { } } if (this.mapParams.containsKey("ValidSource")) { - return source.isValid(this.mapParams.get("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard(), null); + if (!source.isValid(this.mapParams.get("ValidSource").split(","), + this.getHostCard().getController(), this.getHostCard(), null)) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java index 3137c5cd83f..3d4795f9be7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java @@ -58,7 +58,9 @@ public class TriggerFlippedCoin extends Trigger { if (this.mapParams.containsKey("ValidResult")) { final boolean result = (Boolean) runParams2.get("Result"); final boolean valid = "Win".equals(this.mapParams.get("ValidResult")); - return !(result ^ valid); + if (result ^ valid) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index bd43d722a0d..85a7d8a1d6c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -536,7 +536,9 @@ public class TriggerHandler { final String dest = (String) runParams.get("Destination"); if (dest.equals("Battlefield") && runParams.get("Card") instanceof Card) { final Card card = (Card) runParams.get("Card"); - return !card.isCreature(); + if (card.isCreature()) { + return false; + } } } } // Torpor Orb check diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java index cb82452b8a5..89f3a10341d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java @@ -73,7 +73,9 @@ public class TriggerInvestigated extends Trigger { } if (this.mapParams.containsKey("OnlyFirst")) { - return (int) runParams2.get("Num") == 1; + if ((int) runParams2.get("Num") != 1) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java index 2498fb1d58f..0622263bdce 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java @@ -72,7 +72,9 @@ public class TriggerLandPlayed extends Trigger { } if (this.mapParams.containsKey("NotFirstLand")) { - return land.getController().getLandsPlayedThisTurn() >= 1; + if (land.getController().getLandsPlayedThisTurn() < 1) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java index 8c44cee9063..599594075a5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java @@ -62,7 +62,9 @@ public class TriggerLifeGained extends Trigger { } if (hasParam("Spell")) { final SpellAbility spellAbility = (SpellAbility) runParams2.get("SourceSA"); - return spellAbility != null && spellAbility.getRootAbility().isSpell(); + if (spellAbility == null || !spellAbility.getRootAbility().isSpell()) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java index 60998db1fdb..d905e1c8b07 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java @@ -59,7 +59,9 @@ public class TriggerLifeLost extends Trigger { } if (this.mapParams.containsKey("FirstTime")) { - return (boolean) runParams2.get("FirstTime"); + if (!(boolean)runParams2.get("FirstTime")) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java index 365aecf8b92..bf13399f36e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -57,8 +57,10 @@ public class TriggerPayCumulativeUpkeep extends Trigger { } final Card card = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - return card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null); + if (!card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null)) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java index c6a9c567f8e..f9e7ecabf45 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -57,8 +57,10 @@ public class TriggerPayEcho extends Trigger { } final Card card = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - return card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null); + if (!card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null)) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java index 530544ea3c4..d0abe3e4747 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -20,9 +20,13 @@ public class TriggerPhaseOut extends Trigger { if (this.mapParams.get("ValidCard").equals("Card.Self")) { // Since Phased out cards aren't visible in .isValid, use a special check here. // NOTE: All Phase Out Triggers should use ValidCard$ Card.Self - return phaser == this.getHostCard(); - } else return phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null); + if (phaser != this.getHostCard()) { + return false; + } + } else if (!phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java index 87ed5e4666e..55bbcbd4b5c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java @@ -42,7 +42,9 @@ public class TriggerPlanarDice extends Trigger { if (this.mapParams.containsKey("Result")) { PlanarDice cond = PlanarDice.smartValueOf(this.mapParams.get("Result")); - return cond == runParams2.get("Result"); + if (cond != runParams2.get("Result")) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java index 42483ab6abc..cd9f836c466 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java @@ -57,7 +57,9 @@ public class TriggerRegenerated extends Trigger { } } if (hasParam("ValidCard")) { - return matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard()); + if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard())) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java index e75ff3c88c0..c7614ca9d95 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -22,7 +22,9 @@ public class TriggerRevealed extends Trigger { } if (this.mapParams.containsKey("Miracle")) { Boolean madness = (Boolean) runParams2.get("Miracle"); - return !(this.mapParams.get("Miracle").equals("True") ^ madness); + if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard())) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index 4ece31285c7..64e545483fb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -114,7 +114,8 @@ public class TriggerSacrificed extends Trigger { } } - return withKeyword; + if (!withKeyword) + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java index 52dc26d35bb..538b82670ff 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java @@ -61,7 +61,9 @@ public class TriggerSearchedLibrary extends Trigger { if (this.mapParams.containsKey("SearchOwnLibrary")) { @SuppressWarnings("unchecked") List targets = (List) runParams2.get("Target"); - return targets.contains(runParams2.get("Player")); + if (!targets.contains(runParams2.get("Player"))) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index 6b3bd7fa926..0cebd807951 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -59,9 +59,13 @@ public class TriggerSetInMotion extends Trigger { if (this.mapParams.containsKey("SchemeType")) { if (this.mapParams.get("SchemeType").equals("NonOngoing")) { - return !((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing); + if (((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing)) { + return false; + } } else if (this.mapParams.get("SchemeType").equals("Ongoing")) { - return ((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing); + if (((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing)) { + return false; + } } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java index a351e9b31b6..e8abae4f522 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java @@ -62,7 +62,9 @@ public class TriggerShuffled extends Trigger { } if (this.mapParams.containsKey("ShuffleBySelfControlled")) { SpellAbility source = (SpellAbility) runParams2.get("Source"); - return source.getActivatingPlayer().equals(runParams2.get("Player")); + if (!source.getActivatingPlayer().equals(runParams2.get("Player"))) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index 14312a228a3..43fde3f60c0 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -252,7 +252,9 @@ public class TriggerSpellAbilityCast extends Trigger { break; } } - return sameNameFound; + if (!sameNameFound) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java index cd0ee3d47f4..26bb022c137 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java @@ -78,8 +78,10 @@ public class TriggerSpellAbilityCopy extends Trigger { } } if (hasParam("ValidActivatingPlayer")) { - return si != null && matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer") - .split(","), getHostCard()); + if (si == null || !matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer") + .split(","), getHostCard())) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java index a0d16afa570..2d3ee1dbb19 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java @@ -69,7 +69,9 @@ public class TriggerSurveil extends Trigger { } if (hasParam("OnlyFirst")) { - return (int) runParams2.get("NumThisTurn") == 1; + if ((int) runParams2.get("NumThisTurn") != 1) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index 70ec3905557..44185a79ef7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -60,9 +60,13 @@ public class TriggerTaps extends Trigger { } if (hasParam("Attacker")) { if ("True".equalsIgnoreCase(getParam("Attacker"))) { - return (Boolean) runParams2.get("Attacker"); + if (!(Boolean)runParams2.get("Attacker")) { + return false; + } } else if ("False".equalsIgnoreCase(getParam("Attacker"))) { - return !((Boolean) runParams2.get("Attacker")); + if ((Boolean)runParams2.get("Attacker")) { + return false; + } } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 293f2abbdaa..348492cb775 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -91,7 +91,9 @@ public class TriggerTapsForMana extends Trigger { } String produced = (String) prod; if ("ChosenColor".equals(mapParams.get("Produced"))) { - return this.getHostCard().hasChosenColor() && produced.contains(MagicColor.toShortString(this.getHostCard().getChosenColor())); + if (!this.getHostCard().hasChosenColor() || !produced.contains(MagicColor.toShortString(this.getHostCard().getChosenColor()))) { + return false; + } } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index 51b07e3c862..8b96b06fd3f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -60,8 +60,10 @@ public class TriggerUnattach extends Trigger { } if (hasParam("ValidAttachment")) { - return attach.isValid(getParam("ValidAttachment").split(","), getHostCard() - .getController(), getHostCard(), null); + if (!attach.isValid(getParam("ValidAttachment").split(","), getHostCard() + .getController(), getHostCard(), null)) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java index 3029fa3177f..7c583f1467d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java @@ -54,8 +54,10 @@ public class TriggerUntaps extends Trigger { final Card untapper = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - return untapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null); + if (!untapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null)) { + return false; + } } return true; diff --git a/forge-gui/src/main/java/forge/achievement/VariantWins.java b/forge-gui/src/main/java/forge/achievement/VariantWins.java index a1124b95e17..77a7e38f71d 100644 --- a/forge-gui/src/main/java/forge/achievement/VariantWins.java +++ b/forge-gui/src/main/java/forge/achievement/VariantWins.java @@ -23,7 +23,9 @@ public class VariantWins extends ProgressiveAchievement { if (game.getRules().hasAppliedVariant(variant)) { return true; } - return variant == GameType.Archenemy && game.getRules().hasAppliedVariant(GameType.ArchenemyRumble); //lump Archenemy Rumble into same achievement as Archenemy + if (variant == GameType.Archenemy && game.getRules().hasAppliedVariant(GameType.ArchenemyRumble)) { + return true; //lump Archenemy Rumble into same achievement as Archenemy + } } return false; } diff --git a/forge-gui/src/main/java/forge/card/CardScriptParser.java b/forge-gui/src/main/java/forge/card/CardScriptParser.java index c171329f248..55947f13095 100644 --- a/forge-gui/src/main/java/forge/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/card/CardScriptParser.java @@ -119,7 +119,10 @@ public final class CardScriptParser { if (!(part.startsWith("P") || part.startsWith("2") || isManaSymbol(part.charAt(0)))) { return false; } - return (isManaSymbol(part.charAt(1))) && part.charAt(0) != part.charAt(1); + if ((!isManaSymbol(part.charAt(1))) || part.charAt(0) == part.charAt(1)) { + return false; + } + return true; } return false; } diff --git a/forge-gui/src/main/java/forge/model/CardBlock.java b/forge-gui/src/main/java/forge/model/CardBlock.java index ba8d16b08d9..a3893102354 100644 --- a/forge-gui/src/main/java/forge/model/CardBlock.java +++ b/forge-gui/src/main/java/forge/model/CardBlock.java @@ -181,7 +181,10 @@ public final class CardBlock implements Comparable { if (!this.landSet.equals(other.landSet)) { return false; } - return this.name.equals(other.name); + if (!this.name.equals(other.name)) { + return false; + } + return true; } /* diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 93b4b31678a..fec7ac0844a 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -562,7 +562,9 @@ public class HumanPlay { } else { // Tainted Specter, Gurzigost, etc. boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "put into library." + orString); - return hasPaid; + if (!hasPaid) { + return false; + } } return true; } diff --git a/forge-gui/src/main/java/forge/quest/data/StarRating.java b/forge-gui/src/main/java/forge/quest/data/StarRating.java index 1c91b4ed4d7..37f5f30213b 100644 --- a/forge-gui/src/main/java/forge/quest/data/StarRating.java +++ b/forge-gui/src/main/java/forge/quest/data/StarRating.java @@ -44,6 +44,10 @@ public class StarRating { return false; } - return rating == other.rating; + if (rating != other.rating) { + return false; + } + + return true; } } From 6247cffcfec2a55cb3303f7abdca1080c87ad6d8 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 3 Sep 2019 09:34:31 +0000 Subject: [PATCH 13/68] Fix Pump with negative values --- .../src/main/java/forge/game/ability/effects/PumpAllEffect.java | 2 +- .../src/main/java/forge/game/ability/effects/PumpEffect.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index ea9dcb5f80a..a7662d8b76b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -51,7 +51,7 @@ public class PumpAllEffect extends SpellAbilityEffect { boolean redrawPT = false; - if (a > 0 || d > 0) { + if (a != 0 || d != 0) { tgtC.addPTBoost(a, d, timestamp); redrawPT = true; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 591dcf525ad..cbeb8c9890b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -55,7 +55,7 @@ public class PumpEffect extends SpellAbilityEffect { } } - if (a > 0 || d > 0) { + if (a != 0 || d != 0) { gameCard.addPTBoost(a, d, timestamp); redrawPT = true; } From efa606783c07a15d210e55d9c103da6bf41dcde1 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 3 Sep 2019 22:13:35 +0800 Subject: [PATCH 14/68] Cleanup --- .../java/forge/ai/AiAttackController.java | 1 - .../src/main/java/forge/ai/AiController.java | 1 - .../src/main/java/forge/ai/ComputerUtil.java | 6 +- .../java/forge/game/card/CardProperty.java | 736 +++++++++++++----- forge-gui-mobile/src/forge/Forge.java | 5 +- .../forge/download/GuiDownloadService.java | 6 +- 6 files changed, 558 insertions(+), 197 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index fa658e72bbe..c309b41ac01 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -607,7 +607,6 @@ public class AiAttackController { } return false; - } private final GameEntity chooseDefender(final Combat c, final boolean bAssault) { diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index f9a6de01010..a027cc9ea1c 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1645,7 +1645,6 @@ public class AiController { // For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about return true; } - return false; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index b21cc4435e4..f3172be4a43 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1107,8 +1107,10 @@ public class ComputerUtil { creatures2.add(creatures.get(i)); } } - return ((creatures2.size() + CardUtil.getThisTurnCast("Creature.YouCtrl", vengevines.get(0)).size()) > 1) - && card.isCreature() && card.getManaCost().getCMC() <= 3; + if (((creatures2.size() + CardUtil.getThisTurnCast("Creature.YouCtrl", vengevines.get(0)).size()) > 1) + && card.isCreature() && card.getManaCost().getCMC() <= 3) { + return true; + } } return false; } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 5be3ea783c9..1411664dd18 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -27,8 +27,7 @@ import java.util.List; public class CardProperty { - public static boolean cardHasProperty(Card card, String property, Player sourceController, Card source, - SpellAbility spellAbility) { + public static boolean cardHasProperty(Card card, String property, Player sourceController, Card source, SpellAbility spellAbility) { final Game game = card.getGame(); final Combat combat = game.getCombat(); // lki can't be null but it does return this @@ -38,13 +37,21 @@ public class CardProperty { // by name can also have color names, so needs to happen before colors. if (property.startsWith("named")) { String name = TextUtil.fastReplace(property.substring(5), ";", ","); // for some legendary cards - return card.sharesNameWith(name); + if (!card.sharesNameWith(name)) { + return false; + } } else if (property.startsWith("notnamed")) { - return !card.sharesNameWith(property.substring(8)); + if (card.sharesNameWith(property.substring(8))) { + return false; + } } else if (property.startsWith("sameName")) { - return card.sharesNameWith(source); + if (!card.sharesNameWith(source)) { + return false; + } } else if (property.equals("NamedCard")) { - return card.sharesNameWith(source.getNamedCard()); + if (!card.sharesNameWith(source.getNamedCard())) { + return false; + } } else if (property.equals("NamedByRememberedPlayer")) { if (!source.hasRemembered()) { final Card newCard = game.getCardState(source); @@ -64,23 +71,41 @@ public class CardProperty { } } } else if (property.equals("Permanent")) { - return !card.isInstant() && !card.isSorcery(); + if (card.isInstant() || card.isSorcery()) { + return false; + } } else if (property.equals("Historic")) { - return card.isHistoric(); + if (!card.isHistoric()) { + return false; + } } else if (property.startsWith("CardUID_")) {// Protection with "doesn't remove effect" - return card.getId() == Integer.parseInt(property.split("CardUID_")[1]); + if (card.getId() != Integer.parseInt(property.split("CardUID_")[1])) { + return false; + } } else if (property.equals("ChosenCard")) { - return source.hasChosenCard(card); + if (!source.hasChosenCard(card)) { + return false; + } } else if (property.equals("nonChosenCard")) { - return !source.hasChosenCard(card); + if (source.hasChosenCard(card)) { + return false; + } } else if (property.equals("DoubleFaced")) { - return card.isDoubleFaced(); + if (!card.isDoubleFaced()) { + return false; + } } else if (property.equals("Flip")) { - return card.isFlipCard(); + if (!card.isFlipCard()) { + return false; + } } else if (property.equals("Split")) { - return card.isSplitCard(); + if (!card.isSplitCard()) { + return false; + } } else if (property.equals("NotSplit")) { - return !card.isSplitCard(); + if (card.isSplitCard()) { + return false; + } } else if (property.startsWith("leftcmc") || property.startsWith("rightcmc")) { int x; int y = 0; @@ -100,17 +125,29 @@ public class CardProperty { x = AbilityUtils.calculateAmount(source, rhs, spellAbility); } - return Expressions.compare(y, property, x); + if (!Expressions.compare(y, property, x)) { + return false; + } } else if (property.startsWith("YouCtrl")) { - return controller.equals(sourceController); + if (!controller.equals(sourceController)) { + return false; + } } else if (property.startsWith("YourTeamCtrl")) { - return controller.getTeam() == sourceController.getTeam(); + if (controller.getTeam() != sourceController.getTeam()) { + return false; + } } else if (property.startsWith("YouDontCtrl")) { - return !controller.equals(sourceController); + if (controller.equals(sourceController)) { + return false; + } } else if (property.startsWith("OppCtrl")) { - return controller.getOpponents().contains(sourceController); + if (!controller.getOpponents().contains(sourceController)) { + return false; + } } else if (property.startsWith("ChosenCtrl")) { - return controller.equals(source.getChosenPlayer()); + if (!controller.equals(source.getChosenPlayer())) { + return false; + } } else if (property.startsWith("DefenderCtrl")) { if (!game.getPhaseHandler().inCombat()) { return false; @@ -119,21 +156,29 @@ public class CardProperty { if (!source.hasRemembered()) { return false; } - return combat.getDefendingPlayerRelatedTo((Card) source.getFirstRemembered()) == controller; + if (combat.getDefendingPlayerRelatedTo((Card) source.getFirstRemembered()) != controller) { + return false; + } } else { - return combat.getDefendingPlayerRelatedTo(source) == controller; + if (combat.getDefendingPlayerRelatedTo(source) != controller) { + return false; + } } } else if (property.startsWith("DefendingPlayer")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); if (!game.getPhaseHandler().inCombat()) { return false; } - return combat.isPlayerAttacked(p); + if (!combat.isPlayerAttacked(p)) { + return false; + } } else if (property.startsWith("EnchantedPlayer")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); final Object o = source.getEntityAttachedTo(); if (o instanceof Player) { - return p.equals(o); + if (!p.equals(o)) { + return false; + } } else { // source not enchanting a player return false; } @@ -141,7 +186,9 @@ public class CardProperty { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); final Object o = source.getEntityAttachedTo(); if (o instanceof Card) { - return p.equals(((Card) o).getController()); + if (!p.equals(((Card) o).getController())) { + return false; + } } else { // source not enchanting a card return false; } @@ -154,7 +201,9 @@ public class CardProperty { } } - return source.isRemembered(p); + if (!source.isRemembered(p)) { + return false; + } } else if (property.startsWith("nonRememberedPlayerCtrl")) { if (!source.hasRemembered()) { final Card newCard = game.getCardState(source); @@ -163,7 +212,9 @@ public class CardProperty { } } - return !source.isRemembered(controller); + if (source.isRemembered(controller)) { + return false; + } } else if (property.equals("TargetedPlayerCtrl")) { boolean foundTargetingSA = false; for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { @@ -217,15 +268,25 @@ public class CardProperty { } } } else if (property.startsWith("ActivePlayerCtrl")) { - return game.getPhaseHandler().isPlayerTurn(controller); + if (!game.getPhaseHandler().isPlayerTurn(controller)) { + return false; + } } else if (property.startsWith("NonActivePlayerCtrl")) { - return !game.getPhaseHandler().isPlayerTurn(controller); + if (game.getPhaseHandler().isPlayerTurn(controller)) { + return false; + } } else if (property.startsWith("YouOwn")) { - return card.getOwner().equals(sourceController); + if (!card.getOwner().equals(sourceController)) { + return false; + } } else if (property.startsWith("YouDontOwn")) { - return !card.getOwner().equals(sourceController); + if (card.getOwner().equals(sourceController)) { + return false; + } } else if (property.startsWith("OppOwn")) { - return card.getOwner().getOpponents().contains(sourceController); + if (!card.getOwner().getOpponents().contains(sourceController)) { + return false; + } } else if (property.equals("TargetedPlayerOwn")) { boolean foundTargetingSA = false; for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { @@ -262,33 +323,49 @@ public class CardProperty { final String valid = property.substring(8); if (!card.getOwner().isValid(valid, sourceController, source, spellAbility)) { final List lp = AbilityUtils.getDefinedPlayers(source, valid, spellAbility); - return lp.contains(card.getOwner()); + if (!lp.contains(card.getOwner())) { + return false; + } } } else if (property.startsWith("ControlledBy")) { final String valid = property.substring(13); if (!controller.isValid(valid, sourceController, source, spellAbility)) { final List lp = AbilityUtils.getDefinedPlayers(source, valid, spellAbility); - return lp.contains(controller); + if (!lp.contains(controller)) { + return false; + } } } else if (property.startsWith("OwnerDoesntControl")) { - return !card.getOwner().equals(controller); + if (card.getOwner().equals(controller)) { + return false; + } } else if (property.startsWith("ControllerControls")) { final String type = property.substring(18); if (type.startsWith("AtLeastAsMany")) { String realType = type.split("AtLeastAsMany")[1]; CardCollectionView cards = CardLists.getType(controller.getCardsIn(ZoneType.Battlefield), realType); CardCollectionView yours = CardLists.getType(sourceController.getCardsIn(ZoneType.Battlefield), realType); - return cards.size() >= yours.size(); + if (cards.size() < yours.size()) { + return false; + } } else { final CardCollectionView cards = controller.getCardsIn(ZoneType.Battlefield); - return !CardLists.getType(cards, type).isEmpty(); + if (CardLists.getType(cards, type).isEmpty()) { + return false; + } } } else if (property.startsWith("Other")) { - return !card.equals(source); + if (card.equals(source)) { + return false; + } } else if (property.startsWith("StrictlySelf")) { - return card.equals(source) && card.getTimestamp() == source.getTimestamp(); + if (!card.equals(source) || card.getTimestamp() != source.getTimestamp()) { + return false; + } } else if (property.startsWith("Self")) { - return card.equals(source); + if (!card.equals(source)) { + return false; + } } else if (property.startsWith("ExiledWithSource")) { if (card.getExiledWith() == null) { return false; @@ -303,21 +380,33 @@ public class CardProperty { } } - return card.getExiledWith().equals(host); + if (!card.getExiledWith().equals(host)) { + return false; + } } else if (property.equals("EncodedWithSource")) { - return card.getEncodedCards().contains(source); + if (!card.getEncodedCards().contains(source)) { + return false; + } } else if (property.equals("EffectSource")) { if (!source.isEmblem() && !source.getType().hasSubtype("Effect")) { return false; } - return card.equals(source.getEffectSource()); + if (!card.equals(source.getEffectSource())) { + return false; + } } else if (property.equals("CanBeSacrificedBy")) { - return card.canBeSacrificedBy(spellAbility); + if (!card.canBeSacrificedBy(spellAbility)) { + return false; + } } else if (property.startsWith("AttachedBy")) { - return card.hasCardAttachment(source); + if (!card.hasCardAttachment(source)) { + return false; + } } else if (property.equals("Attached")) { - return source.hasCardAttachment(card); + if (!source.hasCardAttachment(card)) { + return false; + } } else if (property.startsWith("AttachedTo")) { final String restriction = property.split("AttachedTo ")[1]; if (restriction.equals("Targeted")) { @@ -343,16 +432,24 @@ public class CardProperty { return false; } } else { - return (card.getEntityAttachedTo() != null && card.getEntityAttachedTo().isValid(restriction, sourceController, source, spellAbility)); + if ((card.getEntityAttachedTo() == null || !card.getEntityAttachedTo().isValid(restriction, sourceController, source, spellAbility))) { + return false; + } } } else if (property.equals("NameNotEnchantingEnchantedPlayer")) { Player enchantedPlayer = source.getPlayerAttachedTo(); - return enchantedPlayer != null && !enchantedPlayer.isEnchantedBy(card.getName()); + if (enchantedPlayer == null || enchantedPlayer.isEnchantedBy(card.getName())) { + return false; + } } else if (property.equals("NotAttachedTo")) { - return !source.hasCardAttachment(card); + if (source.hasCardAttachment(card)) { + return false; + } } else if (property.startsWith("EnchantedBy")) { if (property.equals("EnchantedBy")) { - return card.isEnchantedBy(source) || card.equals(source.getEntityAttachedTo()); + if (!card.isEnchantedBy(source) && !card.equals(source.getEntityAttachedTo())) { + return false; + } } else { final String restriction = property.split("EnchantedBy ")[1]; switch (restriction) { @@ -397,10 +494,14 @@ public class CardProperty { } } } else { - return !card.isEnchantedBy(source); + if (card.isEnchantedBy(source)) { + return false; + } } } else if (property.startsWith("Enchanted")) { - return source.equals(card.getEntityAttachedTo()); + if (!source.equals(card.getEntityAttachedTo())) { + return false; + } } else if (property.startsWith("CanEnchant")) { final String restriction = property.substring(10); if (restriction.equals("Remembered")) { @@ -409,7 +510,7 @@ public class CardProperty { return false; } } else if (restriction.equals("Source")) { - return source.canBeAttached(card); + if (!source.canBeAttached(card)) return false; } } else if (property.startsWith("CanBeEnchantedBy")) { if (property.substring(16).equals("Targeted")) { @@ -433,7 +534,9 @@ public class CardProperty { } } } else { - return card.canBeAttached(source); + if (!card.canBeAttached(source)) { + return false; + } } } else if (property.startsWith("EquippedBy")) { if (property.substring(10).equals("Targeted")) { @@ -448,44 +551,74 @@ public class CardProperty { } } } else if (property.substring(10).equals("Enchanted")) { - return source.getEnchantingCard() != null && - card.hasCardAttachment(source.getEnchantingCard()); + if (source.getEnchantingCard() == null || + !card.hasCardAttachment(source.getEnchantingCard())) { + return false; + } } else { - return card.hasCardAttachment(source); + if (!card.hasCardAttachment(source)) { + return false; + } } } else if (property.startsWith("FortifiedBy")) { - return card.hasCardAttachment(source); + if (!card.hasCardAttachment(source)) { + return false; + } } else if (property.startsWith("CanBeAttachedBy")) { - return card.canBeAttached(source); + if (!card.canBeAttached(source)) { + return false; + } } else if (property.startsWith("Equipped")) { - return source.hasCardAttachment(card); + if (!source.hasCardAttachment(card)) { + return false; + } } else if (property.startsWith("Fortified")) { // FIXME TODO what property has this? - return source.hasCardAttachment(card); + if (!source.hasCardAttachment(card)) { + return false; + } } else if (property.startsWith("HauntedBy")) { - return card.isHauntedBy(source); + if (!card.isHauntedBy(source)) { + return false; + } } else if (property.startsWith("notTributed")) { - return !card.isTributed(); + if (card.isTributed()) { + return false; + } } else if (property.startsWith("madness")) { - return card.isMadness(); + if (!card.isMadness()) { + return false; + } } else if (property.contains("Paired")) { if (property.contains("With")) { // PairedWith - return card.isPaired() && card.getPairedWith() == source; + if (!card.isPaired() || card.getPairedWith() != source) { + return false; + } } else if (property.startsWith("Not")) { // NotPaired - return !card.isPaired(); + if (card.isPaired()) { + return false; + } } else { // Paired - return card.isPaired(); + if (!card.isPaired()) { + return false; + } } } else if (property.startsWith("Above")) { // "Are Above" Source final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Graveyard); - return cards.indexOf(source) < cards.indexOf(card); + if (cards.indexOf(source) >= cards.indexOf(card)) { + return false; + } } else if (property.startsWith("DirectlyAbove")) { // "Are Directly Above" Source final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Graveyard); - return cards.indexOf(card) - cards.indexOf(source) == 1; + if (cards.indexOf(card) - cards.indexOf(source) != 1) { + return false; + } } else if (property.startsWith("TopGraveyardCreature")) { CardCollection cards = CardLists.filter(card.getOwner().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES); Collections.reverse(cards); - return !cards.isEmpty() && card.equals(cards.get(0)); + if (cards.isEmpty() || !card.equals(cards.get(0))) { + return false; + } } else if (property.startsWith("TopGraveyard")) { final CardCollection cards = new CardCollection(card.getOwner().getCardsIn(ZoneType.Graveyard)); Collections.reverse(cards); @@ -496,18 +629,28 @@ public class CardProperty { for (int i = 0; i < num; i++) { newlist.add(cards.get(i)); } - return !cards.isEmpty() && newlist.contains(card); + if (cards.isEmpty() || !newlist.contains(card)) { + return false; + } } else { - return !cards.isEmpty() && card.equals(cards.get(0)); + if (cards.isEmpty() || !card.equals(cards.get(0))) { + return false; + } } } else if (property.startsWith("BottomGraveyard")) { final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Graveyard); - return !cards.isEmpty() && card.equals(cards.get(0)); + if (cards.isEmpty() || !card.equals(cards.get(0))) { + return false; + } } else if (property.startsWith("TopLibrary")) { final CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Library); - return !cards.isEmpty() && card.equals(cards.get(0)); + if (cards.isEmpty() || !card.equals(cards.get(0))) { + return false; + } } else if (property.startsWith("Cloned")) { - return (card.getCloneOrigin() != null) && card.getCloneOrigin().equals(source); + if ((card.getCloneOrigin() == null) || !card.getCloneOrigin().equals(source)) { + return false; + } } else if (property.startsWith("DamagedBy")) { if ((property.endsWith("Source") || property.equals("DamagedBy")) && !card.getReceivedDamageFromThisTurn().containsKey(source)) { @@ -520,16 +663,21 @@ public class CardProperty { } matched |= card.getReceivedDamageFromThisTurn().containsKey(obj); } - return matched; + if (!matched) + return false; } else if (property.endsWith("Equipped")) { final Card equipee = source.getEquipping(); - return equipee != null && card.getReceivedDamageFromThisTurn().containsKey(equipee); + if (equipee == null || !card.getReceivedDamageFromThisTurn().containsKey(equipee)) + return false; } else if (property.endsWith("Enchanted")) { final Card equipee = source.getEnchantingCard(); - return equipee != null && card.getReceivedDamageFromThisTurn().containsKey(equipee); + if (equipee == null || !card.getReceivedDamageFromThisTurn().containsKey(equipee)) + return false; } } else if (property.startsWith("Damaged")) { - return card.getDealtDamageToThisTurn().containsKey(source); + if (!card.getDealtDamageToThisTurn().containsKey(source)) { + return false; + } } else if (property.startsWith("IsTargetingSource")) { for (final SpellAbility sa : card.getCurrentState().getNonManaAbilities()) { final SpellAbility saTargeting = sa.getSATargetingCard(); @@ -544,7 +692,9 @@ public class CardProperty { return false; } else if (property.startsWith("SharesCMCWith")) { if (property.equals("SharesCMCWith")) { - return card.sharesCMCWith(source); + if (!card.sharesCMCWith(source)) { + return false; + } } else { final String restriction = property.split("SharesCMCWith ")[1]; CardCollection list = AbilityUtils.getDefinedCards(source, restriction, spellAbility); @@ -552,7 +702,9 @@ public class CardProperty { } } else if (property.startsWith("SharesColorWith")) { if (property.equals("SharesColorWith")) { - return card.sharesColorWith(source); + if (!card.sharesColorWith(source)) { + return false; + } } else { final String restriction = property.split("SharesColorWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { @@ -613,7 +765,9 @@ public class CardProperty { return ColorSet.fromMask(mostProm).hasAnyColor(MagicColor.fromName(color)); } else if (property.startsWith("notSharesColorWith")) { if (property.equals("notSharesColorWith")) { - return !card.sharesColorWith(source); + if (card.sharesColorWith(source)) { + return false; + } } else { final String restriction = property.split("notSharesColorWith ")[1]; for (final Card c : sourceController.getCardsIn(ZoneType.Battlefield)) { @@ -624,7 +778,9 @@ public class CardProperty { } } else if (property.startsWith("sharesCreatureTypeWith")) { if (property.equals("sharesCreatureTypeWith")) { - return card.sharesCreatureTypeWith(source); + if (!card.sharesCreatureTypeWith(source)) { + return false; + } } else { final String restriction = property.split("sharesCreatureTypeWith ")[1]; switch (restriction) { @@ -657,7 +813,10 @@ public class CardProperty { } break; case "Equipped": - return source.isEquipping() && card.sharesCreatureTypeWith(source.getEquipping()); + if (source.isEquipping() && card.sharesCreatureTypeWith(source.getEquipping())) { + return true; + } + return false; case "Remembered": for (final Object rem : source.getRemembered()) { if (rem instanceof Card) { @@ -693,7 +852,9 @@ public class CardProperty { } } else if (property.startsWith("sharesCardTypeWith")) { if (property.equals("sharesCardTypeWith")) { - return card.sharesCardTypeWith(source); + if (!card.sharesCardTypeWith(source)) { + return false; + } } else { final String restriction = property.split("sharesCardTypeWith ")[1]; switch (restriction) { @@ -717,7 +878,10 @@ public class CardProperty { if (!(triggeringObject instanceof Card)) { return false; } - return card.sharesCardTypeWith((Card) triggeringObject); + if (card.sharesCardTypeWith((Card) triggeringObject)) { + return true; + } + return false; case "EachTopLibrary": final CardCollection cards = new CardCollection(); for (Player p : game.getPlayers()) { @@ -733,9 +897,13 @@ public class CardProperty { } } } else if (property.equals("sharesPermanentTypeWith")) { - return card.sharesPermanentTypeWith(source); + if (!card.sharesPermanentTypeWith(source)) { + return false; + } } else if (property.equals("canProduceSameManaTypeWith")) { - return card.canProduceSameManaTypeWith(source); + if (!card.canProduceSameManaTypeWith(source)) { + return false; + } } else if (property.startsWith("canProduceManaColor")) { final String color = property.split("canProduceManaColor ")[1]; for (SpellAbility ma : card.getManaAbilities()) { @@ -748,7 +916,9 @@ public class CardProperty { return !card.getManaAbilities().isEmpty(); } else if (property.startsWith("sharesNameWith")) { if (property.equals("sharesNameWith")) { - return card.sharesNameWith(source); + if (!card.sharesNameWith(source)) { + return false; + } } else { final String restriction = property.split("sharesNameWith ")[1]; if (restriction.equals("YourGraveyard")) { @@ -788,14 +958,18 @@ public class CardProperty { System.out.println("Looking at TriggeredCard but no SA?"); } else { Card triggeredCard = ((Card)spellAbility.getTriggeringObject("Card")); - return triggeredCard != null && card.sharesNameWith(triggeredCard); + if (triggeredCard != null && card.sharesNameWith(triggeredCard)) { + return true; + } } return false; } } } else if (property.startsWith("doesNotShareNameWith")) { if (property.equals("doesNotShareNameWith")) { - return !card.sharesNameWith(source); + if (card.sharesNameWith(source)) { + return false; + } } else { final String restriction = property.split("doesNotShareNameWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { @@ -818,7 +992,9 @@ public class CardProperty { } } else if (property.startsWith("sharesControllerWith")) { if (property.equals("sharesControllerWith")) { - return card.sharesControllerWith(source); + if (!card.sharesControllerWith(source)) { + return false; + } } else { final String restriction = property.split("sharesControllerWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { @@ -828,7 +1004,9 @@ public class CardProperty { } } else if (property.startsWith("sharesOwnerWith")) { if (property.equals("sharesOwnerWith")) { - return card.getOwner().equals(source.getOwner()); + if (!card.getOwner().equals(source.getOwner())) { + return false; + } } else { final String restriction = property.split("sharesOwnerWith ")[1]; if (restriction.equals("Remembered")) { @@ -847,7 +1025,9 @@ public class CardProperty { if (cards.size() < 2) { return false; } - else return cards.get(1) == card; + else if (cards.get(1) != card) { + return false; + } } else if (property.equals("ThisTurnCast")) { for (final Card c : CardUtil.getThisTurnCast("Card", source)) { if (card.equals(c)) { @@ -865,14 +1045,18 @@ public class CardProperty { } CardCollectionView cards = CardUtil.getThisTurnEntered(destination, origin, "Card", source); - return cards.contains(card); + if (!cards.contains(card)) { + return false; + } } else if (property.equals("DiscardedThisTurn")) { if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { return false; } CardCollectionView cards = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Hand, "Card", source); - return cards.contains(card) || card.getMadnessWithoutCast(); + if (!cards.contains(card) && !card.getMadnessWithoutCast()) { + return false; + } } else if (property.startsWith("ControlledByPlayerInTheDirection")) { final String restrictions = property.split("ControlledByPlayerInTheDirection_")[1]; final String[] res = restrictions.split("_"); @@ -888,53 +1072,93 @@ public class CardProperty { } else { p = sourceController; } - return p != null && controller.equals(game.getNextPlayerAfter(p, direction)); + if (p == null || !controller.equals(game.getNextPlayerAfter(p, direction))) { + return false; + } } else if (property.startsWith("hasKeyword")) { // "withFlash" would find Flashback cards, add this to fix Mystical Teachings - return card.hasKeyword(property.substring(10)); + if (!card.hasKeyword(property.substring(10))) { + return false; + } } else if (property.startsWith("withFlashback")) { boolean fb = card.hasKeyword(Keyword.FLASHBACK); - return fb; + if (!fb) { + return false; + } } else if (property.startsWith("with")) { // ... Card keywords if (property.startsWith("without") && card.hasStartOfUnHiddenKeyword(property.substring(7))) { return false; } - return property.startsWith("without") || card.hasStartOfUnHiddenKeyword(property.substring(4)); + if (!property.startsWith("without") && !card.hasStartOfUnHiddenKeyword(property.substring(4))) { + return false; + } } else if (property.startsWith("tapped")) { - return card.isTapped(); + if (!card.isTapped()) { + return false; + } } else if (property.startsWith("untapped")) { - return card.isUntapped(); + if (!card.isUntapped()) { + return false; + } } else if (property.startsWith("faceDown")) { - return card.isFaceDown(); + if (!card.isFaceDown()) { + return false; + } } else if (property.startsWith("faceUp")) { - return !card.isFaceDown(); + if (card.isFaceDown()) { + return false; + } } else if (property.startsWith("manifested")) { - return card.isManifested(); + if (!card.isManifested()) { + return false; + } } else if (property.startsWith("DrawnThisTurn")) { - return card.getDrawnThisTurn(); + if (!card.getDrawnThisTurn()) { + return false; + } } else if (property.startsWith("enteredBattlefieldThisTurn")) { - return card.getTurnInZone() == game.getPhaseHandler().getTurn(); + if (!(card.getTurnInZone() == game.getPhaseHandler().getTurn())) { + return false; + } } else if (property.startsWith("notEnteredBattlefieldThisTurn")) { - return card.getTurnInZone() != game.getPhaseHandler().getTurn(); + if (card.getTurnInZone() == game.getPhaseHandler().getTurn()) { + return false; + } } else if (property.startsWith("firstTurnControlled")) { - return card.isFirstTurnControlled(); + if (!card.isFirstTurnControlled()) { + return false; + } } else if (property.startsWith("notFirstTurnControlled")) { - return !card.isFirstTurnControlled(); + if (card.isFirstTurnControlled()) { + return false; + } } else if (property.startsWith("startedTheTurnUntapped")) { - return card.hasStartedTheTurnUntapped(); + if (!card.hasStartedTheTurnUntapped()) { + return false; + } } else if (property.startsWith("cameUnderControlSinceLastUpkeep")) { - return card.cameUnderControlSinceLastUpkeep(); + if (!card.cameUnderControlSinceLastUpkeep()) { + return false; + } } else if (property.equals("attackedOrBlockedSinceYourLastUpkeep")) { - return card.getDamageHistory().hasAttackedSinceLastUpkeepOf(sourceController) - || card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController); + if (!card.getDamageHistory().hasAttackedSinceLastUpkeepOf(sourceController) + && !card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController)) { + return false; + } } else if (property.equals("blockedOrBeenBlockedSinceYourLastUpkeep")) { - return card.getDamageHistory().hasBeenBlockedSinceLastUpkeepOf(sourceController) - || card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController); + if (!card.getDamageHistory().hasBeenBlockedSinceLastUpkeepOf(sourceController) + && !card.getDamageHistory().hasBlockedSinceLastUpkeepOf(sourceController)) { + return false; + } } else if (property.startsWith("dealtDamageToYouThisTurn")) { - return card.getDamageHistory().getThisTurnDamaged().contains(sourceController); + if (!card.getDamageHistory().getThisTurnDamaged().contains(sourceController)) { + return false; + } } else if (property.startsWith("dealtDamageToOppThisTurn")) { - return card.hasDealtDamageToOpponentThisTurn(); + if (!card.hasDealtDamageToOpponentThisTurn()) { + return false; + } } else if (property.startsWith("dealtCombatDamageThisTurn ") || property.startsWith("notDealtCombatDamageThisTurn ")) { final String v = property.split(" ")[1]; final List list = card.getDamageHistory().getThisTurnCombatDamaged(); @@ -945,7 +1169,9 @@ public class CardProperty { break; } } - return found != property.startsWith("not"); + if (found == property.startsWith("not")) { + return false; + } } else if (property.startsWith("dealtCombatDamageThisCombat ") || property.startsWith("notDealtCombatDamageThisCombat ")) { final String v = property.split(" ")[1]; final List list = card.getDamageHistory().getThisCombatDamaged(); @@ -956,31 +1182,53 @@ public class CardProperty { break; } } - return found != property.startsWith("not"); + if (found == property.startsWith("not")) { + return false; + } } else if (property.startsWith("controllerWasDealtCombatDamageByThisTurn")) { - return source.getDamageHistory().getThisTurnCombatDamaged().contains(controller); + if (!source.getDamageHistory().getThisTurnCombatDamaged().contains(controller)) { + return false; + } } else if (property.startsWith("controllerWasDealtDamageByThisTurn")) { - return source.getDamageHistory().getThisTurnDamaged().contains(controller); + if (!source.getDamageHistory().getThisTurnDamaged().contains(controller)) { + return false; + } } else if (property.startsWith("wasDealtDamageThisTurn")) { - return !(card.getReceivedDamageFromThisTurn().keySet()).isEmpty(); + if ((card.getReceivedDamageFromThisTurn().keySet()).isEmpty()) { + return false; + } } else if (property.startsWith("dealtDamageThisTurn")) { - return card.getTotalDamageDoneBy() != 0; + if (card.getTotalDamageDoneBy() == 0) { + return false; + } } else if (property.startsWith("attackedThisTurn")) { - return card.getDamageHistory().getCreatureAttackedThisTurn(); + if (!card.getDamageHistory().getCreatureAttackedThisTurn()) { + return false; + } } else if (property.startsWith("attackedLastTurn")) { return card.getDamageHistory().getCreatureAttackedLastTurnOf(controller); } else if (property.startsWith("blockedThisTurn")) { - return card.getDamageHistory().getCreatureBlockedThisTurn(); + if (!card.getDamageHistory().getCreatureBlockedThisTurn()) { + return false; + } } else if (property.startsWith("notExertedThisTurn")) { - return card.getExertedThisTurn() <= 0; + if (card.getExertedThisTurn() > 0) { + return false; + } } else if (property.startsWith("gotBlockedThisTurn")) { - return card.getDamageHistory().getCreatureGotBlockedThisTurn(); + if (!card.getDamageHistory().getCreatureGotBlockedThisTurn()) { + return false; + } } else if (property.startsWith("notAttackedThisTurn")) { - return !card.getDamageHistory().getCreatureAttackedThisTurn(); + if (card.getDamageHistory().getCreatureAttackedThisTurn()) { + return false; + } } else if (property.startsWith("notAttackedLastTurn")) { return !card.getDamageHistory().getCreatureAttackedLastTurnOf(controller); } else if (property.startsWith("notBlockedThisTurn")) { - return !card.getDamageHistory().getCreatureBlockedThisTurn(); + if (card.getDamageHistory().getCreatureBlockedThisTurn()) { + return false; + } } else if (property.startsWith("greatestPower")) { CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); if (property.contains("ControlledBy")) { @@ -1031,7 +1279,9 @@ public class CardProperty { cards = CardLists.getType(cards, prop); } cards = CardLists.getCardsWithHighestCMC(cards); - return cards.contains(card); + if (!cards.contains(card)) { + return false; + } } else if (property.startsWith("greatestRememberedCMC")) { CardCollection cards = new CardCollection(); for (final Object o : source.getRemembered()) { @@ -1043,7 +1293,9 @@ public class CardProperty { return false; } cards = CardLists.getCardsWithHighestCMC(cards); - return cards.contains(card); + if (!cards.contains(card)) { + return false; + } } else if (property.startsWith("lowestRememberedCMC")) { CardCollection cards = new CardCollection(); for (final Object o : source.getRemembered()) { @@ -1055,7 +1307,9 @@ public class CardProperty { return false; } cards = CardLists.getCardsWithLowestCMC(cards); - return cards.contains(card); + if (!cards.contains(card)) { + return false; + } } else if (property.startsWith("lowestCMC")) { final CardCollectionView cards = game.getCardsIn(ZoneType.Battlefield); @@ -1068,40 +1322,74 @@ public class CardProperty { } } } else if (property.startsWith("enchanted")) { - return card.isEnchanted(); + if (!card.isEnchanted()) { + return false; + } } else if (property.startsWith("unenchanted")) { - return !card.isEnchanted(); + if (card.isEnchanted()) { + return false; + } } else if (property.startsWith("enchanting")) { - return card.isEnchanting(); + if (!card.isEnchanting()) { + return false; + } } else if (property.startsWith("equipped")) { - return card.isEquipped(); + if (!card.isEquipped()) { + return false; + } } else if (property.startsWith("unequipped")) { - return !card.isEquipped(); + if (card.isEquipped()) { + return false; + } } else if (property.startsWith("equipping")) { - return card.isEquipping(); + if (!card.isEquipping()) { + return false; + } } else if (property.startsWith("notEquipping")) { - return !card.isEquipping(); + if (card.isEquipping()) { + return false; + } } else if (property.startsWith("token")) { - return card.isToken(); + if (!card.isToken()) { + return false; + } } else if (property.startsWith("nonToken")) { - return !card.isToken(); + if (card.isToken()) { + return false; + } } else if (property.startsWith("hasXCost")) { SpellAbility sa1 = card.getFirstSpellAbility(); - return sa1 == null || sa1.isXCost(); + if (sa1 != null && !sa1.isXCost()) { + return false; + } } else if (property.startsWith("suspended")) { - return card.hasSuspend(); + if (!card.hasSuspend()) { + return false; + } } else if (property.startsWith("delved")) { - return source.getDelved().contains(card); + if (!source.getDelved().contains(card)) { + return false; + } } else if (property.startsWith("convoked")) { - return source.getConvoked().contains(card); + if (!source.getConvoked().contains(card)) { + return false; + } } else if (property.startsWith("exploited")) { - return source.getExploited().contains(card); + if (!source.getExploited().contains(card)) { + return false; + } } else if (property.startsWith("unequalPT")) { - return card.getNetPower() != card.getNetToughness(); + if (card.getNetPower() == card.getNetToughness()) { + return false; + } } else if (property.equals("powerGTtoughness")) { - return card.getNetPower() > card.getNetToughness(); + if (card.getNetPower() <= card.getNetToughness()) { + return false; + } } else if (property.equals("powerLTtoughness")) { - return card.getNetPower() < card.getNetToughness(); + if (card.getNetPower() >= card.getNetToughness()) { + return false; + } } else if (property.startsWith("power") || property.startsWith("toughness") || property.startsWith("cmc") || property.startsWith("totalPT")) { int x; @@ -1127,7 +1415,9 @@ public class CardProperty { x = AbilityUtils.calculateAmount(source, rhs, spellAbility); } - return Expressions.compare(y, property, x); + if (!Expressions.compare(y, property, x)) { + return false; + } } // syntax example: countersGE9 P1P1 or countersLT12TIME (greater number @@ -1163,7 +1453,9 @@ public class CardProperty { final int actualnumber = card.getCounters(CounterType.getType(counterType)); - return Expressions.compare(actualnumber, comparator, number); + if (!Expressions.compare(actualnumber, comparator, number)) { + return false; + } } // These predicated refer to ongoing combat. If no combat happens, they'll return false (meaning not attacking/blocking ATM) else if (property.startsWith("attacking")) { @@ -1173,18 +1465,26 @@ public class CardProperty { if (property.equals("attackingYou")) return combat.isAttacking(card, sourceController); if (property.equals("attackingYouOrYourPW")) { Player defender = combat.getDefenderPlayerByAttacker(card); - return sourceController.equals(defender); + if (!sourceController.equals(defender)) { + return false; + } } } else if (property.startsWith("notattacking")) { return null == combat || !combat.isAttacking(card); } else if (property.equals("attackedThisCombat")) { - return null != combat && card.getDamageHistory().getCreatureAttackedThisCombat(); + if (null == combat || !card.getDamageHistory().getCreatureAttackedThisCombat()) { + return false; + } } else if (property.equals("blockedThisCombat")) { - return null != combat && card.getDamageHistory().getCreatureBlockedThisCombat(); + if (null == combat || !card.getDamageHistory().getCreatureBlockedThisCombat()) { + return false; + } } else if (property.equals("attackedBySourceThisCombat")) { if (null == combat) return false; final GameEntity defender = combat.getDefenderByAttacker(source); - return !(defender instanceof Card) || card.equals(defender); + if (defender instanceof Card && !card.equals(defender)) { + return false; + } } else if (property.startsWith("blocking")) { if (null == combat) return false; String what = property.substring("blocking".length()); @@ -1211,7 +1511,9 @@ public class CardProperty { CardCollection sourceBlocking = new CardCollection(combat.getAttackersBlockedBy(source)); CardCollection thisBlocking = new CardCollection(combat.getAttackersBlockedBy(card)); - return !Collections.disjoint(sourceBlocking, thisBlocking); + if (Collections.disjoint(sourceBlocking, thisBlocking)) { + return false; + } } else if (property.startsWith("notblocking")) { return null == combat || !combat.isBlocking(card); } @@ -1282,27 +1584,35 @@ public class CardProperty { } return false; } else if (property.startsWith("unblocked")) { - return combat != null && combat.isUnblocked(card); + if (combat == null || !combat.isUnblocked(card)) { + return false; + } } else if (property.equals("attackersBandedWith")) { if (card.equals(source)) { // You don't band with yourself return false; } AttackingBand band = combat == null ? null : combat.getBandOfAttacker(source); - return band != null && band.getAttackers().contains(card); + if (band == null || !band.getAttackers().contains(card)) { + return false; + } } else if (property.startsWith("kicked")) { if (property.equals("kicked")) { - return card.getKickerMagnitude() != 0; + if (card.getKickerMagnitude() == 0) { + return false; + } } else { String s = property.split("kicked ")[1]; if ("1".equals(s) && !card.isOptionalCostPaid(OptionalCost.Kicker1)) return false; - return !"2".equals(s) || card.isOptionalCostPaid(OptionalCost.Kicker2); + if ("2".equals(s) && !card.isOptionalCostPaid(OptionalCost.Kicker2)) return false; } } else if (property.startsWith("notkicked")) { - return card.getKickerMagnitude() <= 0; + if (card.getKickerMagnitude() > 0) { + return false; + } } else if (property.startsWith("pseudokicked")) { if (property.equals("pseudokicked")) { - return card.isOptionalCostPaid(OptionalCost.Generic); + if (!card.isOptionalCostPaid(OptionalCost.Generic)) return false; } } else if (property.startsWith("surged")) { if (card.getCastSA() == null) { @@ -1330,19 +1640,33 @@ public class CardProperty { } return card.getCastSA().isSpectacle(); } else if (property.equals("HasDevoured")) { - return !card.getDevouredCards().isEmpty(); + if (card.getDevouredCards().isEmpty()) { + return false; + } } else if (property.equals("HasNotDevoured")) { - return card.getDevouredCards().isEmpty(); + if (!card.getDevouredCards().isEmpty()) { + return false; + } } else if (property.equals("IsMonstrous")) { - return card.isMonstrous(); + if (!card.isMonstrous()) { + return false; + } } else if (property.equals("IsNotMonstrous")) { - return !card.isMonstrous(); + if (card.isMonstrous()) { + return false; + } } else if (property.equals("IsUnearthed")) { - return card.isUnearthed(); + if (!card.isUnearthed()) { + return false; + } } else if (property.equals("IsRenowned")) { - return card.isRenowned(); + if (!card.isRenowned()) { + return false; + } } else if (property.equals("IsNotRenowned")) { - return !card.isRenowned(); + if (card.isRenowned()) { + return false; + } } else if (property.startsWith("RememberMap")) { System.out.println(source.getRememberMap()); for (SpellAbility sa : source.getSpellAbilities()) { @@ -1357,61 +1681,95 @@ public class CardProperty { } return false; } else if (property.equals("IsRemembered")) { - return source.isRemembered(card); + if (!source.isRemembered(card)) { + return false; + } } else if (property.equals("IsNotRemembered")) { - return !source.isRemembered(card); + if (source.isRemembered(card)) { + return false; + } } else if (property.equals("IsImprinted")) { - return source.hasImprintedCard(card); + if (!source.hasImprintedCard(card)) { + return false; + } } else if (property.equals("IsNotImprinted")) { - return !source.hasImprintedCard(card); + if (source.hasImprintedCard(card)) { + return false; + } } else if (property.equals("NoAbilities")) { - return (card.getAbilityText().trim().equals("") || card.isFaceDown()) && (card.getUnhiddenKeywords().isEmpty()); + if (!((card.getAbilityText().trim().equals("") || card.isFaceDown()) && (card.getUnhiddenKeywords().isEmpty()))) { + return false; + } } else if (property.equals("HasCounters")) { - return card.hasCounters(); + if (!card.hasCounters()) { + return false; + } } else if (property.equals("NoCounters")) { - return !card.hasCounters(); + if (card.hasCounters()) { + return false; + } } else if (property.startsWith("CastSa")) { SpellAbility castSA = card.getCastSA(); if (castSA == null) { return false; } String v = property.substring(7); - return castSA.isValid(v, sourceController, source, spellAbility); + if (!castSA.isValid(v, sourceController, source, spellAbility)) { + return false; + } } else if (property.equals("wasCast")) { - return null != card.getCastFrom(); + if (null == card.getCastFrom()) { + return false; + } } else if (property.equals("wasNotCast")) { - return null == card.getCastFrom(); + if (null != card.getCastFrom()) { + return false; + } } else if (property.startsWith("wasCastFrom")) { // How are we getting in here with a comma? final String strZone = property.split(",")[0].substring(11); final ZoneType realZone = ZoneType.smartValueOf(strZone); - return realZone == card.getCastFrom(); + if (realZone != card.getCastFrom()) { + return false; + } } else if (property.startsWith("wasNotCastFrom")) { final String strZone = property.substring(14); final ZoneType realZone = ZoneType.smartValueOf(strZone); - return realZone != card.getCastFrom(); + if (realZone == card.getCastFrom()) { + return false; + } } else if (property.startsWith("set")) { final String setCode = property.substring(3, 6); - return card.getSetCode().equals(setCode); + if (!card.getSetCode().equals(setCode)) { + return false; + } } else if (property.startsWith("inZone")) { final String strZone = property.substring(6); final ZoneType realZone = ZoneType.smartValueOf(strZone); // lki last zone does fall back to this zone final Zone lkiZone = lki.getLastKnownZone(); - return lkiZone != null && lkiZone.is(realZone); + if (lkiZone == null || !lkiZone.is(realZone)) { + return false; + } } else if (property.startsWith("inRealZone")) { final String strZone = property.substring(10); final ZoneType realZone = ZoneType.smartValueOf(strZone); - return card.isInZone(realZone); + if (!card.isInZone(realZone)) { + return false; + } } else if (property.equals("IsCommander")) { - return card.isCommander(); + if (!card.isCommander()) { + return false; + } } else { // StringType done in CardState - return card.getCurrentState().hasProperty(property, sourceController, source, spellAbility); + if (!card.getCurrentState().hasProperty(property, sourceController, source, spellAbility)) { + return false; + } } return true; } -} +} \ No newline at end of file diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 2be333bc7c5..6afce5fb824 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -79,7 +79,7 @@ public class Forge implements ApplicationListener { to prevent rendering issue when you try to restart the app again (seems it doesnt dispose correctly...?!?) */ - Gdx.input.setCatchBackKey(true); + Gdx.input.setCatchKey(Keys.BACK, true); destroyThis = true; //Prevent back() ForgePreferences prefs = new ForgePreferences(); @@ -126,8 +126,7 @@ public class Forge implements ApplicationListener { SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music destroyThis = false; //Allow back() - Gdx.input.setCatchBackKey(true); - Gdx.input.setCatchMenuKey(true); + Gdx.input.setCatchKey(Keys.MENU, true); openScreen(HomeScreen.instance); splashScreen = null; diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadService.java b/forge-gui/src/main/java/forge/download/GuiDownloadService.java index 88f39d77b95..8b7187332a0 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadService.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadService.java @@ -22,6 +22,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.InetSocketAddress; @@ -29,6 +30,7 @@ import java.net.MalformedURLException; import java.net.Proxy; import java.net.URL; import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; @@ -265,7 +267,9 @@ public abstract class GuiDownloadService implements Runnable { cardSkipped = true; //assume skipped unless saved successfully String url = kv.getValue(); //decode URL Key - String decodedKey = URLDecoder.decode(kv.getKey()); + String decodedKey = ""; + try { decodedKey = URLDecoder.decode(kv.getKey(), StandardCharsets.UTF_8.toString()); } + catch (UnsupportedEncodingException e) { Log.error("UTF-8 is unknown", e); } final File fileDest = new File(decodedKey); final String filePath = fileDest.getPath(); final String subLastIndex = filePath.contains("pics") ? "\\pics\\" : "\\db\\"; From 51ea20b1dfe5b3092994b391b716c3c01c785575 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 4 Sep 2019 02:15:13 +0800 Subject: [PATCH 15/68] Refactor Dynamic Planechase BG --- .../src/forge/assets/FSkinTexture.java | 175 ++-- .../src/forge/screens/match/MatchScreen.java | 814 +----------------- 2 files changed, 120 insertions(+), 869 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinTexture.java b/forge-gui-mobile/src/forge/assets/FSkinTexture.java index 1e5689ea45d..772d897cb24 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinTexture.java +++ b/forge-gui-mobile/src/forge/assets/FSkinTexture.java @@ -7,94 +7,99 @@ import com.badlogic.gdx.graphics.Texture.TextureWrap; import forge.Graphics; import forge.properties.ForgeConstants; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public enum FSkinTexture implements FImage { BG_TEXTURE(ForgeConstants.TEXTURE_BG_FILE, true, false), BG_MATCH(ForgeConstants.MATCH_BG_FILE, false, false), BG_SPACE(ForgeConstants.SPACE_BG_FILE, false, false), BG_CHAOS_WHEEL(ForgeConstants.CHAOS_WHEEL_IMG_FILE, false, false), - BG_PLANE1(ForgeConstants.BG_1, false, true), - BG_PLANE2(ForgeConstants.BG_2, false, true), - BG_PLANE3(ForgeConstants.BG_3, false, true), - BG_PLANE4(ForgeConstants.BG_4, false, true), - BG_PLANE5(ForgeConstants.BG_5, false, true), - BG_PLANE6(ForgeConstants.BG_6, false, true), - BG_PLANE7(ForgeConstants.BG_7, false, true), - BG_PLANE8(ForgeConstants.BG_8, false, true), - BG_PLANE9(ForgeConstants.BG_9, false, true), - BG_PLANE10(ForgeConstants.BG_10, false, true), - BG_PLANE11(ForgeConstants.BG_11, false, true), - BG_PLANE12(ForgeConstants.BG_12, false, true), - BG_PLANE13(ForgeConstants.BG_13, false, true), - BG_PLANE14(ForgeConstants.BG_14, false, true), - BG_PLANE15(ForgeConstants.BG_15, false, true), - BG_PLANE16(ForgeConstants.BG_16, false, true), - BG_PLANE17(ForgeConstants.BG_17, false, true), - BG_PLANE18(ForgeConstants.BG_18, false, true), - BG_PLANE19(ForgeConstants.BG_19, false, true), - BG_PLANE20(ForgeConstants.BG_20, false, true), - BG_PLANE21(ForgeConstants.BG_21, false, true), - BG_PLANE22(ForgeConstants.BG_22, false, true), - BG_PLANE23(ForgeConstants.BG_23, false, true), - BG_PLANE24(ForgeConstants.BG_24, false, true), - BG_PLANE25(ForgeConstants.BG_25, false, true), - BG_PLANE26(ForgeConstants.BG_26, false, true), - BG_PLANE27(ForgeConstants.BG_27, false, true), - BG_PLANE28(ForgeConstants.BG_28, false, true), - BG_PLANE29(ForgeConstants.BG_29, false, true), - BG_PLANE30(ForgeConstants.BG_30, false, true), - BG_PLANE31(ForgeConstants.BG_31, false, true), - BG_PLANE32(ForgeConstants.BG_32, false, true), - BG_PLANE33(ForgeConstants.BG_33, false, true), - BG_PLANE34(ForgeConstants.BG_34, false, true), - BG_PLANE35(ForgeConstants.BG_35, false, true), - BG_PLANE36(ForgeConstants.BG_36, false, true), - BG_PLANE37(ForgeConstants.BG_37, false, true), - BG_PLANE38(ForgeConstants.BG_38, false, true), - BG_PLANE39(ForgeConstants.BG_39, false, true), - BG_PLANE40(ForgeConstants.BG_40, false, true), - BG_PLANE41(ForgeConstants.BG_41, false, true), - BG_PLANE42(ForgeConstants.BG_42, false, true), - BG_PLANE43(ForgeConstants.BG_43, false, true), - BG_PLANE44(ForgeConstants.BG_44, false, true), - BG_PLANE45(ForgeConstants.BG_45, false, true), - BG_PLANE46(ForgeConstants.BG_46, false, true), - BG_PLANE47(ForgeConstants.BG_47, false, true), - BG_PLANE48(ForgeConstants.BG_48, false, true), - BG_PLANE49(ForgeConstants.BG_49, false, true), - BG_PLANE50(ForgeConstants.BG_50, false, true), - BG_PLANE51(ForgeConstants.BG_51, false, true), - BG_PLANE52(ForgeConstants.BG_52, false, true), - BG_PLANE53(ForgeConstants.BG_53, false, true), - BG_PLANE54(ForgeConstants.BG_54, false, true), - BG_PLANE55(ForgeConstants.BG_55, false, true), - BG_PLANE56(ForgeConstants.BG_56, false, true), - BG_PLANE57(ForgeConstants.BG_57, false, true), - BG_PLANE58(ForgeConstants.BG_58, false, true), - BG_PLANE59(ForgeConstants.BG_59, false, true), - BG_PLANE60(ForgeConstants.BG_60, false, true), - BG_PLANE61(ForgeConstants.BG_61, false, true), - BG_PLANE62(ForgeConstants.BG_62, false, true), - BG_PLANE63(ForgeConstants.BG_63, false, true), - BG_PLANE64(ForgeConstants.BG_64, false, true), - BG_PLANE65(ForgeConstants.BG_65, false, true), - BG_PLANE66(ForgeConstants.BG_66, false, true), - BG_PLANE67(ForgeConstants.BG_67, false, true), - BG_PLANE68(ForgeConstants.BG_68, false, true), - BG_PLANE69(ForgeConstants.BG_69, false, true), - BG_PLANE70(ForgeConstants.BG_70, false, true), - BG_PLANE71(ForgeConstants.BG_71, false, true), - BG_PLANE72(ForgeConstants.BG_72, false, true), - BG_PLANE73(ForgeConstants.BG_73, false, true), - BG_PLANE74(ForgeConstants.BG_74, false, true), - BG_PLANE75(ForgeConstants.BG_75, false, true), - BG_PLANE76(ForgeConstants.BG_76, false, true), - BG_PLANE77(ForgeConstants.BG_77, false, true), - BG_PLANE78(ForgeConstants.BG_78, false, true); + Academy_at_Tolaria_West(ForgeConstants.BG_1, false, true), + Agyrem(ForgeConstants.BG_2, false, true), + Akoum(ForgeConstants.BG_3, false, true), + Aretopolis(ForgeConstants.BG_4, false, true), + Astral_Arena(ForgeConstants.BG_5, false, true), + Bant(ForgeConstants.BG_6, false, true), + Bloodhill_Bastion(ForgeConstants.BG_7, false, true), + Cliffside_Market(ForgeConstants.BG_8, false, true), + Edge_of_Malacol(ForgeConstants.BG_9, false, true), + Eloren_Wilds(ForgeConstants.BG_10, false, true), + Feeding_Grounds(ForgeConstants.BG_11, false, true), + Fields_of_Summer(ForgeConstants.BG_12, false, true), + Furnace_Layer(ForgeConstants.BG_13, false, true), + Gavony(ForgeConstants.BG_14, false, true), + Glen_Elendra(ForgeConstants.BG_15, false, true), + Glimmervoid_Basin(ForgeConstants.BG_16, false, true), + Goldmeadow(ForgeConstants.BG_17, false, true), + Grand_Ossuary(ForgeConstants.BG_18, false, true), + Grixis(ForgeConstants.BG_19, false, true), + Grove_of_the_Dreampods(ForgeConstants.BG_20, false, true), + Hedron_Fields_of_Agadeem(ForgeConstants.BG_21, false, true), + Immersturm(ForgeConstants.BG_22, false, true), + Isle_of_Vesuva(ForgeConstants.BG_23, false, true), + Izzet_Steam_Maze(ForgeConstants.BG_24, false, true), + Jund(ForgeConstants.BG_25, false, true), + Kessig(ForgeConstants.BG_26, false, true), + Kharasha_Foothills(ForgeConstants.BG_27, false, true), + Kilnspire_District(ForgeConstants.BG_28, false, true), + Krosa(ForgeConstants.BG_29, false, true), + Lair_of_the_Ashen_Idol(ForgeConstants.BG_30, false, true), + Lethe_Lake(ForgeConstants.BG_31, false, true), + Llanowar(ForgeConstants.BG_32, false, true), + Minamo(ForgeConstants.BG_33, false, true), + Mount_Keralia(ForgeConstants.BG_34, false, true), + Murasa(ForgeConstants.BG_35, false, true), + Naar_Isle(ForgeConstants.BG_36, false, true), + Naya(ForgeConstants.BG_37, false, true), + Nephalia(ForgeConstants.BG_38, false, true), + Norns_Dominion(ForgeConstants.BG_39, false, true), + Onakke_Catacomb(ForgeConstants.BG_40, false, true), + Orochi_Colony(ForgeConstants.BG_41, false, true), + Orzhova(ForgeConstants.BG_42, false, true), + Otaria(ForgeConstants.BG_43, false, true), + Panopticon(ForgeConstants.BG_44, false, true), + Pools_of_Becoming(ForgeConstants.BG_45, false, true), + Prahv(ForgeConstants.BG_46, false, true), + Quicksilver_Sea(ForgeConstants.BG_47, false, true), + Ravens_Run(ForgeConstants.BG_48, false, true), + Sanctum_of_Serra(ForgeConstants.BG_49, false, true), + Sea_of_Sand(ForgeConstants.BG_50, false, true), + Selesnya_Loft_Gardens(ForgeConstants.BG_51, false, true), + Shiv(ForgeConstants.BG_52, false, true), + Skybreen(ForgeConstants.BG_53, false, true), + Sokenzan(ForgeConstants.BG_54, false, true), + Stairs_to_Infinity(ForgeConstants.BG_55, false, true), + Stensia(ForgeConstants.BG_56, false, true), + Stronghold_Furnace(ForgeConstants.BG_57, false, true), + Takenuma(ForgeConstants.BG_58, false, true), + Tazeem(ForgeConstants.BG_59, false, true), + The_Aether_Flues(ForgeConstants.BG_60, false, true), + The_Dark_Barony(ForgeConstants.BG_61, false, true), + The_Eon_Fog(ForgeConstants.BG_62, false, true), + The_Fourth_Sphere(ForgeConstants.BG_63, false, true), + The_Great_Forest(ForgeConstants.BG_64, false, true), + The_Hippodrome(ForgeConstants.BG_65, false, true), + The_Maelstrom(ForgeConstants.BG_66, false, true), + The_Zephyr_Maze(ForgeConstants.BG_67, false, true), + Trail_of_the_MageRings(ForgeConstants.BG_68, false, true), + Truga_Jungle(ForgeConstants.BG_69, false, true), + Turri_Island(ForgeConstants.BG_70, false, true), + Undercity_Reaches(ForgeConstants.BG_71, false, true), + Velis_Vel(ForgeConstants.BG_72, false, true), + Windriddle_Palaces(ForgeConstants.BG_73, false, true), + Tember_City(ForgeConstants.BG_74, false, true), + Celestine_Reef(ForgeConstants.BG_75, false, true), + Horizon_Boughs(ForgeConstants.BG_76, false, true), + Mirrored_Depths(ForgeConstants.BG_77, false, true), + Talon_Gates(ForgeConstants.BG_78, false, true); private final String filename; private final boolean repeat; private Texture texture; private final boolean isPlane; + private static List PlanesValue; FSkinTexture(String filename0, boolean repeat0, boolean isPlane0) { filename = filename0; @@ -102,6 +107,20 @@ public enum FSkinTexture implements FImage { isPlane = isPlane0; } + static { + PlanesValue = new ArrayList<>(); + for (FSkinTexture PlanesEnum : FSkinTexture.values()) { + PlanesValue.add(PlanesEnum.filename + .replace(".jpg", "") + .replace("'", "") + .replace("-", "")); + } + } + + public static List getValues() { + return Collections.unmodifiableList(PlanesValue); + } + public void load() { FileHandle preferredFile = isPlane ? FSkin.getCachePlanechaseFile(filename) : FSkin.getSkinFile(filename); if (preferredFile.exists()) { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 20c46b0c33a..3b86b71cda6 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -661,797 +661,29 @@ public class MatchScreen extends FScreen { float planeFullWidth; float scaledPlaneHeight; float planeHeight = midField + bottomPlayerPanel.getField().getHeight() - y; - switch (planeName) { - case "Academy at Tolaria West": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE1.getWidth() / FSkinTexture.BG_PLANE1.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE1, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Agyrem": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE2.getWidth() / FSkinTexture.BG_PLANE2.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE2, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Akoum": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE3.getWidth() / FSkinTexture.BG_PLANE3.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE3, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Aretopolis": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE4.getWidth() / FSkinTexture.BG_PLANE4.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE4, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Astral Arena": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE5.getWidth() / FSkinTexture.BG_PLANE5.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE5, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Bant": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE6.getWidth() / FSkinTexture.BG_PLANE6.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE6, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Bloodhill Bastion": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE7.getWidth() / FSkinTexture.BG_PLANE7.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE7, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Cliffside Market": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE8.getWidth() / FSkinTexture.BG_PLANE8.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE8, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Edge of Malacol": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE9.getWidth() / FSkinTexture.BG_PLANE9.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE9, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Eloren Wilds": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE10.getWidth() / FSkinTexture.BG_PLANE10.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE10, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Feeding Grounds": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE11.getWidth() / FSkinTexture.BG_PLANE11.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE11, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Fields of Summer": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE12.getWidth() / FSkinTexture.BG_PLANE12.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE12, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Furnace Layer": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE13.getWidth() / FSkinTexture.BG_PLANE13.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE13, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Gavony": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE14.getWidth() / FSkinTexture.BG_PLANE14.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE14, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Glen Elendra": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE15.getWidth() / FSkinTexture.BG_PLANE15.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE15, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Glimmervoid Basin": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE16.getWidth() / FSkinTexture.BG_PLANE16.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE16, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Goldmeadow": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE17.getWidth() / FSkinTexture.BG_PLANE17.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE17, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Grand Ossuary": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE18.getWidth() / FSkinTexture.BG_PLANE18.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE18, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Grixis": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE19.getWidth() / FSkinTexture.BG_PLANE19.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE19, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Grove of the Dreampods": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE20.getWidth() / FSkinTexture.BG_PLANE20.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE20, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Hedron Fields of Agadeem": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE21.getWidth() / FSkinTexture.BG_PLANE21.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE21, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Immersturm": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE22.getWidth() / FSkinTexture.BG_PLANE22.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE22, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Isle of Vesuva": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE23.getWidth() / FSkinTexture.BG_PLANE23.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE23, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Izzet Steam Maze": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE24.getWidth() / FSkinTexture.BG_PLANE24.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE24, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Jund": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE25.getWidth() / FSkinTexture.BG_PLANE25.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE25, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Kessig": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE26.getWidth() / FSkinTexture.BG_PLANE26.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE26, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Kharasha Foothills": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE27.getWidth() / FSkinTexture.BG_PLANE27.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE27, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Kilnspire District": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE28.getWidth() / FSkinTexture.BG_PLANE28.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE28, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Krosa": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE29.getWidth() / FSkinTexture.BG_PLANE29.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE29, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Lair of the Ashen Idol": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE30.getWidth() / FSkinTexture.BG_PLANE30.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE30, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Lethe Lake": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE31.getWidth() / FSkinTexture.BG_PLANE31.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE31, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Llanowar": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE32.getWidth() / FSkinTexture.BG_PLANE32.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE32, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Minamo": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE33.getWidth() / FSkinTexture.BG_PLANE33.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE33, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Mount Keralia": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE34.getWidth() / FSkinTexture.BG_PLANE34.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE34, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Murasa": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE35.getWidth() / FSkinTexture.BG_PLANE35.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE35, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Naar Isle": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE36.getWidth() / FSkinTexture.BG_PLANE36.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE36, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Naya": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE37.getWidth() / FSkinTexture.BG_PLANE37.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE37, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Nephalia": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE38.getWidth() / FSkinTexture.BG_PLANE38.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE38, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Norn's Dominion": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE39.getWidth() / FSkinTexture.BG_PLANE39.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE39, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Onakke Catacomb": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE40.getWidth() / FSkinTexture.BG_PLANE40.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE40, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Orochi Colony": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE41.getWidth() / FSkinTexture.BG_PLANE41.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE41, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Orzhova": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE42.getWidth() / FSkinTexture.BG_PLANE42.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE42, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Otaria": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE43.getWidth() / FSkinTexture.BG_PLANE43.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE43, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Panopticon": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE44.getWidth() / FSkinTexture.BG_PLANE44.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE44, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Pools of Becoming": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE45.getWidth() / FSkinTexture.BG_PLANE45.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE45, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Prahv": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE46.getWidth() / FSkinTexture.BG_PLANE46.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE46, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Quicksilver Sea": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE47.getWidth() / FSkinTexture.BG_PLANE47.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE47, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Raven's Run": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE48.getWidth() / FSkinTexture.BG_PLANE48.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE48, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Sanctum of Serra": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE49.getWidth() / FSkinTexture.BG_PLANE49.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE49, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Sea of Sand": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE50.getWidth() / FSkinTexture.BG_PLANE50.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE50, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Selesnya Loft Gardens": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE51.getWidth() / FSkinTexture.BG_PLANE51.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE51, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Shiv": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE52.getWidth() / FSkinTexture.BG_PLANE52.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE52, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Skybreen": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE53.getWidth() / FSkinTexture.BG_PLANE53.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE53, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Sokenzan": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE54.getWidth() / FSkinTexture.BG_PLANE54.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE54, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Stairs to Infinity": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE55.getWidth() / FSkinTexture.BG_PLANE55.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE55, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Stensia": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE56.getWidth() / FSkinTexture.BG_PLANE56.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE56, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Stronghold Furnace": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE57.getWidth() / FSkinTexture.BG_PLANE57.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE57, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Takenuma": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE58.getWidth() / FSkinTexture.BG_PLANE58.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE58, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Tazeem": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE59.getWidth() / FSkinTexture.BG_PLANE59.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE59, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Aether Flues": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE60.getWidth() / FSkinTexture.BG_PLANE60.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE60, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Dark Barony": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE61.getWidth() / FSkinTexture.BG_PLANE61.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE61, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Eon Fog": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE62.getWidth() / FSkinTexture.BG_PLANE62.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE62, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Fourth Sphere": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE63.getWidth() / FSkinTexture.BG_PLANE63.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE63, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Great Forest": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE64.getWidth() / FSkinTexture.BG_PLANE64.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE64, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Hippodrome": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE65.getWidth() / FSkinTexture.BG_PLANE65.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE65, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Maelstrom": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE66.getWidth() / FSkinTexture.BG_PLANE66.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE66, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "The Zephyr Maze": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE67.getWidth() / FSkinTexture.BG_PLANE67.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE67, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Trail of the Mage-Rings": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE68.getWidth() / FSkinTexture.BG_PLANE68.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE68, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Truga Jungle": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE69.getWidth() / FSkinTexture.BG_PLANE69.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE69, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Turri Island": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE70.getWidth() / FSkinTexture.BG_PLANE70.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE70, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Undercity Reaches": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE71.getWidth() / FSkinTexture.BG_PLANE71.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE71, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Velis Vel": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE72.getWidth() / FSkinTexture.BG_PLANE72.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE72, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Windriddle Palaces": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE73.getWidth() / FSkinTexture.BG_PLANE73.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE73, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Tember City": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE74.getWidth() / FSkinTexture.BG_PLANE74.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE74, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Celestine Reef": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE75.getWidth() / FSkinTexture.BG_PLANE75.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE75, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Horizon Boughs": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE76.getWidth() / FSkinTexture.BG_PLANE76.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE76, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Mirrored Depths": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE77.getWidth() / FSkinTexture.BG_PLANE77.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE77, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - case "Talon Gates": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE78.getWidth() / FSkinTexture.BG_PLANE78.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE78, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - break; - - default: { - planeFullWidth = planeHeight * FSkinTexture.BG_MATCH.getWidth() / FSkinTexture.BG_MATCH.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_MATCH, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } + String imageName = planeName + .replace(" ", "_") + .replace("'", "") + .replace("-", ""); + if (FSkinTexture.getValues().contains(imageName)) + { + planeFullWidth = planeHeight * FSkinTexture.valueOf(imageName).getWidth() / FSkinTexture.valueOf(imageName).getHeight(); + if (planeFullWidth < w) { + scaledPlaneHeight = w * (planeHeight / planeFullWidth); + planeFullWidth = w; + planeHeight = scaledPlaneHeight; + } + g.drawImage(FSkinTexture.valueOf(imageName), x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); + } + else + { + planeFullWidth = planeHeight * FSkinTexture.BG_MATCH.getWidth() / FSkinTexture.BG_MATCH.getHeight(); + if (planeFullWidth < w) { + scaledPlaneHeight = w * (planeHeight / planeFullWidth); + planeFullWidth = w; + planeHeight = scaledPlaneHeight; + } + g.drawImage(FSkinTexture.BG_MATCH, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); } } } From c05558c4ae8b8ecf6cd00055d177d42cd7938351 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 4 Sep 2019 01:48:35 +0000 Subject: [PATCH 16/68] Update README.txt for release --- forge-gui/README.txt | 82 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 11b369846f2..85dd6de6bbd 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1 +1,81 @@ -This file is automatically updated by our release bot on Discord, Blacksmith. It is created from the files present in the 'release-files' directory. Please do not hand-edit this file if using the bot to perform a release, as your changes will be overwritten. \ No newline at end of file +Forge: 09/04/2019 ver 1.6.28 + +19173 cards in total. + + +-------------- +Release Notes: +-------------- + +- Bug fixes - +As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. + +------------- +Known Issues: +------------- + +Known issues are here: https://git.cardforge.org/core-developers/forge/issues + +Feel free to report your own there if you have any. + +------------- +Installation: +------------- + +The Forge archive includes a MANUAL.txt file and we ask that you spend a few minutes reading this file as it contains some information that may prove useful. We do tend to update this file at times and you should quickly read this file and look for new information for each and every new release. Thank you. + +The archive format used for the Forge distribution is ".tar.bz2". There are utilities for Windows, Mac OS and the various *nix's that can be used to extract/decompress these ".tar.bz2" archives. We recommend that you extract/decompress the Forge archive into a new and unused folder. + +Some people use the Windows application 7zip. This utility can be found at http://www.7-zip.org/download.html. Mac users can double click on the archive and the application Archive Utility will launch and extract the archive. Mac users do not need to download a separate utility. + +Once the Forge archive has been decompressed you should then be able to launch Forge by using the included launcher. Launching Forge by double clicking on the forge jar file in the past caused a java heap space error. Forge's memory requirements have increased over time and the launchers increase the java heap space available to Forge. Currently you can launch Forge by double clicking on the forge jar file without a java heap space error but this is likely to change as we add in more sounds, icons, etc. + +- The Mac OS application version - +We provide separate macOS builds of desktop and mobile (backported) Forge packaged as native Mac applications. Please check the relevant thread for details and download links. + + +- Online Multiplayer - +For local network play you should only need two systems running Forge. One to host and one to join and play. For remote (over the Internet) play you will need to ensure that the port used (36743 by default) is forwarded to the hosting machine. + +-------------------- +Active Contributors: +-------------------- + +Agetian +apantel +Austinio7116 +Churrufli +DrDev +excessum +Flair +Gos +Hanmac +Indigo Dragon +Jamin Collins +kevlahnota +KrazyTheFox +Luke +Marek14 +mcrawford620 +Meerkov +Myrd +nefigah +OgreBattlecruiser +pfps +Seravy +Sirspud +Sloth +slyfox7777777 +Sol +Swordshine +tjtillman +tojammot +torridus +Xyx +Zuchinni + +(If you think your name should be on this list, add it with your next contribution) + +(Quest icons used created by Teekatas, from his Legendora set http://raindropmemory.deviantart.com) +(Thanks to the XMage team for permission to use their targeting arrows.) +(Thanks to http://www.freesound.org/browse/ for providing some sound files.) \ No newline at end of file From 367dab571d655880cf4f7e99f377d9f94342e526 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 4 Sep 2019 01:51:04 +0000 Subject: [PATCH 17/68] [maven-release-plugin] prepare release forge-1.6.28 --- forge-ai/pom.xml | 2 +- forge-core/pom.xml | 2 +- forge-game/pom.xml | 2 +- forge-gui-android/pom.xml | 2 +- forge-gui-desktop/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile/pom.xml | 2 +- forge-gui/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index b84adeea7d5..2eee2651fec 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 6d1913363d1..036db49b65a 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 898e378a0a9..4ffb8dfa14e 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 463b1cd39af..3887278ece9 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 9d7e5e8dc9d..3ad037223f1 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 628d3d9210c..f3ca58f27cd 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 4e745345768..6bca2296050 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 79bc4accf79..d9527a7311a 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 4e4c32c1e39..28416e8afc1 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.28 forge-gui diff --git a/pom.xml b/pom.xml index d3d17cf28d0..1daaec205cb 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.28-SNAPSHOT + 1.6.28 Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. @@ -175,7 +175,7 @@ scm:git:ssh://git@git.cardforge.org/core-developers/forge.git scm:git:ssh://git@git.cardforge.org/core-developers/forge.git - HEAD + forge-1.6.28 From 10877ca143a2a5b863e3de06aabd1a73c3749e18 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 4 Sep 2019 01:51:10 +0000 Subject: [PATCH 18/68] [maven-release-plugin] prepare for next development iteration --- forge-ai/pom.xml | 2 +- forge-core/pom.xml | 2 +- forge-game/pom.xml | 2 +- forge-gui-android/pom.xml | 2 +- forge-gui-desktop/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile/pom.xml | 2 +- forge-gui/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index 2eee2651fec..eb808066d02 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 036db49b65a..de96bebf9b6 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 4ffb8dfa14e..ee375af6f5b 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 3887278ece9..2028698e0aa 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 3ad037223f1..2f70bf99f2c 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index f3ca58f27cd..49a8543ad94 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 6bca2296050..5a552e6fc65 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index d9527a7311a..7b5224aa9c6 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 28416e8afc1..a557a58da68 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28 + 1.6.29-SNAPSHOT forge-gui diff --git a/pom.xml b/pom.xml index 1daaec205cb..6a943a4ba4f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.28 + 1.6.29-SNAPSHOT Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. @@ -175,7 +175,7 @@ scm:git:ssh://git@git.cardforge.org/core-developers/forge.git scm:git:ssh://git@git.cardforge.org/core-developers/forge.git - forge-1.6.28 + HEAD From c78bfbe631eaef4f2552e77d8d4fa5beb19052d8 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 4 Sep 2019 01:55:50 +0000 Subject: [PATCH 19/68] Clear out release files in preparation for next release --- forge-gui/README.txt | 82 +------------------------------------------- 1 file changed, 1 insertion(+), 81 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 85dd6de6bbd..11b369846f2 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,81 +1 @@ -Forge: 09/04/2019 ver 1.6.28 - -19173 cards in total. - - --------------- -Release Notes: --------------- - -- Bug fixes - -As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. - -------------- -Known Issues: -------------- - -Known issues are here: https://git.cardforge.org/core-developers/forge/issues - -Feel free to report your own there if you have any. - -------------- -Installation: -------------- - -The Forge archive includes a MANUAL.txt file and we ask that you spend a few minutes reading this file as it contains some information that may prove useful. We do tend to update this file at times and you should quickly read this file and look for new information for each and every new release. Thank you. - -The archive format used for the Forge distribution is ".tar.bz2". There are utilities for Windows, Mac OS and the various *nix's that can be used to extract/decompress these ".tar.bz2" archives. We recommend that you extract/decompress the Forge archive into a new and unused folder. - -Some people use the Windows application 7zip. This utility can be found at http://www.7-zip.org/download.html. Mac users can double click on the archive and the application Archive Utility will launch and extract the archive. Mac users do not need to download a separate utility. - -Once the Forge archive has been decompressed you should then be able to launch Forge by using the included launcher. Launching Forge by double clicking on the forge jar file in the past caused a java heap space error. Forge's memory requirements have increased over time and the launchers increase the java heap space available to Forge. Currently you can launch Forge by double clicking on the forge jar file without a java heap space error but this is likely to change as we add in more sounds, icons, etc. - -- The Mac OS application version - -We provide separate macOS builds of desktop and mobile (backported) Forge packaged as native Mac applications. Please check the relevant thread for details and download links. - - -- Online Multiplayer - -For local network play you should only need two systems running Forge. One to host and one to join and play. For remote (over the Internet) play you will need to ensure that the port used (36743 by default) is forwarded to the hosting machine. - --------------------- -Active Contributors: --------------------- - -Agetian -apantel -Austinio7116 -Churrufli -DrDev -excessum -Flair -Gos -Hanmac -Indigo Dragon -Jamin Collins -kevlahnota -KrazyTheFox -Luke -Marek14 -mcrawford620 -Meerkov -Myrd -nefigah -OgreBattlecruiser -pfps -Seravy -Sirspud -Sloth -slyfox7777777 -Sol -Swordshine -tjtillman -tojammot -torridus -Xyx -Zuchinni - -(If you think your name should be on this list, add it with your next contribution) - -(Quest icons used created by Teekatas, from his Legendora set http://raindropmemory.deviantart.com) -(Thanks to the XMage team for permission to use their targeting arrows.) -(Thanks to http://www.freesound.org/browse/ for providing some sound files.) \ No newline at end of file +This file is automatically updated by our release bot on Discord, Blacksmith. It is created from the files present in the 'release-files' directory. Please do not hand-edit this file if using the bot to perform a release, as your changes will be overwritten. \ No newline at end of file From 5876ee822066bcd6f0f383b54b419cf80b39181b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 4 Sep 2019 12:23:36 +0800 Subject: [PATCH 20/68] Removed redundant code --- .../src/forge/screens/match/MatchScreen.java | 52 ++++++------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 3b86b71cda6..c0fdfdc67ec 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -505,14 +505,25 @@ public class MatchScreen extends FScreen { float x = topPlayerPanel.getField().getLeft(); float y = midField - topPlayerPanel.getField().getHeight(); float w = getWidth() - x; - + float bgFullWidth, scaledbgHeight; + float bgHeight = midField + bottomPlayerPanel.getField().getHeight() - y; if(FModel.getPreferences().getPrefBoolean(FPref.UI_DYNAMIC_PLANECHASE_BG) - && hasActivePlane()) - setPlanarBG(g, getPlaneName(), x, y, w, midField); + && hasActivePlane()) { + String imageName = getPlaneName() + .replace(" ", "_") + .replace("'", "") + .replace("-", ""); + if (FSkinTexture.getValues().contains(imageName)) { + bgFullWidth = bgHeight * FSkinTexture.valueOf(imageName).getWidth() / FSkinTexture.valueOf(imageName).getHeight(); + if (bgFullWidth < w) { + scaledbgHeight = w * (bgHeight / bgFullWidth); + bgFullWidth = w; + bgHeight = scaledbgHeight; + } + g.drawImage(FSkinTexture.valueOf(imageName), x + (w - bgFullWidth) / 2, y, bgFullWidth, bgHeight, true); + } + } else { - float bgFullWidth; - float scaledbgHeight; - float bgHeight = midField + bottomPlayerPanel.getField().getHeight() - y; bgFullWidth = bgHeight * FSkinTexture.BG_MATCH.getWidth() / FSkinTexture.BG_MATCH.getHeight(); if (bgFullWidth < w) { scaledbgHeight = w * (bgHeight / bgFullWidth); @@ -657,34 +668,5 @@ public class MatchScreen extends FScreen { } return false; } - private void setPlanarBG(Graphics g, String planeName, float x, float y, float w, float midField ){ - float planeFullWidth; - float scaledPlaneHeight; - float planeHeight = midField + bottomPlayerPanel.getField().getHeight() - y; - String imageName = planeName - .replace(" ", "_") - .replace("'", "") - .replace("-", ""); - if (FSkinTexture.getValues().contains(imageName)) - { - planeFullWidth = planeHeight * FSkinTexture.valueOf(imageName).getWidth() / FSkinTexture.valueOf(imageName).getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.valueOf(imageName), x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight, true); - } - else - { - planeFullWidth = planeHeight * FSkinTexture.BG_MATCH.getWidth() / FSkinTexture.BG_MATCH.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_MATCH, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - } } } From 26241e3ef89d0750b05add3ab924e6304a0200e9 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 25 Aug 2019 13:10:12 +0800 Subject: [PATCH 21/68] Add a ForceRevealToController param for Narset, Parter of Veils if no card is valid --- forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt b/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt index b402d8903a7..f3e54e728bc 100644 --- a/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt +++ b/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt @@ -3,5 +3,5 @@ ManaCost:1 U U Types:Legendary Planeswalker Narset Loyalty:5 S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ You can't draw more than one card each turn. | Description$ Each opponent can't draw more than one card each turn. -A:AB$ Dig | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Card.nonCreature+nonLand | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +A:AB$ Dig | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Card.nonCreature+nonLand | RestRandomOrder$ True | ForceRevealToController$ True | SpellDescription$ Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. Oracle:Each opponent can't draw more than one card each turn.\n[-2]: Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. From 4931857b8ceee2ad2a6831dcb427e462f4c1f609 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 25 Aug 2019 21:19:55 +0800 Subject: [PATCH 22/68] Update Transmute Artifact --- forge-gui/res/cardsfolder/t/transmute_artifact.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/t/transmute_artifact.txt b/forge-gui/res/cardsfolder/t/transmute_artifact.txt index e50e51028e4..8ccedb74d00 100644 --- a/forge-gui/res/cardsfolder/t/transmute_artifact.txt +++ b/forge-gui/res/cardsfolder/t/transmute_artifact.txt @@ -6,8 +6,8 @@ SVar:StoreCanSearch:DB$ StoreSVar | SVar$ SackedCMC | Type$ Number | Expression$ SVar:StoreCMC:DB$ StoreSVar | SVar$ SackedCMC | Type$ Calculate | Expression$ Y | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBClear SVar:DBClear:DB$ Cleanup | ClearRemembered$ True | SubAbility$ SearchLibrary SVar:SearchLibrary:DB$ ChangeZone | Origin$ Library | Destination$ Library | ChangeType$ Artifact | ChangeNum$ 1 | SubAbility$ EqualTransmute | StackDescription$ None | RememberChanged$ True | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ GE0 -SVar:EqualTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ GEY | SubAbility$ PayForTransmute | StackDescription$ None -SVar:PayForTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ LTY | UnlessCost$ X | UnlessPayer$ You | UnlessSwitched$ True | StackDescription$ None | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 +SVar:EqualTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ GEY | References$ Y | SubAbility$ PayForTransmute | StackDescription$ None +SVar:PayForTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ LTY | UnlessCost$ X | References$ X,Y | UnlessPayer$ You | UnlessSwitched$ True | StackDescription$ None | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 # Everything working but when no artifact is sacrificed # SackedCMC to be overridden to see if a sacrifice actually happened SVar:Y:Remembered$CardManaCost From 01094fb4e50d4eae9900f010873e22da8c091380 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 1 Sep 2019 21:09:26 +0800 Subject: [PATCH 23/68] Add a "References$ X" param --- forge-gui/res/cardsfolder/l/lake_of_the_dead.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt b/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt index badb1aee8bc..215a4e90b95 100644 --- a/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt @@ -5,8 +5,8 @@ A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T Sac<1/Swamp> | Produced$ B | Amount$ 4 | SpellDescription$ Add {B}{B}{B}{B}. R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | ReplaceWith$ PayBeforeETB | Description$ If CARDNAME would enter the battlefield, sacrifice a Swamp instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. SVar:PayBeforeETB:DB$ Sacrifice | SacValid$ Swamp | Defined$ You | RememberSacrificed$ True | SubAbility$ MoveToGraveyard -SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup +SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ MoveToBattlefield +SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount AI:RemoveDeck:All From 1bb12a2ce6ab23de0c6ede4c699b59df130ac3b6 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 4 Sep 2019 13:43:50 +0800 Subject: [PATCH 24/68] CLeanup the upcoming folder for the ELD spoiler --- forge-gui/res/cardsfolder/{upcoming => a}/aeon_engine.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/anje_falkenrath.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/anjes_ravager.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/apex_altisaur.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/archfiend_of_spite.txt | 0 .../res/cardsfolder/{upcoming => a}/atla_palani_nest_tender.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/backdraft_hellkite.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bloodthirsty_blade.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bone_miser.txt | 0 .../res/cardsfolder/{upcoming => c}/chainer_nightmare_adept.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cliffside_rescuer.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/commanders_insignia.txt | 0 .../res/cardsfolder/{upcoming => c}/curse_of_fools_wisdom.txt | 0 .../res/cardsfolder/{upcoming => d}/dockside_extortionist.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/doomed_artisan.txt | 0 .../res/cardsfolder/{upcoming => e}/elsha_of_the_infinite.txt | 0 .../res/cardsfolder/{upcoming => e}/empowered_autogenerator.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/full_flowering.txt | 0 .../res/cardsfolder/{upcoming => g}/gerrard_weatherlight_hero.txt | 0 .../res/cardsfolder/{upcoming => g}/ghired_conclave_exile.txt | 0 .../res/cardsfolder/{upcoming => g}/ghireds_belligerence.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gift_of_doom.txt | 0 .../res/cardsfolder/{upcoming => g}/greven_predator_captain.txt | 0 .../res/cardsfolder/{upcoming => g}/grismold_the_dreadsower.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hate_mirage.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/idol_of_oblivion.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/ignite_the_future.txt | 0 .../res/cardsfolder/{upcoming => k}/kadena_slinking_sorcerer.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kadenas_silencer.txt | 0 .../res/cardsfolder/{upcoming => k}/krrik_son_of_yawgmoth.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/leadership_vacuum.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mandate_of_peace.txt | 0 .../cardsfolder/{upcoming => m}/marisi_breaker_of_the_coil.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mass_diminish.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mire_in_misery.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/nightmare_unmaking.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/ohran_frostfang.txt | 0 .../res/cardsfolder/{upcoming => p}/pendant_of_prosperity.txt | 0 .../res/cardsfolder/{upcoming => p}/pramikon_sky_rampart.txt | 0 .../cardsfolder/{upcoming => r}/rayami_first_of_the_fallen.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/road_of_return.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sanctum_of_eternity.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scaretiller.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scroll_of_fate.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/selesnya_eulogist.txt | 0 .../res/cardsfolder/{upcoming => s}/sevinne_the_chronoclasm.txt | 0 .../res/cardsfolder/{upcoming => s}/sevinnes_reclamation.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/skyfire_phoenix.txt | 0 .../res/cardsfolder/{upcoming => s}/song_of_the_worldsoul.txt | 0 .../res/cardsfolder/{upcoming => t}/tahngarth_first_mate.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tectonic_hellion.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thalias_geistcaller.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thieving_amalgam.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thought_sponge.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/voice_of_many.txt | 0 .../res/cardsfolder/{upcoming => v}/volrath_the_shapestealer.txt | 0 .../res/cardsfolder/{upcoming => w}/wall_of_stolen_identity.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/wildfire_devils.txt | 0 58 files changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/cardsfolder/{upcoming => a}/aeon_engine.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/anje_falkenrath.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/anjes_ravager.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/apex_altisaur.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/archfiend_of_spite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/atla_palani_nest_tender.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/backdraft_hellkite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bloodthirsty_blade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bone_miser.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/chainer_nightmare_adept.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cliffside_rescuer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/commanders_insignia.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/curse_of_fools_wisdom.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dockside_extortionist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/doomed_artisan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/elsha_of_the_infinite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/empowered_autogenerator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/full_flowering.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gerrard_weatherlight_hero.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/ghired_conclave_exile.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/ghireds_belligerence.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gift_of_doom.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/greven_predator_captain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/grismold_the_dreadsower.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hate_mirage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/idol_of_oblivion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/ignite_the_future.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kadena_slinking_sorcerer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kadenas_silencer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/krrik_son_of_yawgmoth.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/leadership_vacuum.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mandate_of_peace.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/marisi_breaker_of_the_coil.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mass_diminish.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mire_in_misery.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/nightmare_unmaking.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/ohran_frostfang.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pendant_of_prosperity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pramikon_sky_rampart.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rayami_first_of_the_fallen.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/road_of_return.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sanctum_of_eternity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scaretiller.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scroll_of_fate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/selesnya_eulogist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sevinne_the_chronoclasm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sevinnes_reclamation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/skyfire_phoenix.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/song_of_the_worldsoul.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tahngarth_first_mate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tectonic_hellion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thalias_geistcaller.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thieving_amalgam.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thought_sponge.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/voice_of_many.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/volrath_the_shapestealer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wall_of_stolen_identity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wildfire_devils.txt (100%) diff --git a/forge-gui/res/cardsfolder/upcoming/aeon_engine.txt b/forge-gui/res/cardsfolder/a/aeon_engine.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/aeon_engine.txt rename to forge-gui/res/cardsfolder/a/aeon_engine.txt diff --git a/forge-gui/res/cardsfolder/upcoming/anje_falkenrath.txt b/forge-gui/res/cardsfolder/a/anje_falkenrath.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/anje_falkenrath.txt rename to forge-gui/res/cardsfolder/a/anje_falkenrath.txt diff --git a/forge-gui/res/cardsfolder/upcoming/anjes_ravager.txt b/forge-gui/res/cardsfolder/a/anjes_ravager.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/anjes_ravager.txt rename to forge-gui/res/cardsfolder/a/anjes_ravager.txt diff --git a/forge-gui/res/cardsfolder/upcoming/apex_altisaur.txt b/forge-gui/res/cardsfolder/a/apex_altisaur.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/apex_altisaur.txt rename to forge-gui/res/cardsfolder/a/apex_altisaur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt b/forge-gui/res/cardsfolder/a/archfiend_of_spite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt rename to forge-gui/res/cardsfolder/a/archfiend_of_spite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/atla_palani_nest_tender.txt b/forge-gui/res/cardsfolder/a/atla_palani_nest_tender.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/atla_palani_nest_tender.txt rename to forge-gui/res/cardsfolder/a/atla_palani_nest_tender.txt diff --git a/forge-gui/res/cardsfolder/upcoming/backdraft_hellkite.txt b/forge-gui/res/cardsfolder/b/backdraft_hellkite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/backdraft_hellkite.txt rename to forge-gui/res/cardsfolder/b/backdraft_hellkite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bloodthirsty_blade.txt b/forge-gui/res/cardsfolder/b/bloodthirsty_blade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bloodthirsty_blade.txt rename to forge-gui/res/cardsfolder/b/bloodthirsty_blade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bone_miser.txt b/forge-gui/res/cardsfolder/b/bone_miser.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bone_miser.txt rename to forge-gui/res/cardsfolder/b/bone_miser.txt diff --git a/forge-gui/res/cardsfolder/upcoming/chainer_nightmare_adept.txt b/forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/chainer_nightmare_adept.txt rename to forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cliffside_rescuer.txt b/forge-gui/res/cardsfolder/c/cliffside_rescuer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cliffside_rescuer.txt rename to forge-gui/res/cardsfolder/c/cliffside_rescuer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/commanders_insignia.txt b/forge-gui/res/cardsfolder/c/commanders_insignia.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/commanders_insignia.txt rename to forge-gui/res/cardsfolder/c/commanders_insignia.txt diff --git a/forge-gui/res/cardsfolder/upcoming/curse_of_fools_wisdom.txt b/forge-gui/res/cardsfolder/c/curse_of_fools_wisdom.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/curse_of_fools_wisdom.txt rename to forge-gui/res/cardsfolder/c/curse_of_fools_wisdom.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dockside_extortionist.txt b/forge-gui/res/cardsfolder/d/dockside_extortionist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dockside_extortionist.txt rename to forge-gui/res/cardsfolder/d/dockside_extortionist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/doomed_artisan.txt b/forge-gui/res/cardsfolder/d/doomed_artisan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/doomed_artisan.txt rename to forge-gui/res/cardsfolder/d/doomed_artisan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elsha_of_the_infinite.txt b/forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elsha_of_the_infinite.txt rename to forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/empowered_autogenerator.txt b/forge-gui/res/cardsfolder/e/empowered_autogenerator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/empowered_autogenerator.txt rename to forge-gui/res/cardsfolder/e/empowered_autogenerator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/full_flowering.txt b/forge-gui/res/cardsfolder/f/full_flowering.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/full_flowering.txt rename to forge-gui/res/cardsfolder/f/full_flowering.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gerrard_weatherlight_hero.txt b/forge-gui/res/cardsfolder/g/gerrard_weatherlight_hero.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gerrard_weatherlight_hero.txt rename to forge-gui/res/cardsfolder/g/gerrard_weatherlight_hero.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ghired_conclave_exile.txt b/forge-gui/res/cardsfolder/g/ghired_conclave_exile.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ghired_conclave_exile.txt rename to forge-gui/res/cardsfolder/g/ghired_conclave_exile.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ghireds_belligerence.txt b/forge-gui/res/cardsfolder/g/ghireds_belligerence.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ghireds_belligerence.txt rename to forge-gui/res/cardsfolder/g/ghireds_belligerence.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gift_of_doom.txt b/forge-gui/res/cardsfolder/g/gift_of_doom.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gift_of_doom.txt rename to forge-gui/res/cardsfolder/g/gift_of_doom.txt diff --git a/forge-gui/res/cardsfolder/upcoming/greven_predator_captain.txt b/forge-gui/res/cardsfolder/g/greven_predator_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/greven_predator_captain.txt rename to forge-gui/res/cardsfolder/g/greven_predator_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/grismold_the_dreadsower.txt b/forge-gui/res/cardsfolder/g/grismold_the_dreadsower.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/grismold_the_dreadsower.txt rename to forge-gui/res/cardsfolder/g/grismold_the_dreadsower.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hate_mirage.txt b/forge-gui/res/cardsfolder/h/hate_mirage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hate_mirage.txt rename to forge-gui/res/cardsfolder/h/hate_mirage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/idol_of_oblivion.txt b/forge-gui/res/cardsfolder/i/idol_of_oblivion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/idol_of_oblivion.txt rename to forge-gui/res/cardsfolder/i/idol_of_oblivion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ignite_the_future.txt b/forge-gui/res/cardsfolder/i/ignite_the_future.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ignite_the_future.txt rename to forge-gui/res/cardsfolder/i/ignite_the_future.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kadena_slinking_sorcerer.txt b/forge-gui/res/cardsfolder/k/kadena_slinking_sorcerer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kadena_slinking_sorcerer.txt rename to forge-gui/res/cardsfolder/k/kadena_slinking_sorcerer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kadenas_silencer.txt b/forge-gui/res/cardsfolder/k/kadenas_silencer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kadenas_silencer.txt rename to forge-gui/res/cardsfolder/k/kadenas_silencer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/krrik_son_of_yawgmoth.txt b/forge-gui/res/cardsfolder/k/krrik_son_of_yawgmoth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/krrik_son_of_yawgmoth.txt rename to forge-gui/res/cardsfolder/k/krrik_son_of_yawgmoth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/leadership_vacuum.txt b/forge-gui/res/cardsfolder/l/leadership_vacuum.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/leadership_vacuum.txt rename to forge-gui/res/cardsfolder/l/leadership_vacuum.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mandate_of_peace.txt b/forge-gui/res/cardsfolder/m/mandate_of_peace.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mandate_of_peace.txt rename to forge-gui/res/cardsfolder/m/mandate_of_peace.txt diff --git a/forge-gui/res/cardsfolder/upcoming/marisi_breaker_of_the_coil.txt b/forge-gui/res/cardsfolder/m/marisi_breaker_of_the_coil.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/marisi_breaker_of_the_coil.txt rename to forge-gui/res/cardsfolder/m/marisi_breaker_of_the_coil.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mass_diminish.txt b/forge-gui/res/cardsfolder/m/mass_diminish.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mass_diminish.txt rename to forge-gui/res/cardsfolder/m/mass_diminish.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mire_in_misery.txt b/forge-gui/res/cardsfolder/m/mire_in_misery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mire_in_misery.txt rename to forge-gui/res/cardsfolder/m/mire_in_misery.txt diff --git a/forge-gui/res/cardsfolder/upcoming/nightmare_unmaking.txt b/forge-gui/res/cardsfolder/n/nightmare_unmaking.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nightmare_unmaking.txt rename to forge-gui/res/cardsfolder/n/nightmare_unmaking.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ohran_frostfang.txt b/forge-gui/res/cardsfolder/o/ohran_frostfang.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ohran_frostfang.txt rename to forge-gui/res/cardsfolder/o/ohran_frostfang.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pendant_of_prosperity.txt b/forge-gui/res/cardsfolder/p/pendant_of_prosperity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pendant_of_prosperity.txt rename to forge-gui/res/cardsfolder/p/pendant_of_prosperity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pramikon_sky_rampart.txt b/forge-gui/res/cardsfolder/p/pramikon_sky_rampart.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pramikon_sky_rampart.txt rename to forge-gui/res/cardsfolder/p/pramikon_sky_rampart.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rayami_first_of_the_fallen.txt b/forge-gui/res/cardsfolder/r/rayami_first_of_the_fallen.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rayami_first_of_the_fallen.txt rename to forge-gui/res/cardsfolder/r/rayami_first_of_the_fallen.txt diff --git a/forge-gui/res/cardsfolder/upcoming/road_of_return.txt b/forge-gui/res/cardsfolder/r/road_of_return.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/road_of_return.txt rename to forge-gui/res/cardsfolder/r/road_of_return.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sanctum_of_eternity.txt b/forge-gui/res/cardsfolder/s/sanctum_of_eternity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sanctum_of_eternity.txt rename to forge-gui/res/cardsfolder/s/sanctum_of_eternity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scaretiller.txt b/forge-gui/res/cardsfolder/s/scaretiller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scaretiller.txt rename to forge-gui/res/cardsfolder/s/scaretiller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scroll_of_fate.txt b/forge-gui/res/cardsfolder/s/scroll_of_fate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scroll_of_fate.txt rename to forge-gui/res/cardsfolder/s/scroll_of_fate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/selesnya_eulogist.txt b/forge-gui/res/cardsfolder/s/selesnya_eulogist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/selesnya_eulogist.txt rename to forge-gui/res/cardsfolder/s/selesnya_eulogist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sevinne_the_chronoclasm.txt b/forge-gui/res/cardsfolder/s/sevinne_the_chronoclasm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sevinne_the_chronoclasm.txt rename to forge-gui/res/cardsfolder/s/sevinne_the_chronoclasm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sevinnes_reclamation.txt b/forge-gui/res/cardsfolder/s/sevinnes_reclamation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sevinnes_reclamation.txt rename to forge-gui/res/cardsfolder/s/sevinnes_reclamation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/skyfire_phoenix.txt b/forge-gui/res/cardsfolder/s/skyfire_phoenix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/skyfire_phoenix.txt rename to forge-gui/res/cardsfolder/s/skyfire_phoenix.txt diff --git a/forge-gui/res/cardsfolder/upcoming/song_of_the_worldsoul.txt b/forge-gui/res/cardsfolder/s/song_of_the_worldsoul.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/song_of_the_worldsoul.txt rename to forge-gui/res/cardsfolder/s/song_of_the_worldsoul.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tahngarth_first_mate.txt b/forge-gui/res/cardsfolder/t/tahngarth_first_mate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tahngarth_first_mate.txt rename to forge-gui/res/cardsfolder/t/tahngarth_first_mate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tectonic_hellion.txt b/forge-gui/res/cardsfolder/t/tectonic_hellion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tectonic_hellion.txt rename to forge-gui/res/cardsfolder/t/tectonic_hellion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thalias_geistcaller.txt b/forge-gui/res/cardsfolder/t/thalias_geistcaller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thalias_geistcaller.txt rename to forge-gui/res/cardsfolder/t/thalias_geistcaller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thieving_amalgam.txt b/forge-gui/res/cardsfolder/t/thieving_amalgam.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thieving_amalgam.txt rename to forge-gui/res/cardsfolder/t/thieving_amalgam.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thought_sponge.txt b/forge-gui/res/cardsfolder/t/thought_sponge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thought_sponge.txt rename to forge-gui/res/cardsfolder/t/thought_sponge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/voice_of_many.txt b/forge-gui/res/cardsfolder/v/voice_of_many.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/voice_of_many.txt rename to forge-gui/res/cardsfolder/v/voice_of_many.txt diff --git a/forge-gui/res/cardsfolder/upcoming/volrath_the_shapestealer.txt b/forge-gui/res/cardsfolder/v/volrath_the_shapestealer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/volrath_the_shapestealer.txt rename to forge-gui/res/cardsfolder/v/volrath_the_shapestealer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wall_of_stolen_identity.txt b/forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wall_of_stolen_identity.txt rename to forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wildfire_devils.txt b/forge-gui/res/cardsfolder/w/wildfire_devils.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wildfire_devils.txt rename to forge-gui/res/cardsfolder/w/wildfire_devils.txt From 157b2c85fe6ef3548e62e7e034e74cd13e4f68f0 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 4 Sep 2019 13:48:24 +0800 Subject: [PATCH 25/68] Update Food token and subtype --- forge-gui/res/lists/TypeLists.txt | 1 + forge-gui/res/tokenscripts/c_a_food_sac.txt | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 forge-gui/res/tokenscripts/c_a_food_sac.txt diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index c8d312fea8e..607d72de042 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -270,6 +270,7 @@ Shrine Clue Contraption Equipment +Food Fortification Treasure Vehicle diff --git a/forge-gui/res/tokenscripts/c_a_food_sac.txt b/forge-gui/res/tokenscripts/c_a_food_sac.txt new file mode 100644 index 00000000000..7d14f0658a2 --- /dev/null +++ b/forge-gui/res/tokenscripts/c_a_food_sac.txt @@ -0,0 +1,5 @@ +Name:Food +ManaCost:no cost +Types:Artifact Food +A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +Oracle:{2}, {T}, Sacrifice this artifact: You gain 3 life. From 71fca651fc9bad05638f8ffbc35a18c72045c714 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 4 Sep 2019 14:44:31 +0800 Subject: [PATCH 26/68] Add three cards --- forge-gui/res/cardsfolder/upcoming/gilded_goose.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/golden_egg.txt | 8 ++++++++ .../res/cardsfolder/upcoming/oko_thief_of_crowns.txt | 9 +++++++++ forge-gui/res/lists/TypeLists.txt | 1 + 4 files changed, 28 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/gilded_goose.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/golden_egg.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/oko_thief_of_crowns.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt b/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt new file mode 100644 index 00000000000..ae4ba35da20 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt @@ -0,0 +1,10 @@ +Name:Gilded Goose +ManaCost:G +Types:Creature Bird +PT:0/2 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield create a food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigFood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +A:AB$ Token | Cost$ 1 G T | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food Token. +A:AB$ Mana | Cost$ T Sac<1/Food> | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:Flying\nWhen Gilded Goose enters the battlefield create a food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{1}{G}, {T}: Create a Food token.\n{T}, Sacrifice a Food: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/golden_egg.txt b/forge-gui/res/cardsfolder/upcoming/golden_egg.txt new file mode 100644 index 00000000000..da8a981a901 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/golden_egg.txt @@ -0,0 +1,8 @@ +Name:Golden Egg +ManaCost:2 +Types:Artifact Food +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ FreeCard | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:FreeCard:DB$ Draw | Defined$ You | NumCards$ 1 +A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ Any | SpellDescription$ Add one mana of any color. +A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +Oracle:When Golden Egg enters the battlefield, draw a card.\n{1}, {T}, Sacrifice Golden Egg: Add one mana of any color.\n{2}, {T}, Sacrifice Golden Egg: You gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/oko_thief_of_crowns.txt b/forge-gui/res/cardsfolder/upcoming/oko_thief_of_crowns.txt new file mode 100644 index 00000000000..84dd9bc8ab8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/oko_thief_of_crowns.txt @@ -0,0 +1,9 @@ +Name:Oko, Thief of Crowns +ManaCost:1 G U +Types:Legendary Planeswalker Oko +Loyalty:4 +A:AB$ Token | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food Token. +A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | Power$ 3 | Toughness$ 3 | RemoveAllAbilities$ True | Colors$ Green | OverwriteColors$ True | Types$ Creature,Elk | RemoveCreatureTypes$ True | RemoveCardTypes$ True | Permanent$ True | SpellDescription$ Target artifact or creature loses all abilities and becomes a green Elk creature with base power and toughness 3/3. +A:AB$ Pump | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | AITgts$ Artifact.YouCtrl+cmcLE1 | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Choose target artifact or creature you control | SubAbility$ OkoExchange | SpellDescription$ Exchange control of target artifact or creature you control and target creature an opponent controls with power 3 or less. +SVar:OkoExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl+powerLE3 | TgtPrompt$ Choose target creature an opponent controls with power 3 or less +Oracle:[+2]: Create a Food Token.\n[+1]: Target artifact or creature loses all abilities and becomes a green Elk creature with base power and toughness 3/3.\n[-5]: Exchange control of target artifact or creature you control and target creature an opponent controls with power 3 or less. diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index 607d72de042..701d7db0a4a 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -304,6 +304,7 @@ Nahiri Narset Nissa Nixilis +Oko Ral Rowan Saheeli From 605426cd7a4da9f9c8bf853838a8c8ab54225813 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 4 Sep 2019 06:45:57 +0000 Subject: [PATCH 27/68] initial commit chinese translation --- forge-gui/res/languages/cn-ZH.properties | 890 +++++++++++++++++++++++ 1 file changed, 890 insertions(+) create mode 100644 forge-gui/res/languages/cn-ZH.properties diff --git a/forge-gui/res/languages/cn-ZH.properties b/forge-gui/res/languages/cn-ZH.properties new file mode 100644 index 00000000000..355c2b952eb --- /dev/null +++ b/forge-gui/res/languages/cn-ZH.properties @@ -0,0 +1,890 @@ +language.name=Chinese (ZH) +#SplashScreen.java +splash.loading.examining-cards=加载牌张,检查文件夹 +splash.loading.cards-folders=从文件夹加载牌张 +splash.loading.cards-archive=从存档中加载牌张 +splash.loading.decks=加载套牌 +splash.loading.processingimagesprites=处理精灵图 +#FControl.java +lblOpeningMainWindow=打开主窗口中 +lblCloseScreen=关闭屏幕 +txCloseAction1=Forge现在支持选项卡导航,可以轻松关闭和切换不同屏幕。因此,您不再需要使用右上角X按钮关闭当前屏幕并返回 +txCloseAction2=请选择右上角的X按钮选择接下来将要进行的操作。此选项保留给未来使用,您将不会再看到此消息,您可以随时在“首选项”中更改此行为 +titCloseAction=选择您的关闭行动 +lblAreYouSureYouWishRestartForge=你确定要重启Forge吗? +lblAreYouSureYouWishExitForge=你确定要退出Forge吗? +lblOneOrMoreGamesActive=一个或多个游戏正处于活动状态 +lblerrLoadingLayoutFile=无法读取您的布局文件:%s。按OK然后删除。\n游戏将以默认布局进行。 +lblLoadingQuest=加载时空竞逐中... +#FScreen.java +lblHome=主页 +lblWorkshop=作坊页面 +lblBacktoHome=回退到主页 +lblDeckEditor=套牌编辑器 +lblCloseEditor=关闭编辑器 +lblCommanderDeckEditor=指挥官套牌编辑器 +lblOathbreakerDeckEditor=Oathbreaker套牌编辑器 +lblTinyLeadersDeckEditor=小指挥官套牌编辑器 +lblBrawlDeckEditor=争锋套牌编辑器 +lblDraftDeckEditor=轮抓套牌编辑器 +lblSealedDeckEditor=现开套牌编辑器 +lblTokenViewer=衍生物查看器 +lblCloseViewer=关闭查看器 +lblQuestDeckEditor=竞逐套牌编辑器 +lblQuestTournamentDeckEditor=竞逐比赛套牌编辑器 +lblSpellShop=轮替商店 +lblLeaveShop=离开商店 +lblLeaveDraft=离开轮抓 +lblBazaar=珍宝集市 +lblConcedeGame=认输这场游戏 +txerrFailedtodeletelayoutfile=删除布局文件失败。 +#VSubmenuPreferences.java +Preferences=偏好 +btnReset=重置到默认偏好 +btnDeleteMatchUI=重置匹配布局 +btnDeleteEditorUI=重置编辑器布局 +btnDeleteWorkshopUI=重置游戏界面 +btnUserProfileUI=打开用户目录 +btnContentDirectoryUI=打开内容目录 +btnResetJavaFutureCompatibilityWarnings=重置Java兼容性警告 +btnClearImageCache=清除图片缓存 +btnTokenPreviewer=衍生物预览器 +btnCopyToClipboard=复制到剪切板 +cbpSelectLanguage=语言 +nlSelectLanguage=选择语言(除了正在进行中的游戏)(需要重新启动) +cbRemoveSmall=删除小生物 +cbCardBased=包括基于单卡生成的套牌 +cbSingletons=单张模式 +cbRemoveArtifacts=删除神器 +cbAnte=赌博模式 +cbAnteMatchRarity=赌注稀有度匹配 +cbEnableAICheats=允许AI作弊 +cbManaBurn=法术力灼烧 +cbManaLostPrompt=提示法术力池将要清空 +cbDevMode=开发人员模式 +cbLoadCardsLazily=惰性加载卡牌脚本 +cbLoadHistoricFormats=加载史记格式 +cbWorkshopSyntax=作坊语法检查 +cbEnforceDeckLegality=套牌一致性 +cbSideboardForAI=玩家为AI换备 +cbPerformanceMode=性能模式 +cbFilteredHands=手牌过滤 +cbImageFetcher=自动下载缺失的图片 +cbCloneImgSource=复制使用原始的图片 +cbScaleLarger=将图像缩放的更大 +cbRenderBlackCardBorders=渲染黑卡边框 +cbLargeCardViewers=使用大图查看器 +cbSmallDeckViewer=使用小套牌查看器 +cbDisplayFoil=显示闪卡 +cbRandomFoil=随机闪卡 +cbRandomArtInPools=在生成的卡池中随机加入闪卡 +cbEnableSounds=启用音效 +cbEnableMusic=启用背景音乐 +cbAltSoundSystem=使用备用音效系统 +cbUiForTouchScreen=触摸屏UI增强 +cbTimedTargOverlay=启用定位叠加优化 +cbCompactMainMenu=使用紧凑的主侧边栏菜单 +cbDetailedPaymentDesc=在付费提示中详细描述咒语 +cbPromptFreeBlocks=不阻塞句柄 +cbPauseWhileMinimized=暂停时最小化 +cbCompactPrompt=紧凑型提示 +cbEscapeEndsTurn=使用空格结束回合 +cbPreselectPrevAbOrder=预选能力的顺序 +cbHideReminderText=隐藏提示文字 +cbOpenPacksIndiv=逐个打开补充包 +cbTokensInSeparateRow=在单独一行中显示衍生物 +cbStackCreatures=堆叠生物 +cbFilterLandsByColorId=在启动式异能中按颜色筛选地 +cbShowStormCount=在提示窗中显示风暴计数 +cbRemindOnPriority=获得优先权时高亮提示 +cbUseSentry=自动提交错误报告 +cbpGameLogEntryType=游戏日志详细程度 +cbpCloseAction=关闭动作 +cbpDefaultFontSize=默认字体大小 +cbpAiProfiles=AI强度 +cbpDisplayCurrentCardColors=显示牌张颜色详情 +cbpAutoYieldMode=自动让过 +cbpCounterDisplayType=计数器显示类型 +cbpCounterDisplayLocation=计数器显示区域 +cbpGraveyardOrdering=允许指衍生物进入墓地 +Troubleshooting=故障排除 +GeneralConfiguration=常规配置 +lblPlayerName=玩家名称 +nlPlayerName=设置游戏中Forge将引用的名称 +nlCompactMainMenu=启用节省空间的侧边栏,一次只显示一个菜单组(需要重新启动)。 +nlUseSentry=启用后,会自动向开发人员提交错误报告。 +GamePlay=游戏 +nlpMulliganRule=选择调度规则 +nlpAiProfiles=选择你的AI对手 +nlAnte=确定游戏是否使用赌注 +nlAnteMatchRarity=尝试为所有玩家生成同稀有度赌注 +nlEnableAICheats=允许AI进行作弊以获得优势(对于已经设置了作弊洗牌的AI)。 +nlManaBurn=使用法术力灼烧(M10之前的规则) +nlManaLostPrompt=启用后,如果让过优先权会导致法术力池清空,你将收到一个警告提示。 +nlEnforceDeckLegality=强制每个与环境相关的套牌合法性(最小单卡数,最大单卡数等)。 +nlSideboardForAI=允许用户在构筑赛制中为AI换备牌。 +nlPerformanceMode=禁止其他静态能力检查以加速游戏引擎(警告:对手手牌有闪现单卡能使用时可能会跳过)。 +nlFilteredHands=生成两个起手并发给你最接近套牌地比例的起手(需要重启) +nlCloneImgSource=启用克隆的时候将使用原画而不是克隆牌的画 +nlPromptFreeBlocks=启用后如果你需要支付0来阻挡,则不会提示自动支付0。 +nlPauseWhileMinimized=启用后,Forge将在暂停时最小化(主要用于AI VS AI)。 +nlEscapeEndsTurn=启用后,空格键可以用于结束当前回合的替代按键。 +nlDetailedPaymentDesc=启用后,选择目标和支付费用的时候会显示详细的咒语/异能说明。 +nlShowStormCount=启用后,提示窗格将会显示当前的风暴计数 +nlRemindOnPriority=启用后,获得优先权时玩家区域将闪烁。 +nlPreselectPrevAbOrder=启用后,将预先将异能排序。 +nlpGraveyardOrdering=确定何时让玩家确定同时进入坟场的牌的顺序(最好只在关键操作时启用此选项,比如:瓦拉司的变形兽) +nlpAutoYieldMode=定义自动让过的详细程度(每个异能或者每张卡)。 +RandomDeckGeneration=生成随机套牌 +nlRemoveSmall=在生成的套牌中禁用1/1和0/X生物 +nlSingletons=禁止在生成的套牌中非地牌重复出现 +nlRemoveArtifacts=在生成的套牌中禁用神器牌 +nlCardBased=构建具有更多协同效应的套牌(需要重启) +DeckEditorOptions=套牌编辑器选项 +nlFilterLandsByColorId=当使用牌张颜色筛选器时,过滤地可以更容易找到产数相关法术力的地 +AdvancedSettings=高级设置 +nlDevMode=启用在开发期间进行测试的功能菜单 +nlWorkshopSyntax=在作坊中启用卡牌脚本检查。注意:该功能任在测试阶段。 +nlGameLogEntryType=更改游戏中日志显示的信息量。排序为最少到最详细。 +nlCloseAction=更改单击右上角X按钮时的行为 +nlLoadCardsLazily=如果打开该选项Forge将在使用到卡牌脚本时才加载(警告:实验状态)。 +nlLoadHistoricFormats=如果打开,Forge将加载史记格式,这个能会导致游戏载入时间变长。 +GraphicOptions=图形选项 +nlDefaultFontSize=UI中字体的默认大小。所有字体元素都相对于此缩放。(需要重启) +cbpMulliganRule = 调度规则 +nlImageFetcher=允许在在线资源中实时获取缺失的图片 +nlDisplayFoil=显示闪卡 +nlRandomFoil=随机将牌设置为闪卡 +nlScaleLarger=允许卡牌图片缩放为初始大小 +nlRenderBlackCardBorders=为牌周围渲染黑色边框 +nlLargeCardViewers=是所有牌看起来更大以便高分辨率图片看起来更舒适,不适合低分辨率设备使用 +nlSmallDeckViewer=将套牌查看器设置为800X600而不是按屏幕大小等比缩放 +nlRandomArtInPools=限制赛生成的卡池中带有闪卡。 +nlUiForTouchScreen=增加一些UI元素以提高触屏体验(需要重启)。 +nlCompactPrompt=隐藏标题并在“提示”窗格中使用较小的字体使其更紧凑。 +nlHideReminderText=在“卡牌详情“窗格中隐藏提醒文本 +nlOpenPacksIndiv=打开肥包或者补充盒的时候一包一包开。 +nlTokensInSeparateRow=生物与衍生物分不同的行显示。 +nlStackCreatures=在战场上如同地、神器、结界一般堆叠一样的生物。 +nlTimedTargOverlay=启用基于限制目标的覆盖优化以减少CPU使用率(仅在旧设备上需要使用,需要重启游戏)。 +nlCounterDisplayType=选择指示物的样式。基于文本还是基于图片还是二者混合。 +nlCounterDisplayLocation=确定牌张上指示物的位置:靠近底部还是顶部 +nlDisplayCurrentCardColors=在卡牌详情窗格中显示当前牌的颜色 +SoundOptions=声音选项 +nlEnableSounds=在游戏中启用声音效果 +nlEnableMusic=在游戏中启用背景音乐 +nlAltSoundSystem=使用备用音效系统(仅在声音消失的情况使用) +KeyboardShortcuts=键盘快捷键 +# VSubmenuAchievements.java +lblAchievements=成就 +# VSubmenuDownloaders.java +btnDownloadSetPics=下载低清系列图 +btnDownloadPicsHQ=下载高清卡图(这很慢!) +btnDownloadPics=下载低清卡图 +btnDownloadQuestImages=下载冒险图片 +btnDownloadAchievementImages=下载成就图片 +btnReportBug=报告错误 +btnListImageData=统计牌和图片数据 +lblListImageData=统计Forge实现且缺少的图片的牌 +btnImportPictures=导入数据 +btnHowToPlay=如何玩 +btnDownloadPrices=下载牌张价格 +btnLicensing=许可证详情 +lblDownloadPics=下载缺省牌的图片 +lblDownloadPicsHQ=下载缺省牌的高清图片 +lblDownloadSetPics=下载每张牌的图片(每张牌出现一次) +lblDownloadQuestImages=下载冒险之旅里使用的衍生物与图标 +lblDownloadAchievementImages=下载成就图片,让你的奖杯更引人注目。 +lblDownloadPrices=下载卡牌商店最新的价格表 +lblYourVersionOfJavaIsTooOld=你的Java版本太旧无法开始下载内容 +lblPleaseUpdateToTheLatestVersionOfJava=请更新到最新版本的JRE +lblYoureRunning=你在运行 +lblYouNeedAtLeastJavaVersion=您的JRE版本至少需要为1.8.0_101。 +lblImportPictures=从本地目录导入数据 +lblReportBug=什么东西坏了? +lblHowToPlay=游戏规则。 +lblLicensing=Forge合法性。 +ContentDownloaders=内容下载 +ReleaseNotes=发布说明 +# CSubmenuPreferences.java +CantChangeDevModeWhileNetworkMath=网络匹配时无法更改开发模式 +CompatibilityWarningsReEnabled=兼容性警告重新启用 +AresetForgeSettingsToDefault=这将把所有首选项设置为默认并重新启动Forge。\n\n重置并重启Forge? +TresetForgeSettingsToDefault=重置设置 +AresetDeckEditorLayout=这将重置套牌编辑器布局。\n所有选项卡将恢复到其默认位置。\n\n重置布局? +TresetDeckEditorLayout=重置套牌编辑器布局 +OKresetDeckEditorLayout=套牌编辑器布局已重置。 +AresetWorkshopLayout=这将重置游戏屏幕布局。\n所有选项卡将恢复至其默认位置。\n\n重置布局? +TresetWorkshopLayout=重置游戏界面 +OKresetWorkshopLayout=游戏界面已重置 +AresetMatchScreenLayout=这将重置匹配屏幕的布局。\n如果要保存当前的布局,请使用“匹配”屏幕中的“保存布局”选项。\n\n重置布局? +TresetMatchScreenLayout=重置匹配布局 +OKresetMatchScreenLayout=匹配布局已重置。 +#EMenuGroup.java +lblSanctionedFormats=单人游戏 +lblOnlineMultiplayer=多人联机 +lblQuestMode=冒险之旅 +lblPuzzleMode=谜题模式 +lblGauntlets=决斗之巅 +lblGameSettings=游戏设置 +#VLobby.java +lblHeaderConstructedMode=游戏模式:构筑 +lblGetNewRandomName=获取一个随机名称 +lbltypeofName=您想要生成什么类型的名称? +lblconfirmName=你想使用名称%s,还是想重试 +lblUseThisName=使用这个名称 +lblTryAgain=再试一次 +lblAddAPlayer=增加一个玩家 +lblVariants=变种 +lblRandom=随机 +#VSubmenuConstructed.java +lblConstructedMode=构筑模式 +lblConstructed=构筑 +#PlayerPanel.java +lblSelectaDeck=选择一个套牌 +lblSelectaSchemeDeck=选择一个套牌类型 +lblSchemeDeckEditor=套牌类型编辑器 +lblSelectaCommanderDeck=选择一个指挥官套牌 +lblSelectaPlanarDeck=选择一个时空竞逐套牌 +lblPlanarDeckEditor=时空竞逐套牌编辑器 +lblSelectaVanguardAvatar=选择一个先锋头像 +lblVanguardAvatar=先锋头像 +lblDeck=套牌 +lblSchemeDeck=魔王套牌 +lblCommanderDeck=指挥官套牌 +lblPlanarDeck=时空竞逐套牌 +lblVanguard=先锋 +lblHuman=人类 +lblAI=AI +lblOpen=打开 +lblUseSimulation=使用模拟 +lblGetaNewRandomName=获取一个新的随机名称 +lblArchenemy=魔王 +lblHeroes=英雄 +lblRemove=移除 +ttlblAvatar=左击:选择头像,右击:随机头像 +lblReady=准备好 +lblKick=踢 +lblReallyKick=准备好踢 %s? +#ForgeMenu.java +lblRestart=重启 +lblExit=退出 +#LayoutMenu.java +lblLayout=布局 +lblView=视图 +lblFile=文件 +lblTheme=主题 +lblBackgroundImage=背景图片 +lblPanelTabs=窗格表格 +lblSaveCurrentLayout=保存当前布局 +lblRefresh=刷新 +lblSetWindowSize=设置窗口大小 +lblChooseNewWindowSize=选择一个新的窗口大小 +lblFullScreen=全屏 +lblExitFullScreen=退出全屏 +#HelpMenu.java +lblHelp=帮助 +lblAboutForge=关于Forge +lblTroubleshooting=故障排除 +lblArticles=文章 +lblGettingStarted=如何开始 +lblHowtoPlay=如何玩 +lblForgeLicense=Forge许可证 +lblReleaseNotes=更新日志 +#GameMenu.java +lblGame=游戏 +lblSoundEffects=音效 +lblUndo=撤销 +lblAlphaStrike=先攻 +lblEndTurn=结束回合 +lblTargetingArcs=瞄准弧 +lblOff=关闭 +lblCardMouseOver=卡牌悬停 +lblAlwaysOn=总是打开 +lblAutoYields=自动让过 +lblDeckList=套牌列表 +lblClose=关闭 +lblExitForge=退出Forge +#ConstructedGameMenu.java +lblSelectAvatarFor=选择头像为%s +lblRemoveSmallCreatures=将1/1和0/X生物从生成套牌中移除。 +lblRemoveArtifacts=将神器从生成套牌中移除 +PreventNonLandDuplicates=防止生成套牌中出现重复的非地牌 +#PlayerPanel.java +lblName=名称 +lblTeam=团队 +#InputConfirmMulligan.java +lblKeep=保留 +lblYouAreGoingFirst=你先手 +lblIsGoingFirst=是先手 +lblYouAreGoing=你将 +lblMulligan=调度 +lblDoYouWantToKeepYourHand=你想保留这个手牌吗? +lblReturnForLondon=放回%n张牌到牌库底 +lblOk=确认 +lblReset=重置 +lblAuto=自动 +#VAssignDamage.java +lbLAssignDamageDealtBy=分配对%s造成的伤害 +lblLClickDamageMessage=左键单击:分配一点伤害。(左键加Ctrl):分配致命伤害。 +lblRClickDamageMessage=右键单击:取消分配一点伤害。(左键加Ctrl):取消分配的所有伤害 +lblTotalDamageText=可用的伤害值:未知 +lblAssignRemainingText=对受到致命伤害的对象分配过量的伤害 +lblLethal=致死 +#KeyboardShortcuts.java +lblSHORTCUT_SHOWSTACK=匹配:显示堆叠面板 +lblSHORTCUT_SHOWCOMBAT=匹配:显示战斗面板 +lblSHORTCUT_SHOWCONSOLE=匹配:显示控制台面板 +lblSHORTCUT_SHOWDEV=匹配:显示开发人员模式面板 +lblSHORTCUT_CONCEDE=匹配:认输 +lblSHORTCUT_ENDTURN=匹配:让过优先权直到回合结束或者下一个堆叠事件 +lblSHORTCUT_ALPHASTRIKE=匹配:先攻 +lblSHORTCUT_SHOWTARGETING=匹配:切换视觉叠加层 +lblSHORTCUT_AUTOYIELD_ALWAYS_YES=匹配:自动让过堆叠中的异能(所有都选是) +lblSHORTCUT_AUTOYIELD_ALWAYS_NO=匹配:自动让过堆叠中的异能(所有都选否) +lblSHORTCUT_MACRO_RECORD=匹配:记录操作宏的动作序列 +lblSHORTCUT_MACRO_NEXT_ACTION=匹配:在录制的宏中执行下一个操作 +lblSHORTCUT_CARD_ZOOM=匹配:缩放当前选定的图片 +#VSubmenuDraft.java +lblBoosterDraft=轮抓 +lblHeaderBoosterDraft=游戏模式:轮抓 +lblPlayAnOpponent=所有对手 +lblPlayAll7opponents=全部7个对手 +lblBuildorselectadeck=构建或选择一个套牌 +lblDraftText1=在轮抓模式中,三个补充包在8个玩家中传递 +lblDraftText2=从你选的牌中组一套牌。AI也会这样做 +lblDraftText3=然后对抗一个或多个AI对手 +lblNewBoosterDraftGame=新的补充包轮抓 +lblDraftDecks=轮抓套牌 +#CSubmenuDraft.java +lblNoDeckSelected=没有为人类选择套牌。\n(您可能要建立一个新的套牌) +lblNoDeck=没有套牌 +lblChooseDraftFormat=选择轮抓模式 +#VSubmenuSealed.java +lblSealedDeck=现开 +lblSealedDecks=现开套牌 +lblHeaderSealed=游戏模式:现开 +lblSealedText1=构建或选择一个套牌 +lblSealedText2=在现开模式中,您可以从补充包里(最多10个)构建一套牌 +lblSealedText3=从你得到的牌中组一套牌。AI也会这样做 +lblSealedText4=然后对抗一个或多个AI对手 +btnBuildNewSealedDeck=构建新的现开套牌 +#FDeckChooser.java +lblViewDeck=查看套牌 +lblRandomDeck=随机套牌 +lblRandomColors=随机颜色 +#GameType.java +lblSealed=现开 +lblDraft=轮抓 +lblWinston=温斯顿 +lblGauntlet=决斗 +lblTournament=锦标赛 +lblQuest=冒险 +lblQuestDraft=冒险轮抓 +lblPlanarConquest=时空竞逐征服 +lblPuzzle=谜题 +lblPuzzleDesc=从给定的游戏状态解谜 +lblDeckManager=套牌管理 +lblVanguardDesc=每个牌手在游戏中都有一个具有特殊能力的“Avatar”。 +lblCommander=指挥官 +lblCommanderDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色 +lblOathbreaker=Oathbreaker +lblOathbreakerDesc=每个玩家都有一张鹏洛克牌作为他的“Oathbreaker”,可以随时释放该鹏洛克并以此鹏洛克确定套牌的颜色。每个玩家还有一个“signature spell”,当他们的“Oathbreaker”在战场上时才能释放。 +lblTinyLeaders=小指挥官 +lblTinyLeadersDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色,但每张牌的总法术力费用必须小于4 +lblBrawl=争锋 +lblBrawlDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色,但牌池仅限于标准赛制 +lblPlaneswalker=时空幻境 +lblPlaneswalkerDesc=每个牌手都有一个随时可以释放的鹏洛客 +lblPlanechase=时空竞逐 +lblPlanechaseDesc=当玩家掷骰子到“时空牌”时,时空将改变。时空牌对全局生效。 +lblArchenemyDesc=一个玩家是魔王,使用阴谋牌与其他玩家对战 +lblArchenemyRumble=魔王混斗 +lblArchenemyRumbleDesc=每个玩家都是魔王,可以使用阴谋牌 +lblMomirBasic=莫秘维 +lblMomirBasicDesc=每位牌手使用由60基本地组成的套牌和Momir徽记。 +lblMoJhoSto=MoJhoSto +lblMoJhoStoDesc=每位牌手使用60基本地组成的套牌和Momir,Jhoira,Stonehewer徽记。 +#VSubmenuDuels.java +lblQuestDuels=探索决斗 +lblQuestModeDuels=冒险之旅:决斗 +lblSelectNextDuel=选择你将进行的下一场决斗 +lblNoDuelDeck=当前没有设置套牌 +lblNextChallengeNotYet=没有确定下次胜利后的挑战 +btnUnlockSets=解锁系列 +btnTravel=时空旅行 +btnBazaar=珍宝集市 +btnSpellShop=卡牌商店 +cbSummonPlant=召唤植物 +cbLaunchZeppelin=启动飞艇 +#VSubmenuQuest.java +lblQuestData=冒险之旅 +lblLoadQuestData=加载冒险之旅 +lblStartanewQuest=开始新的冒险之旅 +lblOldQuestData=冒险之旅?放入%s并重新启动Forge。 +rbEasy=简单 +rbMedium=中等 +rbHard=困难 +rbExpert=专家 +rbFantasyMode=幻想模式 +rbCommanderSubformat=指挥官模式 +lblStartingWorld=初始时空 +lblStartingPool=初始牌池 +lblAllCardsAvailable=所有牌都可用 +lblStarterEventdeck=初始/活动套牌 +lblSanctionedformat=合法格式: +lblCustomdeck=自定义套牌 +lblDefineCustomFormat=定义自定义格式 +lblSelectFormat=选择格式 +lblStartWithAllCards=从所选系列的所有牌开始 +lblAllowDuplicateCards=允许重复的卡牌 +lblStartingPoolDistribution=初始牌池分配 +lblChooseDistribution=选择分配 +lblPrizedCards=奖励卡 +lblAllCardsAvailableWin=获胜将提供的的所有牌 +lblOnlySetsInStarting=只有初始池才可用 +lblAllowUnlockAdEd=允许解锁其他版本 +lblEmbark=开始! +lblboxCompleteSet=你将使用所选系列的每张卡中的4张开始探索 +lblboxAllowDuplicates=生成初始牌池时,可能包含重复的卡。 +lblSameAsStartingPool=与初始牌池相同 +lblNewLoadQuest=新建/载入 +#CSubmenuQChallenges.java +lblLaunchaZeppelin=启动一个飞艇. +lblPlant=植物 +lblChallenges=挑战 +lblMatchBestof=匹配-BO +lblDuels=决斗 +#CSubmenuQuestData.java +lblNotFormatDefined=你已经将自定义格式设置为不包含任何系列。\n这将选择所有系列而不受限制为奖品。\n\n继续? +lbldckStartPool=你还没有选择一个套牌来开始。 +lblCannotStartaQuest=无法开始一个探索 +lblFromDeck=从套牌 +MsgQuestNewName=诗人会记住你的探索 +TitQuestNewName=探索名 +lblQuestNameEmpty=请指定探索名 +lblQuestExists=已存在具有该名称的探索。请选择一个其他探索名 +#CSubmenuQuestDecks.java +lblCreateaDeck=创建一个套牌 +#CSubmenuQuestPrefs.java +lblEnteraNumber=输入一个数 +lblSavefailed=保存错误 +#DialogChooseFormats.java +cbWantReprints=允许来自其他系列的重印牌 +lblChooseFormats=选择格式 +lblSanctioned=合法 +lblOther=其他 +lblHistoric=十几 +lblCancel=取消 +#DialogChoosePoolDistribution.java +lblBlack=黑 +lblBlue=蓝 +lblGreen=绿 +lblRed=红 +lblWhite=白 +lblColorless=无色 +lblIncludeArtifacts=包含神器 +lblBalanced=均衡 +lblTrueRandom=随机 +lblSurpriseMe=惊喜 +lblBoosters=补充包 +lblClearAll=清除所有 +lblNumberofBoosters=补充包数量 +lblColors=颜色 +lblnoSettings=没有可用于此选择的设置 +lblDistribution=分配 +lblHoverforDescription=将鼠标悬停在每个选项上以获得更详细的说明 +lblradBalanced="均衡"将在每种选定的颜色中提供数量均衡的卡牌。 +lblradRandom=“随机”将随机分配卡牌和颜色。 +lblradSurpriseMe=随机挑选颜色并提供数量均衡的随机卡牌。 +lblradBoosters=忽略所有颜色设置,从指定数量的补充包中生成牌池 +lblcbxArtifacts=选择后无论选择的颜色如何,神器都包涵在牌池中,这模拟了旧牌池的行为。 +#VSubmenuChallenges.java +lblQuestChallenges=冒险挑战 +htmlLaunchZeppelin=启动
飞艇 +lblQuestModeChallenges=冒险之旅:挑战 +lblWhichChallenge=你会尝试哪个挑战? +#VSubmenuQuestDraft.java +lblTournaments=锦标赛 +lblQuestModeDraftTournament=冒险之旅:轮抓锦标赛 +lblSelectaTournament=选择要加入的锦标赛 +lblNoTournaments=目前没有锦标赛 +btnEditDeck=编辑套牌 +btnLeaveTournament=离开锦标赛 +btnSpendToken=比赛门票 +btnStartMatchSmall=开始下一场比赛 +lblUndetermined=未确定 +btnSpendTokenTT=创建一个立即游戏的锦标赛 +lblPastResults=结果 +#VSubmenuQuestDecks.java +lblQuestDecks=套牌管理 +lblQuestDesc1=一开始你可以从有限的牌池中构建套牌。 +lblQuestDesc2=随着冒险之旅的进行,你的牌池逐渐增长,可以构建出更强的套牌。 +lblQuestDesc3=并且在与AI的决斗和挑战对抗中可以解锁更多牌。 +lblBuildaNewDeck=构建一个新套牌 +#Decktype.java +lblCustomUserDecks=自定义用户套牌 +lblConstructedDecks=构筑套牌 +lblCommanderDecks=指挥官套牌 +lblRandomCommanderDecks=随机指挥官套牌 +lblRandomCommanderCard-basedDecks=随机基本牌指挥官套牌 +lblOathbreakerDecks=Oathbreaker套牌 +lblTinyLeadersDecks=小指挥官套牌 +lblBrawlDecks=争锋套牌 +lblSchemeDecks=魔王套牌 +lblPlanarDecks=时空竞逐套牌 +lblPreconstructedDecks=预组套牌 +lblQuestOpponentDecks=冒险之旅套牌 +lblRandomColorDecks=随机颜色套牌 +lblRandomStandardArchetypeDecks=随机标准原型套牌 +lblRandomModernArchetypeDecks=随机摩登原型套牌 +lblRandomLegacyArchetypeDecks=随机薪传原型套牌 +lblRandomVintageArchetypeDecks=随机特选原型套牌 +lblRandomStandardColorDecks=随机标准颜色套牌 +lblRandomModernColorDecks=随机摩登颜色套牌 +lblRandomThemeDecks=随机主题套牌 +lblRandomDecks=随机套牌 +lblNetDecks=网络套牌 +lblNetCommanderDecks=网络指挥官套牌 +#VSubmenuPuzzleSolve.java +lblSolve=解谜 +lblPuzzleModeSolve=谜题模式:解谜 +#VSubmenuPuzzleCreate.java +lblPuzzleModeCreate=谜题模式:创建 +lblCreate=创建 +#VSubmenuGauntletLoad.java +lblQuickGauntlets=快速决斗 +lblQuickGauntlet=快速决斗 +lblLoadGauntlet=载入决斗场 +lblLoadaGauntlet=载入决斗场 +lblLoadaPreviousGauntlet=载入决斗场(使用起始套牌) +#VSubmenuGauntletQuick.java +lblQuickGauntletBuilder=快速进入决斗 +lblDecklistDesc=双击一个非随机套牌作为套牌列表 +lblOptions=选项 +lblMatchesperGauntlet=匹配每场决斗 +lblAllowedDeckTypes=允许的套牌类型 +lblAutosaveInf=生成一个新的决斗场。可以在“载入决斗场”中选择。 +#VSubmenuGauntletContests.java +lblGauntletContests=天命战场 +lblPickaContest=选择一个决斗场 +lblGauntletStartedDesc=使用一个套牌直到战胜所有决斗者。 +#VSubmenuGauntletBuild.java +lblGauntletBuilder=新建决斗场 +lblGauntletDesc1=左/右方向键添加或者删除套牌 +lblGauntletDesc2=上/下箭头改变对手的顺序 +lblDecklist=双击一个非随机套牌作为套牌列表 +btnUp=将这个套牌在决斗中向上移动 +btnDown=将这个套牌在决斗中向下移动 +btnRight=添加套牌至决斗 +btnLeft=将套牌从决斗中移除 +btnSaveGauntlet=保存这个决斗 +btnNewGauntlet=构建一个新的决斗 +btnLoadaGauntlet=载入决斗场 +lblGauntletName=决斗名 +lblBuildAGauntlet=新建决斗场 +lblSave=变更没有保存 +#QuestUtil.java +lblTravelBetweenWorlds=在时空旅行 +lblWhereDoYouWishToTravel=你想去哪里旅行? +lblUncompleteChallengesWarning=警告:未完成挑战 +lblUncompleteChallengesDesc=你当前的时空有未完成的挑战。如果你现在离开,他们将会失败!\n你确定要离开吗?\n(选“否”返回并完成当前的时空挑战。) +lblDontSummonAPet=不要召唤宠物 +lblSummon=召唤%n +lblMatchBestOf1=匹配-BO1 +lblMatchBestOf3=匹配-BO3 +lblMatchBestOf5=匹配-BO5 +lblCredits=积分 +lblLife=生命 +lblWins=胜利 +lblLosses=失败 +lblWorld=时空 +lblNone=没有 +lblnextChallengeInWins0=你的战绩已被注意到。对手挑战了你。 +lblnextChallengeInWins1=赢得1场胜利后,将面临新的挑战。 +lblnextChallengeInWins2=赢得%n场胜利后,将面临新的挑战。 +lblWinStreak=连胜 +lblBest=最好 +lblBuildAndSelectaDeck=构建,然后在“冒险套牌”子菜单中选择一个套牌。 +lblCurrentDeck=你现在的套牌是%n +PleaseCreateAQuestBefore=请在%n之前创建套牌。 +lblNoQuest=没有探索 +lblVisitTheSpellShop=参观卡牌商店 +lblVisitTheBazaar=参观珍宝集市 +lblUnlockEditions=解锁新的时空 +lblUnlocked=你已经成功解锁%n +titleUnlocked=%n解锁! +lblStartADuel=开始决斗! +lblSelectAQuestDeck=请选择一个冒险套牌。 +lblInvalidDeck=错误的套牌 +lblInvalidDeckDesc=您的套牌%n请编辑或者选择其他套牌 +#VSubmenuQuestPrefs.java +lblQuestPreferences=冒险偏好 +lblRewardsError=奖励错误 +lblDifficultyError=难度错误 +lblBoosterError=补充包错误 +lblShopError=商店错误 +lblDraftTournamentsError=轮抓锦标赛错误 +lblRewards=奖励 +lblBoosterPackRatios=补充包比例 +lblDifficultyAdjustments=挑战难度 +lblShopPreferences=商店偏好 +lblDraftTournaments=轮抓锦标赛 +lblBaseWinnings=基本胜利 +lblNoLosses=没有损失 +lblPoisonWin=侵染胜利 +lblMillingWin=磨牌胜利 +lblMulligan0Win=调度到0胜利 +lblAlternativeWin=特殊胜利 +lblBonusMultiplierperWin=每赢一次奖金加倍 +ttBonusMultiplierperWin=赢得比赛后每次胜利奖金都会增加。 +lblMaxWinsforMultiplier=最大胜利倍数 +ttMaxWinsforMultiplier=获得这么多胜利后奖励会停止。 +lblWinbyTurn15=15回合内胜利 +lblWinbyTurn10=10回合内胜利 +lblWinbyTurn5=5回合内胜利 +lblFirstTurnWin=第一回合胜利 +lblMaxLifeDiffBonus=最大生命值差。奖金 +lblEasy=简单 +lblMedium=中等 +lblHard=难 +lblExpert=专家 +lblWinsforBooster=获得补充包所需的胜利 +lblWinsforRankIncrease=排名增加所需的胜利 +lblWinsforMediumAI=匹配中等难度AI所需的胜利 +lblWinsforHardAI=匹配困难难度AI所需的胜利 +lblWinsforExpertAI=匹配专家难度AI所需的胜利 +lblStartingCommons=初始铁 +lblStartingUncommons=初始银 +lblStartingRares=初始金 +lblStartingCredits=初始积分 +lblWinsforNewChallenge=新挑战所需的胜利 +lblStartingSnowLands=初始雪境地 +lblColorBias=颜色偏差(1-100%) +ttColorBias=初始卡池中您选择的颜色的百分比 +lblPenaltyforLoss=失败补偿 +lblMoreDuelChoices=更多决斗选择 +lblCommon=铁 +lblUncommon=银 +lblRare=金 +lblSpecialBoosters=特殊补充包 +ttSpecialBoosters=允许特定颜色补充包出现在商店并作为匹配奖励。 +lblMaximumPacks=最多补充包 +lblMinimumPacks=最少补充包 +lblStartingPacks=初始包 +lblWinsforPack=胜利奖励包 +lblWinsperSetUnlock=胜利解锁系列 +lblAllowFarUnlocks=允许远解锁 +lblUnlockDistanceMultiplier=解锁距离倍数 +lblCommonSingles=单张铁 +lblUncommonSingles=单张银 +lblRareSingles=单张金 +lblCardSalePercentageBase=出售牌的系数 +lblCardSalePercentageCap=出售牌的系数上限 +lblCardSalePriceCap=出售牌的价格上限 +lblWinstoUncapSalePrice=胜利解锁价格系数 +lblPlaysetSize=玩家收藏大小 +ttPlaysetSize=在售卖卡牌时要保留的卡牌数量 +lblPlaysetSizeBasicLand=玩家收藏大小:基本地 +ttPlaysetSizeBasicLand=在售卖卡牌时要保留的基本地数量 +lblPlaysetSizeAnyNumber=玩家收藏大小:任意数量 +ttPlaysetSizeAnyNumber=售卖卡牌时不保留卡牌 +lblItemLevelRestriction=物品等级限制 +lblFoilfilterAlwaysOn=闪卡过滤器始终开启 +lblRatingsfilterAlwaysOn=评级过滤器始终开启。 +lblSimulateAIvsAIResults=模拟AI VS AI的结果。 +ttSimulateAIvsAIResults=如果设置为1,则不会播放AI VS AI的轮抓。而是快速确定其对局结果。 +lblWinsforNewDraft=新轮抓所需的胜利 +lblWinsperDraftRotation=每次轮抓胜利轮替 +ttWinsperDraftRotation=如果轮抓没有赢这么多场,那么它将被删除或者替换。 +lblRotationType=轮替类型 +ttRotationType=如果设置为0,旧系列消失,如果设置为1,则用不同系列替换。 +#StatTypeFilter.java +lblclicktotoogle=单击以切换筛选器,右键单机以仅显示 +#SItemManagerUtil.java +lblWhitecards=白色牌 +lblBluecards=蓝色牌 +lblBlackcards=黑色牌 +lblRedcards=红色牌 +lblGreencards=绿色牌 +lblColorlesscards=无色牌 +lblMulticolorcards=多色牌 +lblPackordeck=卡包和预组套牌 +lblLands=地 +lblArtifacts=神器 +lblCreatures=生物 +lblEnchantments=结界 +lblPlaneswalkers=鹏洛客 +lblInstants=瞬间 +lblSorceries=法术 +lblCCMC0=法术力费用为0的牌 +lblCCMC1=法术力费用为1的牌 +lblCCMC2=法术力费用为2的牌 +lblCCMC3=法术力费用为3的牌 +lblCCMC4=法术力费用为4的牌 +lblCCMC5=法术力费用为5的牌 +lblCCMC6orMore=法术力费用为6+的牌 +lblWhitedecks=白色套牌 +lblBluedecks=蓝色套牌 +lblBlackdecks=黑色套牌 +lblReddecks=红色套牌 +lblGreendecks=绿色套牌 +lblColorlessdecks=无色套牌 +lblMulticolordecks=多色套牌 +lblOldstyleFoilcards=旧风格闪卡 +lblNewstyleFoilcards=新风格闪卡 +lblNon-Foilcards=非闪卡 +lblUnratedcards=未分级的卡 +lbl1starcards=1星级卡 +lbl2starcards=2星级卡 +lbl3starcards=3星级卡 +lbl4starcards=4星级卡 +lbl5starcards=5星级卡 +lblXcopiesof=X个副本 +lblcopiesof=副本 +#ItemListView.java +lblUniqueCardsOnly=每张牌都只显示一个画 +ttUniqueCardsOnly=切换是否每张牌都只显示一个画 +#ACEditorBase.java +lblAddcard=添加牌 +ttAddcard=将选定的牌添加到当前套牌(双击该行或者空格) +lblAdd4ofcard=添加4张牌 +ttAdd4ofcard=将最多4张牌添加到当前套牌 +lblRemovecard=移除卡 +ttRemovecard=从当前套牌移除所选牌(双击该行或者空格) +lblRemove4ofcard=移除4张牌 +ttRemove4ofcard=最多可以将4张所选牌从当前套牌移除 +lblAddBasicLands=添加基本地 +ttAddBasicLands=添加基本地到套牌 +lblCardCatalog=卡牌目录 +lblJumptoprevioustable=跳转到上一个表格 +lblJumptopnexttable=跳转到下一个表格 +lblJumptotextfilter=跳转到文本筛选器 +lblChooseavalueforX=选择X的值 +#VCurrentDeck.java +lblVCurrentDeck=当前套牌 +ttbtnSave=保存套牌(Ctrl+S) +ttbtnSaveAs=保存套牌到(Ctrl+E) +ttbtnLoadDeck=打开套牌(Ctrl+O) +ttbtnNewDeck=新建套牌(Ctrl+N) +ttbtnPrintProxies=打印到HTML文件(Ctrl+P) +lblImport=导入 +ttImportDeck=常识从非Forge格式导入套牌(Ctrl+I) +lblTitle=标题 +#ImageView.java +lblExpandallgroups=展开所有组 +lblCollapseallgroups=折叠所有组 +lblGroupby=分组 +lblPileby=堆积 +lblColumns=行 +#CEditorVariant.java, CEditorConstructed.java +lblCatalog=目录 +lblAdd=添加 +lbltodeck=到套牌 +lblfromdeck=从套牌 +lbltosideboard=到备牌 +lblfromsideboard=从备牌 +lblascommander=是指挥官 +lblasoathbreaker=是oathbreaker +lblassignaturespell=是signature spell +lblasavatar=作为头像 +lblfromschemedeck=从魔王套牌 +lblfromplanardeck=从时空竞逐套牌 +lblfromconspiracydeck=从诡局套牌 +lbltoschemedeck=到魔王套牌 +lbltoplanardeck=到时空竞逐套牌 +lbltoconspiracydeck=到诡局套牌 +lblMove=移到 +#VDock.java +lblDock=Dock +lblViewDeckList=查看套牌列表 +lblRevertLayout=还原布局 +lblOpenLayout=打开布局 +lblSaveLayout=保存布局 +#GroupDef.java +lblColor=颜色 +lblColorIdentity=颜色特征 +lblSet=系列 +lblSet2=系列 +#Set word has different meanings in other languages +lblDefault=默认 +lblType=类型 +lblPlaneswalkerDeckSort=鹏洛客套牌排序 +lblRarity=稀有度 +lblConvertToFoil=闪卡 +lblMulticolor=多色 +#DeckFileMenu.java +lblNewDeck=新建套牌 +lblOpenDeck=打开套牌 +lblImportDeck=导入套牌 +lblSaveDeck=保存套牌 +lblSaveDeckAs=保存套牌到 +lblPrinttoHTMLfile=打印成HTML文件 +#PaperCard.java +lblCard=牌 +#CardManager.java +lblFormat=格式 +lblFormats=格式 +lblQuestWorld=冒险时空 +lblSets=系列 +lblTypes=类型 +lblConvertedManaCosts=总法术力 +lblCMCRange=总法术力费用范围 +lblPowerRange=力量范围 +lblToughnessRange=防御范围 +lblFoil=闪卡 +lblPersonalRating=个人评价 +lblAdvanced=高级 +#VDeckgen.java +lblDeckGeneration=套牌生成 +btnRandCardpool=随机牌池 +ttbtnRandCardpool=在当前牌池中生成套牌 +btnRandDeck2=构筑(双色) +ttbtnRandDeck2=在当前牌池中生成双色套牌 +btnRandDeck3=构筑(三色) +ttbtnRandDeck3=在当前牌池中生成三色套牌 +btnRandDeck5=构筑(五色) +ttbtnRandDeck5=在当前牌池中生成五色套牌 +#DeckCotroller.java +lblCurrentDeck2=当前标题 +lblUntitled=无标题 +#VPrompt.java +lblPrompt=提示 +lblGameSetup=游戏设置 +#ColumnDef.java +lblAIStatus=AI状态 +lblCMC=总法术力费用 +ttCMC=总法术力费用 +lblCN=编号 +ttCN=收藏编号顺序 +ttColor=颜色 +lblCost=费用 +ttCost=费用 +lblDecks=套牌 +lblDeleteEdit=删除/编辑 +lblSetEdition=神秘行。我们不知道他做了什么和能做什么。 +ttFavorite=喜好 +lblFolder=文件夹 +ttFormats=套牌在赛制中合法 +lblMain=主牌 +ttMain=主牌 +lblQty=数量 +lblQuantity=数量 +lblSide=备牌 +lblSideboard=备牌 +lblNew=新建 +lblOwned=拥有 +lblPower=力量 +ttPower=力量 +lblPrice=价格 +ttPrice=价格 +lblRanking=排名 +lblDraftRanking=轮抓排名 +lblToughness=防御 +ttToughness=防御 +ttType=类型 +#HomeScreen.java +lblNewGame=新游戏 +lblLoadGame=加载游戏 +lblPlayOnline=在线游戏 +lblSettings=设置 \ No newline at end of file From 3cbb603c2492ad5f6e9547b1dc9ecfe0d09306e6 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 4 Sep 2019 06:57:34 +0000 Subject: [PATCH 28/68] add generate common chinese characters images --- .../src/forge/assets/FSkinFont.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/forge-gui-mobile/src/forge/assets/FSkinFont.java b/forge-gui-mobile/src/forge/assets/FSkinFont.java index 726edaabc3a..4872ceb49b6 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinFont.java +++ b/forge-gui-mobile/src/forge/assets/FSkinFont.java @@ -187,6 +187,120 @@ public class FSkinFont { //only generate images for characters that could be used by Forge String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"!?'.,;:()[]{}<>|/@\\^$-%+=#_&*\u2014\u2022"; chars += "ÁÉÍÓÚáéíóúÀÈÌÒÙàèìòùÑñÄËÏÖÜäëïöüẞß"; + //common chinese charsets + chars + "阿啊哎哀唉埃挨癌矮艾爱碍安氨俺岸按案暗昂凹熬傲奥澳八巴叭吧拔把" + + "坝爸罢霸白百柏摆败拜班般颁斑搬板版办半伴扮瓣邦帮膀傍棒包胞宝饱" + + "保堡报抱豹暴爆卑杯悲碑北贝备背倍被辈奔本崩逼鼻比彼笔币必毕闭辟" + + "碧蔽壁避臂边编蝙鞭扁便变遍辨辩标表别宾滨冰兵丙柄饼并病拨波玻剥" + + "播脖伯驳泊勃博搏膊薄卜补捕不布步部擦猜才材财裁采彩踩菜蔡参餐残" + + "蚕惨灿仓苍舱藏操曹槽草册侧测策层叉插查茶察差拆柴缠产阐颤昌长肠" + + "尝偿常厂场畅倡唱抄超巢朝潮吵炒车扯彻撤尘臣沉陈闯衬称趁撑成呈承" + + "诚城乘惩程橙吃池驰迟持匙尺齿斥赤翅充冲虫崇抽仇绸愁筹酬丑瞅臭出" + + "初除厨础储楚处触川穿传船喘串窗床晨创吹垂锤春纯唇醇词瓷慈辞磁雌" + + "此次刺从匆葱聪丛凑粗促催脆翠村存寸措错搭达答打大呆代带待袋逮戴" + + "丹单担胆旦但诞弹淡蛋氮当挡党荡刀导岛倒蹈到盗道稻得德的灯登等邓" + + "凳瞪低堤滴迪敌笛底抵地弟帝递第颠典点电店垫淀殿雕吊钓调掉爹跌叠" + + "蝶丁叮盯钉顶订定丢东冬懂动冻洞都斗抖陡豆督毒读独堵赌杜肚度渡端" + + "短段断锻堆队对吨敦蹲盾顿多夺朵躲俄鹅额恶饿鳄恩儿而尔耳二发乏伐" + + "罚阀法帆番翻凡烦繁反返犯泛饭范贩方坊芳防妨房肪仿访纺放飞非啡菲" + + "肥废沸肺费分纷芬坟粉份奋愤粪丰风枫封疯峰锋蜂冯逢缝凤奉佛否夫肤" + + "孵弗伏扶服浮符幅福辐蝠抚府辅腐父付妇负附复赴副傅富赋腹覆该改钙" + + "盖溉概干甘杆肝赶敢感刚岗纲缸钢港高搞稿告戈哥胳鸽割歌阁革格葛隔" + + "个各给根跟更耕工弓公功攻供宫恭巩拱共贡勾沟钩狗构购够估咕姑孤菇" + + "古谷股骨鼓固故顾瓜刮挂拐怪关观官冠馆管贯惯灌罐光广归龟规硅轨鬼" + + "柜贵桂滚棍郭锅国果裹过哈孩海害含函寒韩罕喊汉汗旱杭航毫豪好号浩" + + "耗呵喝合何和河核荷盒贺褐赫鹤黑嘿痕很狠恨哼恒横衡轰哄红宏洪虹鸿" + + "侯喉猴吼后厚候乎呼忽狐胡壶湖葫糊蝴虎互户护花华哗滑化划画话桦怀" + + "淮坏欢还环缓幻唤换患荒慌皇黄煌晃灰恢挥辉徽回毁悔汇会绘惠慧昏婚" + + "浑魂混活火伙或货获祸惑霍击饥圾机肌鸡积基迹绩激及吉级即极急疾集" + + "辑籍几己挤脊计记纪忌技际剂季既济继寂寄加夹佳家嘉甲贾钾价驾架假" + + "嫁稼尖坚间肩艰兼监减剪检简碱见件建剑健舰渐践鉴键箭江姜将浆僵疆" + + "讲奖蒋匠降交郊娇浇骄胶焦礁角脚搅叫轿较教阶皆接揭街节劫杰洁结捷" + + "截竭姐解介戒届界借巾今斤金津筋仅紧锦尽劲近进晋浸禁京经茎惊晶睛" + + "精鲸井颈景警净径竞竟敬境静镜纠究九久酒旧救就舅居局菊橘举矩句巨" + + "拒具俱剧惧据距聚卷倦决绝觉掘嚼军君均菌俊峻卡开凯慨刊堪砍看康抗" + + "炕考烤靠科棵颗壳咳可渴克刻客课肯坑空孔恐控口扣枯哭苦库裤酷夸跨" + + "块快宽款狂况矿亏葵愧溃昆困扩括阔垃拉啦喇腊蜡辣来莱赖兰拦栏蓝篮" + + "览懒烂滥郎狼廊朗浪捞劳牢老乐勒雷蕾泪类累冷愣厘梨离莉犁璃黎礼李" + + "里哩理鲤力历厉立丽利励例隶粒俩连帘怜莲联廉脸练炼恋链良凉梁粮两" + + "亮辆量辽疗聊僚了料列劣烈猎裂邻林临淋磷灵玲凌铃陵羚零龄领岭令另" + + "溜刘流留硫瘤柳六龙笼隆垄拢楼漏露卢芦炉鲁陆录鹿碌路驴旅铝履律虑" + + "率绿氯滤卵乱掠略伦轮论罗萝逻螺裸洛络骆落妈麻马玛码蚂骂吗嘛埋买" + + "迈麦卖脉蛮满曼慢漫忙芒盲茫猫毛矛茅茂冒贸帽貌么没枚玫眉梅媒煤霉" + + "每美妹门闷们萌盟猛蒙孟梦弥迷谜米泌秘密蜜眠绵棉免勉面苗描秒妙庙" + + "灭民敏名明鸣命摸模膜摩磨蘑魔抹末沫陌莫漠墨默谋某母亩牡姆拇木目" + + "牧墓幕慕穆拿哪内那纳娜钠乃奶奈耐男南难囊恼脑闹呢嫩能尼泥你拟逆" + + "年念娘酿鸟尿捏您宁凝牛扭纽农浓弄奴努怒女暖挪诺哦欧偶爬帕怕拍排" + + "牌派攀盘判叛盼庞旁胖抛炮跑泡胚陪培赔佩配喷盆朋棚蓬鹏膨捧碰批披" + + "皮疲脾匹屁譬片偏篇骗漂飘瓢票拼贫频品平评凭苹屏瓶萍坡泼颇婆迫破" + + "剖扑铺葡蒲朴浦普谱七妻栖戚期欺漆齐其奇歧骑棋旗企岂启起气弃汽契" + + "砌器恰千迁牵铅谦签前钱潜浅遣欠枪腔强墙抢悄敲乔桥瞧巧切茄且窃亲" + + "侵秦琴禽勤青氢轻倾清情晴顷请庆穷丘秋蚯求球区曲驱屈躯趋取娶去趣" + + "圈全权泉拳犬劝券缺却雀确鹊裙群然燃染嚷壤让饶扰绕惹热人仁忍认任" + + "扔仍日绒荣容溶熔融柔肉如儒乳辱入软锐瑞润若弱撒洒萨塞赛三伞散桑" + + "嗓丧扫嫂色森僧杀沙纱刹砂傻啥晒山杉衫珊闪陕扇善伤商赏上尚梢烧稍" + + "少绍哨舌蛇舍设社射涉摄申伸身深神审婶肾甚渗慎升生声牲胜绳省圣盛" + + "剩尸失师诗施狮湿十什石时识实拾蚀食史使始驶士氏世市示式事侍势视" + + "试饰室是适逝释收手守首寿受兽售授瘦书抒叔枢殊疏舒输蔬熟暑署属鼠" + + "薯术束述树竖数刷耍衰摔甩帅双霜爽谁水税睡顺瞬说丝司私思斯撕死四" + + "寺似饲松耸宋送颂搜艘苏俗诉肃素速宿塑酸蒜算虽随髓岁遂碎穗孙损笋" + + "缩所索锁他它她塌塔踏胎台抬太态泰贪摊滩坛谈潭坦叹炭探碳汤唐堂塘" + + "糖躺趟涛掏逃桃陶淘萄讨套特疼腾藤梯踢啼提题蹄体替天添田甜填挑条" + + "跳贴铁厅听廷亭庭停蜓挺艇通同桐铜童统桶筒痛偷头投透突图徒涂途屠" + + "土吐兔团推腿退吞托拖脱驼妥拓唾挖哇蛙娃瓦歪外弯湾丸完玩顽挽晚碗" + + "万汪亡王网往忘旺望危威微为围违唯惟维伟伪尾纬委萎卫未位味胃谓喂" + + "慰魏温文纹闻蚊吻稳问翁窝我沃卧握乌污屋无吴吾五午伍武舞务物误悟" + + "雾夕西吸希析息牺悉惜晰稀溪锡熙嘻膝习席袭媳洗喜戏系细隙虾瞎峡狭" + + "辖霞下吓夏厦仙先纤掀鲜闲弦贤咸衔嫌显险县现线限宪陷献腺乡相香厢" + + "湘箱详祥翔享响想向巷项象像橡削消萧硝销小晓孝效校笑些歇协胁斜谐" + + "携鞋写泄泻卸屑械谢蟹心辛欣新信兴星猩刑行形型醒杏姓幸性凶兄匈胸" + + "雄熊休修羞朽秀绣袖嗅须虚需徐许序叙畜绪续蓄宣玄悬旋选穴学雪血寻" + + "巡询循训讯迅压呀鸦鸭牙芽崖哑雅亚咽烟淹延严言岩沿炎研盐颜衍掩眼" + + "演厌宴艳验焰雁燕央扬羊阳杨洋仰养氧痒样腰邀摇遥咬药要耀爷也冶野" + + "业叶页夜液一伊衣医依仪夷宜姨移遗疑乙已以矣蚁椅义亿忆艺议亦异役" + + "抑译易疫益谊逸意溢毅翼因阴音吟银引饮蚓隐印应英婴鹰迎盈营蝇赢影" + + "映硬哟拥永泳勇涌用优忧幽悠尤犹由邮油游友有又右幼诱于予余鱼娱渔" + + "愉愚与宇羽雨语玉吁育郁狱浴预域欲喻寓御裕遇愈誉豫元员园原圆袁援" + + "缘源远怨院愿曰约月岳钥悦阅跃越云匀允孕运晕韵蕴杂砸灾栽宰载再在" + + "咱暂赞脏葬遭糟早枣藻灶皂造噪燥躁则择泽责贼怎曾增赠渣扎眨炸摘宅" + + "窄债沾粘展占战站张章涨掌丈仗帐胀账障招找召兆赵照罩遮折哲者这浙" + + "针侦珍真诊枕阵振镇震争征挣睁蒸整正证郑政症之支汁芝枝知织肢脂蜘" + + "执直值职植殖止只旨址纸指趾至志制治质致智置中忠终钟肿种仲众重州" + + "舟周洲轴宙皱骤朱株珠诸猪蛛竹烛逐主煮嘱住助注贮驻柱祝著筑抓爪专" + + "砖转赚庄桩装壮状撞追准捉桌着仔兹姿资滋籽子紫字自宗综棕踪总纵走" + + "奏租足族阻组祖钻嘴最罪醉尊遵昨左作坐座做蔼隘庵鞍黯肮拗袄懊扒芭" + + "疤捌跋靶掰扳拌绊梆绑榜蚌谤磅镑苞褒雹鲍狈悖惫笨绷泵蹦匕鄙庇毙痹" + + "弊璧贬匾辫彪憋鳖瘪彬斌缤濒鬓秉禀菠舶渤跛簸哺怖埠簿睬惭沧糙厕蹭" + + "茬岔豺掺搀禅馋蝉铲猖敞钞嘲澈忱辰铛澄逞秤痴弛侈耻宠畴稠锄雏橱矗" + + "揣囱疮炊捶椿淳蠢戳绰祠赐醋簇窜篡崔摧悴粹搓撮挫瘩歹怠贷耽档叨捣" + + "祷悼蹬嘀涤缔蒂掂滇巅碘佃甸玷惦奠刁叼迭谍碟鼎董栋兜蚪逗痘睹妒镀" + + "缎兑墩盹囤钝咄哆踱垛堕舵惰跺讹娥峨蛾扼鄂愕遏噩饵贰筏矾妃匪诽吠" + + "吩氛焚忿讽敷芙拂俘袱甫斧俯脯咐缚尬丐柑竿尴秆橄赣冈肛杠羔膏糕镐" + + "疙搁蛤庚羹埂耿梗蚣躬汞苟垢沽辜雇寡卦褂乖棺逛闺瑰诡癸跪亥骇酣憨" + + "涵悍捍焊憾撼翰夯嚎皓禾烘弘弧唬沪猾徊槐宦涣焕痪凰惶蝗簧恍谎幌卉" + + "讳诲贿晦秽荤豁讥叽唧缉畸箕稽棘嫉妓祭鲫冀颊奸歼煎拣俭柬茧捡荐贱" + + "涧溅槛缰桨酱椒跤蕉侥狡绞饺矫剿缴窖酵秸睫芥诫藉襟谨荆兢靖窘揪灸" + + "玖韭臼疚拘驹鞠桔沮炬锯娟捐鹃绢眷诀倔崛爵钧骏竣咖揩楷勘坎慷糠扛" + + "亢拷铐坷苛磕蝌垦恳啃吭抠叩寇窟垮挎筷筐旷框眶盔窥魁馈坤捆廓睐婪" + + "澜揽缆榄琅榔唠姥涝烙酪垒磊肋擂棱狸漓篱吏沥俐荔栗砾痢雳镰敛粱谅" + + "晾寥嘹撩缭瞭咧琳鳞凛吝赁躏拎伶聆菱浏琉馏榴咙胧聋窿娄搂篓陋庐颅" + + "卤虏赂禄吕侣屡缕峦抡仑沦啰锣箩骡蟆馒瞒蔓莽锚卯昧媚魅氓朦檬锰咪" + + "靡眯觅缅瞄渺藐蔑皿闽悯冥铭谬馍摹茉寞沐募睦暮捺挠瑙呐馁妮匿溺腻" + + "捻撵碾聂孽拧狞柠泞钮脓疟虐懦糯殴鸥呕藕趴啪耙徘湃潘畔乓螃刨袍沛" + + "砰烹彭澎篷坯劈霹啤僻翩撇聘乒坪魄仆菩圃瀑曝柒凄祈脐崎鳍乞迄泣掐" + + "洽钳乾黔谴嵌歉呛跷锹侨憔俏峭窍翘撬怯钦芹擒寝沁卿蜻擎琼囚岖渠痊" + + "瘸冉瓤壬刃纫韧戎茸蓉榕冗揉蹂蠕汝褥蕊闰腮叁搔骚臊涩瑟鲨煞霎筛删" + + "煽擅赡裳晌捎勺奢赦呻绅沈笙甥矢屎恃拭柿嗜誓梳淑赎蜀曙恕庶墅漱蟀" + + "拴栓涮吮烁硕嗽嘶巳伺祀肆讼诵酥粟溯隋祟隧唆梭嗦琐蹋苔汰瘫痰谭檀" + + "毯棠膛倘淌烫滔誊剔屉剃涕惕恬舔迢帖彤瞳捅凸秃颓蜕褪屯豚臀驮鸵椭" + + "洼袜豌宛婉惋皖腕枉妄偎薇巍帷苇畏尉猬蔚瘟紊嗡涡蜗呜巫诬芜梧蜈侮" + + "捂鹉勿戊昔犀熄蟋徙匣侠暇馅羡镶宵潇箫霄嚣淆肖哮啸蝎邪挟懈芯锌薪" + + "馨衅腥汹锈戌墟旭恤酗婿絮轩喧癣炫绚渲靴薛勋熏旬驯汛逊殉丫押涯衙" + + "讶焉阎蜒檐砚唁谚堰殃秧鸯漾夭吆妖尧肴姚窑谣舀椰腋壹怡贻胰倚屹邑" + + "绎姻茵荫殷寅淫瘾莺樱鹦荧莹萤颖佣庸咏踊酉佑迂淤渝隅逾榆舆屿禹芋" + + "冤鸳渊猿苑粤耘陨酝哉赃凿蚤澡憎咋喳轧闸乍诈栅榨斋寨毡瞻斩盏崭辗" + + "栈绽彰樟杖昭沼肇辙蔗贞斟疹怔狰筝拯吱侄帜挚秩掷窒滞稚衷粥肘帚咒" + + "昼拄瞩蛀铸拽撰妆幢椎锥坠缀赘谆卓拙灼茁浊酌啄琢咨姊揍卒佐佘赊"; final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false); final FreeTypeFontParameter parameter = new FreeTypeFontParameter(); parameter.characters = chars; From d11febd7e48923502778dc0854fb948c6161bd65 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 4 Sep 2019 09:29:09 +0000 Subject: [PATCH 29/68] Update 'Oathbreaker' and 'signature spell' translation --- forge-gui/res/languages/cn-ZH.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/languages/cn-ZH.properties b/forge-gui/res/languages/cn-ZH.properties index 355c2b952eb..76501d900d7 100644 --- a/forge-gui/res/languages/cn-ZH.properties +++ b/forge-gui/res/languages/cn-ZH.properties @@ -23,7 +23,7 @@ lblBacktoHome=回退到主页 lblDeckEditor=套牌编辑器 lblCloseEditor=关闭编辑器 lblCommanderDeckEditor=指挥官套牌编辑器 -lblOathbreakerDeckEditor=Oathbreaker套牌编辑器 +lblOathbreakerDeckEditor=破誓者套牌编辑器 lblTinyLeadersDeckEditor=小指挥官套牌编辑器 lblBrawlDeckEditor=争锋套牌编辑器 lblDraftDeckEditor=轮抓套牌编辑器 @@ -388,8 +388,8 @@ lblDeckManager=套牌管理 lblVanguardDesc=每个牌手在游戏中都有一个具有特殊能力的“Avatar”。 lblCommander=指挥官 lblCommanderDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色 -lblOathbreaker=Oathbreaker -lblOathbreakerDesc=每个玩家都有一张鹏洛克牌作为他的“Oathbreaker”,可以随时释放该鹏洛克并以此鹏洛克确定套牌的颜色。每个玩家还有一个“signature spell”,当他们的“Oathbreaker”在战场上时才能释放。 +lblOathbreaker=破誓者 +lblOathbreakerDesc=每个玩家都有一张鹏洛克牌作为他的“破誓者”,可以随时释放该鹏洛克并以此鹏洛克确定套牌的颜色。每个玩家还有一个“专属咒语”,当他们的“破誓者”在战场上时才能释放。 lblTinyLeaders=小指挥官 lblTinyLeadersDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色,但每张牌的总法术力费用必须小于4 lblBrawl=争锋 @@ -528,7 +528,7 @@ lblConstructedDecks=构筑套牌 lblCommanderDecks=指挥官套牌 lblRandomCommanderDecks=随机指挥官套牌 lblRandomCommanderCard-basedDecks=随机基本牌指挥官套牌 -lblOathbreakerDecks=Oathbreaker套牌 +lblOathbreakerDecks=破誓者套牌 lblTinyLeadersDecks=小指挥官套牌 lblBrawlDecks=争锋套牌 lblSchemeDecks=魔王套牌 @@ -785,8 +785,8 @@ lblfromdeck=从套牌 lbltosideboard=到备牌 lblfromsideboard=从备牌 lblascommander=是指挥官 -lblasoathbreaker=是oathbreaker -lblassignaturespell=是signature spell +lblasoathbreaker=是破誓者 +lblassignaturespell=是专属咒语 lblasavatar=作为头像 lblfromschemedeck=从魔王套牌 lblfromplanardeck=从时空竞逐套牌 From 6070d3f1e3f52a497d4afe67ae273f194dd0cc96 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 4 Sep 2019 10:11:28 +0000 Subject: [PATCH 30/68] fix:miss '=' --- .../src/forge/assets/FSkinFont.java | 226 +++++++++--------- 1 file changed, 113 insertions(+), 113 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinFont.java b/forge-gui-mobile/src/forge/assets/FSkinFont.java index 4872ceb49b6..5da5896c204 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinFont.java +++ b/forge-gui-mobile/src/forge/assets/FSkinFont.java @@ -188,119 +188,119 @@ public class FSkinFont { String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"!?'.,;:()[]{}<>|/@\\^$-%+=#_&*\u2014\u2022"; chars += "ÁÉÍÓÚáéíóúÀÈÌÒÙàèìòùÑñÄËÏÖÜäëïöüẞß"; //common chinese charsets - chars + "阿啊哎哀唉埃挨癌矮艾爱碍安氨俺岸按案暗昂凹熬傲奥澳八巴叭吧拔把" - + "坝爸罢霸白百柏摆败拜班般颁斑搬板版办半伴扮瓣邦帮膀傍棒包胞宝饱" - + "保堡报抱豹暴爆卑杯悲碑北贝备背倍被辈奔本崩逼鼻比彼笔币必毕闭辟" - + "碧蔽壁避臂边编蝙鞭扁便变遍辨辩标表别宾滨冰兵丙柄饼并病拨波玻剥" - + "播脖伯驳泊勃博搏膊薄卜补捕不布步部擦猜才材财裁采彩踩菜蔡参餐残" - + "蚕惨灿仓苍舱藏操曹槽草册侧测策层叉插查茶察差拆柴缠产阐颤昌长肠" - + "尝偿常厂场畅倡唱抄超巢朝潮吵炒车扯彻撤尘臣沉陈闯衬称趁撑成呈承" - + "诚城乘惩程橙吃池驰迟持匙尺齿斥赤翅充冲虫崇抽仇绸愁筹酬丑瞅臭出" - + "初除厨础储楚处触川穿传船喘串窗床晨创吹垂锤春纯唇醇词瓷慈辞磁雌" - + "此次刺从匆葱聪丛凑粗促催脆翠村存寸措错搭达答打大呆代带待袋逮戴" - + "丹单担胆旦但诞弹淡蛋氮当挡党荡刀导岛倒蹈到盗道稻得德的灯登等邓" - + "凳瞪低堤滴迪敌笛底抵地弟帝递第颠典点电店垫淀殿雕吊钓调掉爹跌叠" - + "蝶丁叮盯钉顶订定丢东冬懂动冻洞都斗抖陡豆督毒读独堵赌杜肚度渡端" - + "短段断锻堆队对吨敦蹲盾顿多夺朵躲俄鹅额恶饿鳄恩儿而尔耳二发乏伐" - + "罚阀法帆番翻凡烦繁反返犯泛饭范贩方坊芳防妨房肪仿访纺放飞非啡菲" - + "肥废沸肺费分纷芬坟粉份奋愤粪丰风枫封疯峰锋蜂冯逢缝凤奉佛否夫肤" - + "孵弗伏扶服浮符幅福辐蝠抚府辅腐父付妇负附复赴副傅富赋腹覆该改钙" - + "盖溉概干甘杆肝赶敢感刚岗纲缸钢港高搞稿告戈哥胳鸽割歌阁革格葛隔" - + "个各给根跟更耕工弓公功攻供宫恭巩拱共贡勾沟钩狗构购够估咕姑孤菇" - + "古谷股骨鼓固故顾瓜刮挂拐怪关观官冠馆管贯惯灌罐光广归龟规硅轨鬼" - + "柜贵桂滚棍郭锅国果裹过哈孩海害含函寒韩罕喊汉汗旱杭航毫豪好号浩" - + "耗呵喝合何和河核荷盒贺褐赫鹤黑嘿痕很狠恨哼恒横衡轰哄红宏洪虹鸿" - + "侯喉猴吼后厚候乎呼忽狐胡壶湖葫糊蝴虎互户护花华哗滑化划画话桦怀" - + "淮坏欢还环缓幻唤换患荒慌皇黄煌晃灰恢挥辉徽回毁悔汇会绘惠慧昏婚" - + "浑魂混活火伙或货获祸惑霍击饥圾机肌鸡积基迹绩激及吉级即极急疾集" - + "辑籍几己挤脊计记纪忌技际剂季既济继寂寄加夹佳家嘉甲贾钾价驾架假" - + "嫁稼尖坚间肩艰兼监减剪检简碱见件建剑健舰渐践鉴键箭江姜将浆僵疆" - + "讲奖蒋匠降交郊娇浇骄胶焦礁角脚搅叫轿较教阶皆接揭街节劫杰洁结捷" - + "截竭姐解介戒届界借巾今斤金津筋仅紧锦尽劲近进晋浸禁京经茎惊晶睛" - + "精鲸井颈景警净径竞竟敬境静镜纠究九久酒旧救就舅居局菊橘举矩句巨" - + "拒具俱剧惧据距聚卷倦决绝觉掘嚼军君均菌俊峻卡开凯慨刊堪砍看康抗" - + "炕考烤靠科棵颗壳咳可渴克刻客课肯坑空孔恐控口扣枯哭苦库裤酷夸跨" - + "块快宽款狂况矿亏葵愧溃昆困扩括阔垃拉啦喇腊蜡辣来莱赖兰拦栏蓝篮" - + "览懒烂滥郎狼廊朗浪捞劳牢老乐勒雷蕾泪类累冷愣厘梨离莉犁璃黎礼李" - + "里哩理鲤力历厉立丽利励例隶粒俩连帘怜莲联廉脸练炼恋链良凉梁粮两" - + "亮辆量辽疗聊僚了料列劣烈猎裂邻林临淋磷灵玲凌铃陵羚零龄领岭令另" - + "溜刘流留硫瘤柳六龙笼隆垄拢楼漏露卢芦炉鲁陆录鹿碌路驴旅铝履律虑" - + "率绿氯滤卵乱掠略伦轮论罗萝逻螺裸洛络骆落妈麻马玛码蚂骂吗嘛埋买" - + "迈麦卖脉蛮满曼慢漫忙芒盲茫猫毛矛茅茂冒贸帽貌么没枚玫眉梅媒煤霉" - + "每美妹门闷们萌盟猛蒙孟梦弥迷谜米泌秘密蜜眠绵棉免勉面苗描秒妙庙" - + "灭民敏名明鸣命摸模膜摩磨蘑魔抹末沫陌莫漠墨默谋某母亩牡姆拇木目" - + "牧墓幕慕穆拿哪内那纳娜钠乃奶奈耐男南难囊恼脑闹呢嫩能尼泥你拟逆" - + "年念娘酿鸟尿捏您宁凝牛扭纽农浓弄奴努怒女暖挪诺哦欧偶爬帕怕拍排" - + "牌派攀盘判叛盼庞旁胖抛炮跑泡胚陪培赔佩配喷盆朋棚蓬鹏膨捧碰批披" - + "皮疲脾匹屁譬片偏篇骗漂飘瓢票拼贫频品平评凭苹屏瓶萍坡泼颇婆迫破" - + "剖扑铺葡蒲朴浦普谱七妻栖戚期欺漆齐其奇歧骑棋旗企岂启起气弃汽契" - + "砌器恰千迁牵铅谦签前钱潜浅遣欠枪腔强墙抢悄敲乔桥瞧巧切茄且窃亲" - + "侵秦琴禽勤青氢轻倾清情晴顷请庆穷丘秋蚯求球区曲驱屈躯趋取娶去趣" - + "圈全权泉拳犬劝券缺却雀确鹊裙群然燃染嚷壤让饶扰绕惹热人仁忍认任" - + "扔仍日绒荣容溶熔融柔肉如儒乳辱入软锐瑞润若弱撒洒萨塞赛三伞散桑" - + "嗓丧扫嫂色森僧杀沙纱刹砂傻啥晒山杉衫珊闪陕扇善伤商赏上尚梢烧稍" - + "少绍哨舌蛇舍设社射涉摄申伸身深神审婶肾甚渗慎升生声牲胜绳省圣盛" - + "剩尸失师诗施狮湿十什石时识实拾蚀食史使始驶士氏世市示式事侍势视" - + "试饰室是适逝释收手守首寿受兽售授瘦书抒叔枢殊疏舒输蔬熟暑署属鼠" - + "薯术束述树竖数刷耍衰摔甩帅双霜爽谁水税睡顺瞬说丝司私思斯撕死四" - + "寺似饲松耸宋送颂搜艘苏俗诉肃素速宿塑酸蒜算虽随髓岁遂碎穗孙损笋" - + "缩所索锁他它她塌塔踏胎台抬太态泰贪摊滩坛谈潭坦叹炭探碳汤唐堂塘" - + "糖躺趟涛掏逃桃陶淘萄讨套特疼腾藤梯踢啼提题蹄体替天添田甜填挑条" - + "跳贴铁厅听廷亭庭停蜓挺艇通同桐铜童统桶筒痛偷头投透突图徒涂途屠" - + "土吐兔团推腿退吞托拖脱驼妥拓唾挖哇蛙娃瓦歪外弯湾丸完玩顽挽晚碗" - + "万汪亡王网往忘旺望危威微为围违唯惟维伟伪尾纬委萎卫未位味胃谓喂" - + "慰魏温文纹闻蚊吻稳问翁窝我沃卧握乌污屋无吴吾五午伍武舞务物误悟" - + "雾夕西吸希析息牺悉惜晰稀溪锡熙嘻膝习席袭媳洗喜戏系细隙虾瞎峡狭" - + "辖霞下吓夏厦仙先纤掀鲜闲弦贤咸衔嫌显险县现线限宪陷献腺乡相香厢" - + "湘箱详祥翔享响想向巷项象像橡削消萧硝销小晓孝效校笑些歇协胁斜谐" - + "携鞋写泄泻卸屑械谢蟹心辛欣新信兴星猩刑行形型醒杏姓幸性凶兄匈胸" - + "雄熊休修羞朽秀绣袖嗅须虚需徐许序叙畜绪续蓄宣玄悬旋选穴学雪血寻" - + "巡询循训讯迅压呀鸦鸭牙芽崖哑雅亚咽烟淹延严言岩沿炎研盐颜衍掩眼" - + "演厌宴艳验焰雁燕央扬羊阳杨洋仰养氧痒样腰邀摇遥咬药要耀爷也冶野" - + "业叶页夜液一伊衣医依仪夷宜姨移遗疑乙已以矣蚁椅义亿忆艺议亦异役" - + "抑译易疫益谊逸意溢毅翼因阴音吟银引饮蚓隐印应英婴鹰迎盈营蝇赢影" - + "映硬哟拥永泳勇涌用优忧幽悠尤犹由邮油游友有又右幼诱于予余鱼娱渔" - + "愉愚与宇羽雨语玉吁育郁狱浴预域欲喻寓御裕遇愈誉豫元员园原圆袁援" - + "缘源远怨院愿曰约月岳钥悦阅跃越云匀允孕运晕韵蕴杂砸灾栽宰载再在" - + "咱暂赞脏葬遭糟早枣藻灶皂造噪燥躁则择泽责贼怎曾增赠渣扎眨炸摘宅" - + "窄债沾粘展占战站张章涨掌丈仗帐胀账障招找召兆赵照罩遮折哲者这浙" - + "针侦珍真诊枕阵振镇震争征挣睁蒸整正证郑政症之支汁芝枝知织肢脂蜘" - + "执直值职植殖止只旨址纸指趾至志制治质致智置中忠终钟肿种仲众重州" - + "舟周洲轴宙皱骤朱株珠诸猪蛛竹烛逐主煮嘱住助注贮驻柱祝著筑抓爪专" - + "砖转赚庄桩装壮状撞追准捉桌着仔兹姿资滋籽子紫字自宗综棕踪总纵走" - + "奏租足族阻组祖钻嘴最罪醉尊遵昨左作坐座做蔼隘庵鞍黯肮拗袄懊扒芭" - + "疤捌跋靶掰扳拌绊梆绑榜蚌谤磅镑苞褒雹鲍狈悖惫笨绷泵蹦匕鄙庇毙痹" - + "弊璧贬匾辫彪憋鳖瘪彬斌缤濒鬓秉禀菠舶渤跛簸哺怖埠簿睬惭沧糙厕蹭" - + "茬岔豺掺搀禅馋蝉铲猖敞钞嘲澈忱辰铛澄逞秤痴弛侈耻宠畴稠锄雏橱矗" - + "揣囱疮炊捶椿淳蠢戳绰祠赐醋簇窜篡崔摧悴粹搓撮挫瘩歹怠贷耽档叨捣" - + "祷悼蹬嘀涤缔蒂掂滇巅碘佃甸玷惦奠刁叼迭谍碟鼎董栋兜蚪逗痘睹妒镀" - + "缎兑墩盹囤钝咄哆踱垛堕舵惰跺讹娥峨蛾扼鄂愕遏噩饵贰筏矾妃匪诽吠" - + "吩氛焚忿讽敷芙拂俘袱甫斧俯脯咐缚尬丐柑竿尴秆橄赣冈肛杠羔膏糕镐" - + "疙搁蛤庚羹埂耿梗蚣躬汞苟垢沽辜雇寡卦褂乖棺逛闺瑰诡癸跪亥骇酣憨" - + "涵悍捍焊憾撼翰夯嚎皓禾烘弘弧唬沪猾徊槐宦涣焕痪凰惶蝗簧恍谎幌卉" - + "讳诲贿晦秽荤豁讥叽唧缉畸箕稽棘嫉妓祭鲫冀颊奸歼煎拣俭柬茧捡荐贱" - + "涧溅槛缰桨酱椒跤蕉侥狡绞饺矫剿缴窖酵秸睫芥诫藉襟谨荆兢靖窘揪灸" - + "玖韭臼疚拘驹鞠桔沮炬锯娟捐鹃绢眷诀倔崛爵钧骏竣咖揩楷勘坎慷糠扛" - + "亢拷铐坷苛磕蝌垦恳啃吭抠叩寇窟垮挎筷筐旷框眶盔窥魁馈坤捆廓睐婪" - + "澜揽缆榄琅榔唠姥涝烙酪垒磊肋擂棱狸漓篱吏沥俐荔栗砾痢雳镰敛粱谅" - + "晾寥嘹撩缭瞭咧琳鳞凛吝赁躏拎伶聆菱浏琉馏榴咙胧聋窿娄搂篓陋庐颅" - + "卤虏赂禄吕侣屡缕峦抡仑沦啰锣箩骡蟆馒瞒蔓莽锚卯昧媚魅氓朦檬锰咪" - + "靡眯觅缅瞄渺藐蔑皿闽悯冥铭谬馍摹茉寞沐募睦暮捺挠瑙呐馁妮匿溺腻" - + "捻撵碾聂孽拧狞柠泞钮脓疟虐懦糯殴鸥呕藕趴啪耙徘湃潘畔乓螃刨袍沛" - + "砰烹彭澎篷坯劈霹啤僻翩撇聘乒坪魄仆菩圃瀑曝柒凄祈脐崎鳍乞迄泣掐" - + "洽钳乾黔谴嵌歉呛跷锹侨憔俏峭窍翘撬怯钦芹擒寝沁卿蜻擎琼囚岖渠痊" - + "瘸冉瓤壬刃纫韧戎茸蓉榕冗揉蹂蠕汝褥蕊闰腮叁搔骚臊涩瑟鲨煞霎筛删" - + "煽擅赡裳晌捎勺奢赦呻绅沈笙甥矢屎恃拭柿嗜誓梳淑赎蜀曙恕庶墅漱蟀" - + "拴栓涮吮烁硕嗽嘶巳伺祀肆讼诵酥粟溯隋祟隧唆梭嗦琐蹋苔汰瘫痰谭檀" - + "毯棠膛倘淌烫滔誊剔屉剃涕惕恬舔迢帖彤瞳捅凸秃颓蜕褪屯豚臀驮鸵椭" - + "洼袜豌宛婉惋皖腕枉妄偎薇巍帷苇畏尉猬蔚瘟紊嗡涡蜗呜巫诬芜梧蜈侮" - + "捂鹉勿戊昔犀熄蟋徙匣侠暇馅羡镶宵潇箫霄嚣淆肖哮啸蝎邪挟懈芯锌薪" - + "馨衅腥汹锈戌墟旭恤酗婿絮轩喧癣炫绚渲靴薛勋熏旬驯汛逊殉丫押涯衙" - + "讶焉阎蜒檐砚唁谚堰殃秧鸯漾夭吆妖尧肴姚窑谣舀椰腋壹怡贻胰倚屹邑" - + "绎姻茵荫殷寅淫瘾莺樱鹦荧莹萤颖佣庸咏踊酉佑迂淤渝隅逾榆舆屿禹芋" - + "冤鸳渊猿苑粤耘陨酝哉赃凿蚤澡憎咋喳轧闸乍诈栅榨斋寨毡瞻斩盏崭辗" - + "栈绽彰樟杖昭沼肇辙蔗贞斟疹怔狰筝拯吱侄帜挚秩掷窒滞稚衷粥肘帚咒" - + "昼拄瞩蛀铸拽撰妆幢椎锥坠缀赘谆卓拙灼茁浊酌啄琢咨姊揍卒佐佘赊"; + chars += "阿啊哎哀唉埃挨癌矮艾爱碍安氨俺岸按案暗昂凹熬傲奥澳八巴叭吧拔把" + + "坝爸罢霸白百柏摆败拜班般颁斑搬板版办半伴扮瓣邦帮膀傍棒包胞宝饱" + + "保堡报抱豹暴爆卑杯悲碑北贝备背倍被辈奔本崩逼鼻比彼笔币必毕闭辟" + + "碧蔽壁避臂边编蝙鞭扁便变遍辨辩标表别宾滨冰兵丙柄饼并病拨波玻剥" + + "播脖伯驳泊勃博搏膊薄卜补捕不布步部擦猜才材财裁采彩踩菜蔡参餐残" + + "蚕惨灿仓苍舱藏操曹槽草册侧测策层叉插查茶察差拆柴缠产阐颤昌长肠" + + "尝偿常厂场畅倡唱抄超巢朝潮吵炒车扯彻撤尘臣沉陈闯衬称趁撑成呈承" + + "诚城乘惩程橙吃池驰迟持匙尺齿斥赤翅充冲虫崇抽仇绸愁筹酬丑瞅臭出" + + "初除厨础储楚处触川穿传船喘串窗床晨创吹垂锤春纯唇醇词瓷慈辞磁雌" + + "此次刺从匆葱聪丛凑粗促催脆翠村存寸措错搭达答打大呆代带待袋逮戴" + + "丹单担胆旦但诞弹淡蛋氮当挡党荡刀导岛倒蹈到盗道稻得德的灯登等邓" + + "凳瞪低堤滴迪敌笛底抵地弟帝递第颠典点电店垫淀殿雕吊钓调掉爹跌叠" + + "蝶丁叮盯钉顶订定丢东冬懂动冻洞都斗抖陡豆督毒读独堵赌杜肚度渡端" + + "短段断锻堆队对吨敦蹲盾顿多夺朵躲俄鹅额恶饿鳄恩儿而尔耳二发乏伐" + + "罚阀法帆番翻凡烦繁反返犯泛饭范贩方坊芳防妨房肪仿访纺放飞非啡菲" + + "肥废沸肺费分纷芬坟粉份奋愤粪丰风枫封疯峰锋蜂冯逢缝凤奉佛否夫肤" + + "孵弗伏扶服浮符幅福辐蝠抚府辅腐父付妇负附复赴副傅富赋腹覆该改钙" + + "盖溉概干甘杆肝赶敢感刚岗纲缸钢港高搞稿告戈哥胳鸽割歌阁革格葛隔" + + "个各给根跟更耕工弓公功攻供宫恭巩拱共贡勾沟钩狗构购够估咕姑孤菇" + + "古谷股骨鼓固故顾瓜刮挂拐怪关观官冠馆管贯惯灌罐光广归龟规硅轨鬼" + + "柜贵桂滚棍郭锅国果裹过哈孩海害含函寒韩罕喊汉汗旱杭航毫豪好号浩" + + "耗呵喝合何和河核荷盒贺褐赫鹤黑嘿痕很狠恨哼恒横衡轰哄红宏洪虹鸿" + + "侯喉猴吼后厚候乎呼忽狐胡壶湖葫糊蝴虎互户护花华哗滑化划画话桦怀" + + "淮坏欢还环缓幻唤换患荒慌皇黄煌晃灰恢挥辉徽回毁悔汇会绘惠慧昏婚" + + "浑魂混活火伙或货获祸惑霍击饥圾机肌鸡积基迹绩激及吉级即极急疾集" + + "辑籍几己挤脊计记纪忌技际剂季既济继寂寄加夹佳家嘉甲贾钾价驾架假" + + "嫁稼尖坚间肩艰兼监减剪检简碱见件建剑健舰渐践鉴键箭江姜将浆僵疆" + + "讲奖蒋匠降交郊娇浇骄胶焦礁角脚搅叫轿较教阶皆接揭街节劫杰洁结捷" + + "截竭姐解介戒届界借巾今斤金津筋仅紧锦尽劲近进晋浸禁京经茎惊晶睛" + + "精鲸井颈景警净径竞竟敬境静镜纠究九久酒旧救就舅居局菊橘举矩句巨" + + "拒具俱剧惧据距聚卷倦决绝觉掘嚼军君均菌俊峻卡开凯慨刊堪砍看康抗" + + "炕考烤靠科棵颗壳咳可渴克刻客课肯坑空孔恐控口扣枯哭苦库裤酷夸跨" + + "块快宽款狂况矿亏葵愧溃昆困扩括阔垃拉啦喇腊蜡辣来莱赖兰拦栏蓝篮" + + "览懒烂滥郎狼廊朗浪捞劳牢老乐勒雷蕾泪类累冷愣厘梨离莉犁璃黎礼李" + + "里哩理鲤力历厉立丽利励例隶粒俩连帘怜莲联廉脸练炼恋链良凉梁粮两" + + "亮辆量辽疗聊僚了料列劣烈猎裂邻林临淋磷灵玲凌铃陵羚零龄领岭令另" + + "溜刘流留硫瘤柳六龙笼隆垄拢楼漏露卢芦炉鲁陆录鹿碌路驴旅铝履律虑" + + "率绿氯滤卵乱掠略伦轮论罗萝逻螺裸洛络骆落妈麻马玛码蚂骂吗嘛埋买" + + "迈麦卖脉蛮满曼慢漫忙芒盲茫猫毛矛茅茂冒贸帽貌么没枚玫眉梅媒煤霉" + + "每美妹门闷们萌盟猛蒙孟梦弥迷谜米泌秘密蜜眠绵棉免勉面苗描秒妙庙" + + "灭民敏名明鸣命摸模膜摩磨蘑魔抹末沫陌莫漠墨默谋某母亩牡姆拇木目" + + "牧墓幕慕穆拿哪内那纳娜钠乃奶奈耐男南难囊恼脑闹呢嫩能尼泥你拟逆" + + "年念娘酿鸟尿捏您宁凝牛扭纽农浓弄奴努怒女暖挪诺哦欧偶爬帕怕拍排" + + "牌派攀盘判叛盼庞旁胖抛炮跑泡胚陪培赔佩配喷盆朋棚蓬鹏膨捧碰批披" + + "皮疲脾匹屁譬片偏篇骗漂飘瓢票拼贫频品平评凭苹屏瓶萍坡泼颇婆迫破" + + "剖扑铺葡蒲朴浦普谱七妻栖戚期欺漆齐其奇歧骑棋旗企岂启起气弃汽契" + + "砌器恰千迁牵铅谦签前钱潜浅遣欠枪腔强墙抢悄敲乔桥瞧巧切茄且窃亲" + + "侵秦琴禽勤青氢轻倾清情晴顷请庆穷丘秋蚯求球区曲驱屈躯趋取娶去趣" + + "圈全权泉拳犬劝券缺却雀确鹊裙群然燃染嚷壤让饶扰绕惹热人仁忍认任" + + "扔仍日绒荣容溶熔融柔肉如儒乳辱入软锐瑞润若弱撒洒萨塞赛三伞散桑" + + "嗓丧扫嫂色森僧杀沙纱刹砂傻啥晒山杉衫珊闪陕扇善伤商赏上尚梢烧稍" + + "少绍哨舌蛇舍设社射涉摄申伸身深神审婶肾甚渗慎升生声牲胜绳省圣盛" + + "剩尸失师诗施狮湿十什石时识实拾蚀食史使始驶士氏世市示式事侍势视" + + "试饰室是适逝释收手守首寿受兽售授瘦书抒叔枢殊疏舒输蔬熟暑署属鼠" + + "薯术束述树竖数刷耍衰摔甩帅双霜爽谁水税睡顺瞬说丝司私思斯撕死四" + + "寺似饲松耸宋送颂搜艘苏俗诉肃素速宿塑酸蒜算虽随髓岁遂碎穗孙损笋" + + "缩所索锁他它她塌塔踏胎台抬太态泰贪摊滩坛谈潭坦叹炭探碳汤唐堂塘" + + "糖躺趟涛掏逃桃陶淘萄讨套特疼腾藤梯踢啼提题蹄体替天添田甜填挑条" + + "跳贴铁厅听廷亭庭停蜓挺艇通同桐铜童统桶筒痛偷头投透突图徒涂途屠" + + "土吐兔团推腿退吞托拖脱驼妥拓唾挖哇蛙娃瓦歪外弯湾丸完玩顽挽晚碗" + + "万汪亡王网往忘旺望危威微为围违唯惟维伟伪尾纬委萎卫未位味胃谓喂" + + "慰魏温文纹闻蚊吻稳问翁窝我沃卧握乌污屋无吴吾五午伍武舞务物误悟" + + "雾夕西吸希析息牺悉惜晰稀溪锡熙嘻膝习席袭媳洗喜戏系细隙虾瞎峡狭" + + "辖霞下吓夏厦仙先纤掀鲜闲弦贤咸衔嫌显险县现线限宪陷献腺乡相香厢" + + "湘箱详祥翔享响想向巷项象像橡削消萧硝销小晓孝效校笑些歇协胁斜谐" + + "携鞋写泄泻卸屑械谢蟹心辛欣新信兴星猩刑行形型醒杏姓幸性凶兄匈胸" + + "雄熊休修羞朽秀绣袖嗅须虚需徐许序叙畜绪续蓄宣玄悬旋选穴学雪血寻" + + "巡询循训讯迅压呀鸦鸭牙芽崖哑雅亚咽烟淹延严言岩沿炎研盐颜衍掩眼" + + "演厌宴艳验焰雁燕央扬羊阳杨洋仰养氧痒样腰邀摇遥咬药要耀爷也冶野" + + "业叶页夜液一伊衣医依仪夷宜姨移遗疑乙已以矣蚁椅义亿忆艺议亦异役" + + "抑译易疫益谊逸意溢毅翼因阴音吟银引饮蚓隐印应英婴鹰迎盈营蝇赢影" + + "映硬哟拥永泳勇涌用优忧幽悠尤犹由邮油游友有又右幼诱于予余鱼娱渔" + + "愉愚与宇羽雨语玉吁育郁狱浴预域欲喻寓御裕遇愈誉豫元员园原圆袁援" + + "缘源远怨院愿曰约月岳钥悦阅跃越云匀允孕运晕韵蕴杂砸灾栽宰载再在" + + "咱暂赞脏葬遭糟早枣藻灶皂造噪燥躁则择泽责贼怎曾增赠渣扎眨炸摘宅" + + "窄债沾粘展占战站张章涨掌丈仗帐胀账障招找召兆赵照罩遮折哲者这浙" + + "针侦珍真诊枕阵振镇震争征挣睁蒸整正证郑政症之支汁芝枝知织肢脂蜘" + + "执直值职植殖止只旨址纸指趾至志制治质致智置中忠终钟肿种仲众重州" + + "舟周洲轴宙皱骤朱株珠诸猪蛛竹烛逐主煮嘱住助注贮驻柱祝著筑抓爪专" + + "砖转赚庄桩装壮状撞追准捉桌着仔兹姿资滋籽子紫字自宗综棕踪总纵走" + + "奏租足族阻组祖钻嘴最罪醉尊遵昨左作坐座做蔼隘庵鞍黯肮拗袄懊扒芭" + + "疤捌跋靶掰扳拌绊梆绑榜蚌谤磅镑苞褒雹鲍狈悖惫笨绷泵蹦匕鄙庇毙痹" + + "弊璧贬匾辫彪憋鳖瘪彬斌缤濒鬓秉禀菠舶渤跛簸哺怖埠簿睬惭沧糙厕蹭" + + "茬岔豺掺搀禅馋蝉铲猖敞钞嘲澈忱辰铛澄逞秤痴弛侈耻宠畴稠锄雏橱矗" + + "揣囱疮炊捶椿淳蠢戳绰祠赐醋簇窜篡崔摧悴粹搓撮挫瘩歹怠贷耽档叨捣" + + "祷悼蹬嘀涤缔蒂掂滇巅碘佃甸玷惦奠刁叼迭谍碟鼎董栋兜蚪逗痘睹妒镀" + + "缎兑墩盹囤钝咄哆踱垛堕舵惰跺讹娥峨蛾扼鄂愕遏噩饵贰筏矾妃匪诽吠" + + "吩氛焚忿讽敷芙拂俘袱甫斧俯脯咐缚尬丐柑竿尴秆橄赣冈肛杠羔膏糕镐" + + "疙搁蛤庚羹埂耿梗蚣躬汞苟垢沽辜雇寡卦褂乖棺逛闺瑰诡癸跪亥骇酣憨" + + "涵悍捍焊憾撼翰夯嚎皓禾烘弘弧唬沪猾徊槐宦涣焕痪凰惶蝗簧恍谎幌卉" + + "讳诲贿晦秽荤豁讥叽唧缉畸箕稽棘嫉妓祭鲫冀颊奸歼煎拣俭柬茧捡荐贱" + + "涧溅槛缰桨酱椒跤蕉侥狡绞饺矫剿缴窖酵秸睫芥诫藉襟谨荆兢靖窘揪灸" + + "玖韭臼疚拘驹鞠桔沮炬锯娟捐鹃绢眷诀倔崛爵钧骏竣咖揩楷勘坎慷糠扛" + + "亢拷铐坷苛磕蝌垦恳啃吭抠叩寇窟垮挎筷筐旷框眶盔窥魁馈坤捆廓睐婪" + + "澜揽缆榄琅榔唠姥涝烙酪垒磊肋擂棱狸漓篱吏沥俐荔栗砾痢雳镰敛粱谅" + + "晾寥嘹撩缭瞭咧琳鳞凛吝赁躏拎伶聆菱浏琉馏榴咙胧聋窿娄搂篓陋庐颅" + + "卤虏赂禄吕侣屡缕峦抡仑沦啰锣箩骡蟆馒瞒蔓莽锚卯昧媚魅氓朦檬锰咪" + + "靡眯觅缅瞄渺藐蔑皿闽悯冥铭谬馍摹茉寞沐募睦暮捺挠瑙呐馁妮匿溺腻" + + "捻撵碾聂孽拧狞柠泞钮脓疟虐懦糯殴鸥呕藕趴啪耙徘湃潘畔乓螃刨袍沛" + + "砰烹彭澎篷坯劈霹啤僻翩撇聘乒坪魄仆菩圃瀑曝柒凄祈脐崎鳍乞迄泣掐" + + "洽钳乾黔谴嵌歉呛跷锹侨憔俏峭窍翘撬怯钦芹擒寝沁卿蜻擎琼囚岖渠痊" + + "瘸冉瓤壬刃纫韧戎茸蓉榕冗揉蹂蠕汝褥蕊闰腮叁搔骚臊涩瑟鲨煞霎筛删" + + "煽擅赡裳晌捎勺奢赦呻绅沈笙甥矢屎恃拭柿嗜誓梳淑赎蜀曙恕庶墅漱蟀" + + "拴栓涮吮烁硕嗽嘶巳伺祀肆讼诵酥粟溯隋祟隧唆梭嗦琐蹋苔汰瘫痰谭檀" + + "毯棠膛倘淌烫滔誊剔屉剃涕惕恬舔迢帖彤瞳捅凸秃颓蜕褪屯豚臀驮鸵椭" + + "洼袜豌宛婉惋皖腕枉妄偎薇巍帷苇畏尉猬蔚瘟紊嗡涡蜗呜巫诬芜梧蜈侮" + + "捂鹉勿戊昔犀熄蟋徙匣侠暇馅羡镶宵潇箫霄嚣淆肖哮啸蝎邪挟懈芯锌薪" + + "馨衅腥汹锈戌墟旭恤酗婿絮轩喧癣炫绚渲靴薛勋熏旬驯汛逊殉丫押涯衙" + + "讶焉阎蜒檐砚唁谚堰殃秧鸯漾夭吆妖尧肴姚窑谣舀椰腋壹怡贻胰倚屹邑" + + "绎姻茵荫殷寅淫瘾莺樱鹦荧莹萤颖佣庸咏踊酉佑迂淤渝隅逾榆舆屿禹芋" + + "冤鸳渊猿苑粤耘陨酝哉赃凿蚤澡憎咋喳轧闸乍诈栅榨斋寨毡瞻斩盏崭辗" + + "栈绽彰樟杖昭沼肇辙蔗贞斟疹怔狰筝拯吱侄帜挚秩掷窒滞稚衷粥肘帚咒" + + "昼拄瞩蛀铸拽撰妆幢椎锥坠缀赘谆卓拙灼茁浊酌啄琢咨姊揍卒佐佘赊"; final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false); final FreeTypeFontParameter parameter = new FreeTypeFontParameter(); parameter.characters = chars; From b7b697b4f2f4c07bb88239deed969bec80a27716 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 4 Sep 2019 13:11:14 +0000 Subject: [PATCH 31/68] fix typo --- forge-gui/res/languages/cn-ZH.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/languages/cn-ZH.properties b/forge-gui/res/languages/cn-ZH.properties index 76501d900d7..e6a89f7f898 100644 --- a/forge-gui/res/languages/cn-ZH.properties +++ b/forge-gui/res/languages/cn-ZH.properties @@ -769,7 +769,7 @@ ttbtnLoadDeck=打开套牌(Ctrl+O) ttbtnNewDeck=新建套牌(Ctrl+N) ttbtnPrintProxies=打印到HTML文件(Ctrl+P) lblImport=导入 -ttImportDeck=常识从非Forge格式导入套牌(Ctrl+I) +ttImportDeck=尝试从非Forge格式导入套牌(Ctrl+I) lblTitle=标题 #ImageView.java lblExpandallgroups=展开所有组 From 2b0e47dd14ca8cd7d72069d6d707cd1570212346 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 5 Sep 2019 08:24:58 +0800 Subject: [PATCH 32/68] Initial migration --- forge-core/src/main/java/forge/deck/CardPool.java | 3 +-- forge-core/src/main/java/forge/deck/Deck.java | 2 +- forge-core/src/main/java/forge/deck/DeckGroup.java | 2 +- .../src/main/java/forge/util/collect/FCollection.java | 2 +- .../src/main/java/forge/util/maps/MapToAmountUtil.java | 2 +- .../src/main/java/forge/itemmanager/views/ItemListView.java | 6 +++--- .../forge/screens/home/gauntlet/ContestGauntletLister.java | 3 +-- .../forge/screens/home/gauntlet/QuickGauntletLister.java | 3 +-- .../main/java/forge/screens/home/quest/QuestFileLister.java | 2 +- .../src/main/java/forge/view/arcane/FloatingZone.java | 3 +-- forge-gui-mobile/src/forge/itemmanager/ItemManager.java | 2 +- .../src/forge/screens/gauntlet/LoadGauntletScreen.java | 3 +-- .../forge/screens/planarconquest/LoadConquestScreen.java | 3 +-- .../src/forge/screens/quest/LoadQuestScreen.java | 3 +-- forge-gui-mobile/src/forge/toolbox/GuiChoose.java | 2 +- .../src/main/java/forge/itemmanager/AdvancedSearch.java | 2 +- .../src/main/java/forge/itemmanager/ItemManagerModel.java | 3 +-- .../src/main/java/forge/itemmanager/SItemManagerUtil.java | 3 +-- forge-gui/src/main/java/forge/limited/BoosterDraft.java | 2 +- forge-gui/src/main/java/forge/limited/CardRanker.java | 2 +- forge-gui/src/main/java/forge/match/HostedMatch.java | 6 +++--- .../src/main/java/forge/net/client/GameClientHandler.java | 2 +- .../src/main/java/forge/player/PlayerControllerHuman.java | 2 +- forge-gui/src/main/java/forge/quest/BoosterUtils.java | 6 +++--- forge-gui/src/main/java/forge/quest/QuestEventDraft.java | 2 +- .../src/main/java/forge/quest/QuestUtilUnlockSets.java | 2 +- .../java/forge/tournament/system/AbstractTournament.java | 6 +++--- .../main/java/forge/tournament/system/TournamentSwiss.java | 2 +- 28 files changed, 36 insertions(+), 45 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index b484f31ab98..5f1d8518634 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -27,7 +27,6 @@ import forge.util.ItemPoolSorter; import forge.util.MyRandom; import org.apache.commons.lang3.StringUtils; -import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; @@ -198,7 +197,7 @@ public class CardPool extends ItemPool { public String toCardList(String separator) { List> main2sort = Lists.newArrayList(this); - Collections.sort(main2sort, ItemPoolSorter.BY_NAME_THEN_SET); + main2sort.sort(ItemPoolSorter.BY_NAME_THEN_SET); final CardDb commonDb = StaticData.instance().getCommonCards(); StringBuilder sb = new StringBuilder(); diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java index 3dee5c15371..34f461432d8 100644 --- a/forge-core/src/main/java/forge/deck/Deck.java +++ b/forge-core/src/main/java/forge/deck/Deck.java @@ -123,7 +123,7 @@ public class Deck extends DeckBase implements Iterable 1) { //sort by type so signature spell comes after oathbreaker - Collections.sort(result, new Comparator() { + result.sort(new Comparator() { @Override public int compare(final PaperCard c1, final PaperCard c2) { return Boolean.compare(c1.getRules().canBeSignatureSpell(), c2.getRules().canBeSignatureSpell()); diff --git a/forge-core/src/main/java/forge/deck/DeckGroup.java b/forge-core/src/main/java/forge/deck/DeckGroup.java index 1a48f019d25..02b0368fa97 100644 --- a/forge-core/src/main/java/forge/deck/DeckGroup.java +++ b/forge-core/src/main/java/forge/deck/DeckGroup.java @@ -79,7 +79,7 @@ public class DeckGroup extends DeckBase { if (aiDecks.size() < 2) { return; } - Collections.sort(aiDecks, comparator); + aiDecks.sort(comparator); } @Override diff --git a/forge-core/src/main/java/forge/util/collect/FCollection.java b/forge-core/src/main/java/forge/util/collect/FCollection.java index ac523f54560..7e8fef286fd 100644 --- a/forge-core/src/main/java/forge/util/collect/FCollection.java +++ b/forge-core/src/main/java/forge/util/collect/FCollection.java @@ -518,7 +518,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, * {@inheritDoc} */ public void sort(final Comparator comparator) { - Collections.sort(list, comparator); + list.sort(comparator); } /** diff --git a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java index de1e68f9ae5..d793eded1a3 100644 --- a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java +++ b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java @@ -132,7 +132,7 @@ public final class MapToAmountUtil { for (final Entry entry : map.entrySet()) { entries.add(Pair.of(entry.getKey(), entry.getValue())); } - Collections.sort(entries, new Comparator>() { + entries.sort(new Comparator>() { @Override public int compare(final Entry o1, final Entry o2) { return o1.getValue().compareTo(o2.getValue()); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java index c7dc42ba265..bfa7320e7ef 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java @@ -35,7 +35,6 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.LinkedList; @@ -165,8 +164,9 @@ public final class ItemListView extends ItemView { columns.add(colOverrides.get(colConfig.getDef())); } } - Collections.sort(columns, new Comparator() { - @Override public int compare(final ItemTableColumn arg0, final ItemTableColumn arg1) { + columns.sort(new Comparator() { + @Override + public int compare(final ItemTableColumn arg0, final ItemTableColumn arg1) { return Integer.compare(arg0.getIndex(), arg1.getIndex()); } }); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java index 588cf960802..e496a04cfcb 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java @@ -4,7 +4,6 @@ import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -47,7 +46,7 @@ public class ContestGauntletLister extends JPanel { final List tempRows = new ArrayList(); final List sorted = new ArrayList(); for (final GauntletData gd : gd0) { sorted.add(gd); } - Collections.sort(sorted, new Comparator() { + sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { return x.getName().compareTo(y.getName()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java index b0e9d04cfdb..3f02a3062f6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java @@ -4,7 +4,6 @@ import java.awt.Color; import java.awt.event.MouseEvent; import java.io.File; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -66,7 +65,7 @@ public class QuickGauntletLister extends JPanel { final List tempRows = new ArrayList(); final List sorted = new ArrayList(); for (final GauntletData gd : gauntlets) { sorted.add(gd); } - Collections.sort(sorted, new Comparator() { + sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java index e6224e3b574..0edfa537401 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java @@ -67,7 +67,7 @@ public class QuestFileLister extends JPanel { List tempRows = new ArrayList(); List sorted = new ArrayList(); for (QuestData qd : qd0) { sorted.add(qd); } - Collections.sort(sorted, new Comparator() { + sorted.sort(new Comparator() { @Override public int compare(final QuestData x, final QuestData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index 94ae1473e17..ff866a62f17 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -19,7 +19,6 @@ package forge.view.arcane; import java.util.HashMap; import java.util.Map; -import java.util.Collections; import java.util.Comparator; import java.awt.event.MouseEvent; @@ -127,7 +126,7 @@ public class FloatingZone extends FloatingCardArea { if ( zoneCards != null ) { cardList = new FCollection(zoneCards); if ( sortedByName ) { - Collections.sort(cardList, comp); + cardList.sort(comp); } return cardList; } else { diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index 4daa745c651..c8110863cb7 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -229,7 +229,7 @@ public abstract class ItemManager extends FContainer im cols.add(colOverrides.get(colConfig.getDef())); } } - Collections.sort(cols, new Comparator() { + cols.sort(new Comparator() { @Override public int compare(ItemColumn arg0, ItemColumn arg1) { return Integer.compare(arg0.getConfig().getIndex(), arg1.getConfig().getIndex()); diff --git a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java index fd123f87f1f..5df4b89ef06 100644 --- a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java +++ b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java @@ -3,7 +3,6 @@ package forge.screens.gauntlet; import java.io.File; import java.text.NumberFormat; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; import com.badlogic.gdx.utils.Align; @@ -299,7 +298,7 @@ public class LoadGauntletScreen extends LaunchScreen { for (GauntletData gauntlet : gauntlets) { sorted.add(gauntlet); } - Collections.sort(sorted, new Comparator() { + sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java index 581d7e47504..39cc1d31d07 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java @@ -2,7 +2,6 @@ package forge.screens.planarconquest; import java.io.File; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -337,7 +336,7 @@ public class LoadConquestScreen extends LaunchScreen { for (ConquestData qd : qd0) { sorted.add(qd); } - Collections.sort(sorted, new Comparator() { + sorted.sort(new Comparator() { @Override public int compare(final ConquestData x, final ConquestData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java index c17ba142e31..c80e1787702 100644 --- a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java @@ -4,7 +4,6 @@ import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -339,7 +338,7 @@ public class LoadQuestScreen extends LaunchScreen { for (QuestData qd : qd0) { sorted.add(qd); } - Collections.sort(sorted, new Comparator() { + sorted.sort(new Comparator() { @Override public int compare(final QuestData x, final QuestData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java index 0b369d8fe4c..0e6b5a0667d 100644 --- a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java +++ b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java @@ -334,7 +334,7 @@ public class GuiChoose { // If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine public static void sortedGetChoices(final String message, final int min, final int max, final List choices, Comparator comparer, final Callback> callback) { // You may create a copy of source list if callers expect the collection to be unchanged - Collections.sort(choices, comparer); + choices.sort(comparer); getChoices(message, min, max, choices, callback); } } diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index d02c5e76c97..d9fd40b25c5 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -209,7 +209,7 @@ public class AdvancedSearch { List cards = FModel.getMagicDb().getCommonCards().getAllCards(input.getName()); if (cards.size() <= 1) { return true; } - Collections.sort(cards, FModel.getMagicDb().getEditions().CARD_EDITION_COMPARATOR); + cards.sort(FModel.getMagicDb().getEditions().CARD_EDITION_COMPARATOR); return cards.get(0) == input; } }), diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java index 4969909ac9d..31c8dc92d7a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java @@ -18,7 +18,6 @@ package forge.itemmanager; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -126,7 +125,7 @@ public final class ItemManagerModel { public void refreshSort() { if (getOrderedList().isEmpty()) { return; } - Collections.sort(getOrderedList(), new MyComparator()); + getOrderedList().sort(new MyComparator()); } //Manages sorting orders for multiple depths of sorting diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index 78a6a894b06..1fb55a4f7b7 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -12,7 +12,6 @@ import forge.util.ComparableOp; import forge.util.Localizer; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map.Entry; @@ -147,7 +146,7 @@ public final class SItemManagerUtil { for (final Entry itemEntry : items) { sorted.add(itemEntry); } - Collections.sort(sorted, new Comparator>() { + sorted.sort(new Comparator>() { @Override public int compare(final Entry x, final Entry y) { return x.getKey().toString().compareTo(y.getKey().toString()); diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraft.java b/forge-gui/src/main/java/forge/limited/BoosterDraft.java index 09d22dca69e..f3f58037b5b 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraft.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraft.java @@ -158,7 +158,7 @@ public class BoosterDraft implements IBoosterDraft { if (myDrafts.isEmpty()) { SOptionPane.showMessageDialog("No custom draft files found."); } else { - Collections.sort(myDrafts, new Comparator() { + myDrafts.sort(new Comparator() { @Override public int compare(CustomLimited o1, CustomLimited o2) { return o1.getName().compareTo(o2.getName()); diff --git a/forge-gui/src/main/java/forge/limited/CardRanker.java b/forge-gui/src/main/java/forge/limited/CardRanker.java index 295acb7c1e9..4fa6b84d7ee 100644 --- a/forge-gui/src/main/java/forge/limited/CardRanker.java +++ b/forge-gui/src/main/java/forge/limited/CardRanker.java @@ -171,7 +171,7 @@ public class CardRanker { } private static List sortAndCreateList(List> cardScores) { - Collections.sort(cardScores, Collections.reverseOrder(new CardRankingComparator())); + cardScores.sort(Collections.reverseOrder(new CardRankingComparator())); List rankedCards = new ArrayList<>(cardScores.size()); for (Pair pair : cardScores) { diff --git a/forge-gui/src/main/java/forge/match/HostedMatch.java b/forge-gui/src/main/java/forge/match/HostedMatch.java index 34919b479c2..bfcb5ad06c7 100644 --- a/forge-gui/src/main/java/forge/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/match/HostedMatch.java @@ -1,7 +1,6 @@ package forge.match; import java.util.Collection; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -109,8 +108,9 @@ public class HostedMatch { } final List sortedPlayers = Lists.newArrayList(players); - Collections.sort(sortedPlayers, new Comparator() { - @Override public final int compare(final RegisteredPlayer p1, final RegisteredPlayer p2) { + sortedPlayers.sort(new Comparator() { + @Override + public final int compare(final RegisteredPlayer p1, final RegisteredPlayer p2) { final int v1 = p1.getPlayer() instanceof LobbyPlayerHuman ? 0 : 1; final int v2 = p2.getPlayer() instanceof LobbyPlayerHuman ? 0 : 1; return Integer.compare(v1, v2); diff --git a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java index 30d977378a1..60eebcaabfc 100644 --- a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java +++ b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java @@ -206,7 +206,7 @@ final class GameClientHandler extends GameProtocolHandler { } final List sortedPlayers = Lists.newArrayList(players); - Collections.sort(sortedPlayers, new Comparator() { + sortedPlayers.sort(new Comparator() { @Override public final int compare(final RegisteredPlayer p1, final RegisteredPlayer p2) { final int v1 = p1.getPlayer() instanceof LobbyPlayerHuman ? 0 : 1; diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 16bf87f71b2..b3afc07f7df 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1147,7 +1147,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // create sorted list from map from least to most frequent List> sortedList = Lists.newArrayList(typesInDeck.entrySet()); - Collections.sort(sortedList, new Comparator>() { + sortedList.sort(new Comparator>() { public int compare(Entry o1, Entry o2) { return o1.getValue().compareTo(o2.getValue()); } diff --git a/forge-gui/src/main/java/forge/quest/BoosterUtils.java b/forge-gui/src/main/java/forge/quest/BoosterUtils.java index 84d6cb768bd..43fe9083c46 100644 --- a/forge-gui/src/main/java/forge/quest/BoosterUtils.java +++ b/forge-gui/src/main/java/forge/quest/BoosterUtils.java @@ -551,19 +551,19 @@ public final class BoosterUtils { public static void sort(List cards) { //sort cards alphabetically so colors appear together and rares appear on top - Collections.sort(cards, new Comparator() { + cards.sort(new Comparator() { @Override public int compare(PaperCard c1, PaperCard c2) { return c1.getName().compareTo(c2.getName()); } }); - Collections.sort(cards, new Comparator() { + cards.sort(new Comparator() { @Override public int compare(PaperCard c1, PaperCard c2) { return c1.getRules().getColor().compareTo(c2.getRules().getColor()); } }); - Collections.sort(cards, new Comparator() { + cards.sort(new Comparator() { @Override public int compare(PaperCard c1, PaperCard c2) { return c2.getRarity().compareTo(c1.getRarity()); diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java index a846ce2feda..460bb8a4a5e 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java @@ -991,7 +991,7 @@ public class QuestEventDraft implements IQuestEvent { } final boolean oldSetsFirst = sets.get(0).getDate().before(FModel.getMagicDb().getEditions().get("SOM").getDate()); - Collections.sort(allowedSets, new Comparator() { + allowedSets.sort(new Comparator() { @Override public int compare(final CardEdition edition1, final CardEdition edition2) { if (edition1.getDate().before(edition2.getDate())) { diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java index 3e6a5d0fe29..598afcbb667 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java @@ -168,7 +168,7 @@ public class QuestUtilUnlockSets { } // sort by distance, then by code desc - Collections.sort(excludedWithDistances, new Comparator>() { + excludedWithDistances.sort(new Comparator>() { @Override public int compare(ImmutablePair o1, ImmutablePair o2) { long delta = o2.right - o1.right; diff --git a/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java b/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java index e658f3cac29..b70a9b526da 100644 --- a/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java +++ b/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java @@ -109,21 +109,21 @@ public abstract class AbstractTournament implements Serializable { public void sortAllPlayers(String sortType) { if (sortType.equals("score")) { - Collections.sort(allPlayers, new Comparator() { + allPlayers.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return o2.getScore() - o1.getScore(); } }); } else if (sortType.equals("index")) { - Collections.sort(allPlayers, new Comparator() { + allPlayers.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return o2.getIndex() - o1.getIndex(); } }); } else if (sortType.equals("swiss")) { - Collections.sort(allPlayers, new Comparator() { + allPlayers.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return o2.getSwissScore() - o1.getSwissScore(); diff --git a/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java b/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java index 31c9ae300ff..1a7df43b495 100644 --- a/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java +++ b/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java @@ -129,7 +129,7 @@ public class TournamentSwiss extends AbstractTournament { return pairSwissGroup(players); } - Collections.sort(players, new Comparator() { + players.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return availableOpponents.get(o1).size() - availableOpponents.get(o2).size(); From b07262320e96f69f48f6184b0bb99ffa38c56d2c Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 5 Sep 2019 09:26:43 +0800 Subject: [PATCH 33/68] Update Typelists --- forge-gui/res/lists/TypeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index 701d7db0a4a..01da5b29239 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -156,6 +156,7 @@ Nephilim:Nephilims Nightmare:Nightmares Nightstalker:Nightstalkers Ninja:Ninjas +Noble:Nobles Noggle:Noggles Nomad:Nomads Nymph:Nymphs @@ -243,6 +244,7 @@ Vedalken:Vedalkens Viashino:Viashinos Volver:Volvers Wall:Walls +Warlock:Warlocks Warrior:Warriors Weird:Weirds Werewolf:Werewolves @@ -258,6 +260,7 @@ Yeti:Yetis Zombie:Zombies Zubera:Zuberas [SpellTypes] +Adventure Arcane Trap [EnchantmentTypes] From f5e55ae2aed858ce0e09e3c0c44bae825b5386aa Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 5 Sep 2019 14:31:55 +0800 Subject: [PATCH 34/68] Add two cards --- .../cardsfolder/upcoming/garruk_cursed_hunstman.txt | 11 +++++++++++ .../upcoming/rankle_master_of_pranks.txt | 13 +++++++++++++ forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt | 8 ++++++++ 3 files changed, 32 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/garruk_cursed_hunstman.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rankle_master_of_pranks.txt create mode 100644 forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt diff --git a/forge-gui/res/cardsfolder/upcoming/garruk_cursed_hunstman.txt b/forge-gui/res/cardsfolder/upcoming/garruk_cursed_hunstman.txt new file mode 100644 index 00000000000..88d6d1c66ea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/garruk_cursed_hunstman.txt @@ -0,0 +1,11 @@ +Name:Garruk, Cursed Hunstman +Types:Legendary Planeswalker Garruk +ManaCost:4 B G +Loyalty:5 +A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | LegacyImage$ bg 2 2 wolf garruk eld | TokenAmount$ 2 | TokenScript$ bg_2_2_wolf_garruk | TokenOwner$ You | SpellDescription$ Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control." +A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Planeswalker$ True | SubAbility$ DBDraw | SpellDescription$ Destroy target creature. Draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Name$ Emblem - Garruk, Cursed Hunstman | Image$ emblem_garruk_cursed_hunstman | StaticAbilities$ STTrample | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +3/+3 and have trample." +SVar:STTrample:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Trample | AddPower$ 3 | AddToughness$ 3 | Description$ Creatures you control get +3/+3 and have trample. +DeckHas:Ability$Token +Oracle:[0]: Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control."\n[-3]: Destroy target creature. Draw a card.\n:[-6]: You get an emblem with "Creatures you control get +3/+3 and have trample." \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/rankle_master_of_pranks.txt b/forge-gui/res/cardsfolder/upcoming/rankle_master_of_pranks.txt new file mode 100644 index 00000000000..dc56299cd37 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rankle_master_of_pranks.txt @@ -0,0 +1,13 @@ +Name:Rankle, Master of Pranks +ManaCost:2 B B +Types:Legendary Creature Faerie Rogue +PT:3/3 +K:Flying +K:Haste +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigCharm | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ DBDiscard,DBLoseLife,DBSac | MinCharmNum$ 0 | CharmNum$ 3 +SVar:DBDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player | SpellDescription$ Each player discards a card. +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 | Defined$ Player | SubAbility$ DBDraw | SpellDescription$ Each player loses 1 life and draws a card. +SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 +SVar:DBSac:DB$ Sacrifice | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices a creature. +Oracle:Flying, haste\nWhenever Rankle, Master of Pranks deals combat damage to a player, choose any number —\n• Each player discards a card.\n• Each player loses 1 life and draws a card.\n• Each player sacrifices a creature. diff --git a/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt b/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt new file mode 100644 index 00000000000..fbd6f310c49 --- /dev/null +++ b/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt @@ -0,0 +1,8 @@ +Name:Wolf +ManaCost:no cost +Types:Creature Wolf +Colors:black,green +PT:2/2 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature dies, put a loyalty counter on each Garruk you control. +SVar:TrigPutCounter:DB$ PutCounterAll | ValidCards$ Garruk.YouCtrl | CounterType$ LOYALTY | CounterNum$ 1 +SVar:When this creature dies, put a loyalty counter on each Garruk you control. From 79f768e88aa5d946ab13969d3bfb357dd8d6d22b Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 5 Sep 2019 07:28:48 +0000 Subject: [PATCH 35/68] Update PumpAllEffect: update view on Until Command --- .../src/main/java/forge/game/ability/effects/PumpAllEffect.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index a7662d8b76b..010914c6775 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -82,6 +82,7 @@ public class PumpAllEffect extends SpellAbilityEffect { for (String kw : hiddenkws) { tgtC.removeHiddenExtrinsicKeyword(kw); } + tgtC.updatePowerToughnessForView(); game.fireEvent(new GameEventCardStatsChanged(tgtC)); } From bfe5a5a6a3ad600ab7cf39a56ef4e95d94f89361 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 5 Sep 2019 18:10:53 +0800 Subject: [PATCH 36/68] Add forgescribed cards --- .../res/cardsfolder/upcoming/bake_into_a_pie.txt | 7 +++++++ .../res/cardsfolder/upcoming/crystal_slipper.txt | 6 ++++++ .../res/cardsfolder/upcoming/eye_collector.txt | 8 ++++++++ .../res/cardsfolder/upcoming/faerie_vandal.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/fireborn_knight.txt | 7 +++++++ .../res/cardsfolder/upcoming/gilded_goose.txt | 5 +++-- .../res/cardsfolder/upcoming/heraldic_banner.txt | 9 +++++++++ .../res/cardsfolder/upcoming/maraleaf_pixie.txt | 8 ++++++++ .../res/cardsfolder/upcoming/midnight_clock.txt | 13 +++++++++++++ .../cardsfolder/upcoming/piper_of_the_swarm.txt | 11 +++++++++++ .../cardsfolder/upcoming/syr_konrad_the_grim.txt | 10 ++++++++++ .../cardsfolder/upcoming/the_circle_of_loyalty.txt | 14 ++++++++++++++ forge-gui/res/cardsfolder/upcoming/tome_raider.txt | 8 ++++++++ .../cardsfolder/upcoming/tournament_grounds.txt | 9 +++++++++ .../cardsfolder/upcoming/wintermoor_commander.txt | 12 ++++++++++++ .../res/cardsfolder/upcoming/wishful_merfolk.txt | 8 ++++++++ .../res/cardsfolder/upcoming/witching_well.txt | 7 +++++++ .../res/cardsfolder/upcoming/witchs_cottage.txt | 10 ++++++++++ 18 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/bake_into_a_pie.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/crystal_slipper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/eye_collector.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/faerie_vandal.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/fireborn_knight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/heraldic_banner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/maraleaf_pixie.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/midnight_clock.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/piper_of_the_swarm.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/syr_konrad_the_grim.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/the_circle_of_loyalty.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tome_raider.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tournament_grounds.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wintermoor_commander.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wishful_merfolk.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/witching_well.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bake_into_a_pie.txt b/forge-gui/res/cardsfolder/upcoming/bake_into_a_pie.txt new file mode 100644 index 00000000000..1f226e4432c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bake_into_a_pie.txt @@ -0,0 +1,7 @@ +Name:Bake into a Pie +ManaCost:2 B B +Types:Instant +A:SP$ Destroy | Cost$ 2 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBToken | SpellDescription$ Destroy target creature. Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +Oracle:Destroy target creature. Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/crystal_slipper.txt b/forge-gui/res/cardsfolder/upcoming/crystal_slipper.txt new file mode 100644 index 00000000000..5d89ec8c092 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/crystal_slipper.txt @@ -0,0 +1,6 @@ +Name:Crystal Slipper +ManaCost:1 R +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddKeyword$ Haste | Description$ Equipped creature gets +1/+0 and has haste. +K:Equip:1 +Oracle:Equipped creature gets +1/+0 and has haste.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/upcoming/eye_collector.txt b/forge-gui/res/cardsfolder/upcoming/eye_collector.txt new file mode 100644 index 00000000000..d7c466491f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/eye_collector.txt @@ -0,0 +1,8 @@ +Name:Eye Collector +ManaCost:B +Types:Creature Faerie +PT:1/1 +K:Flying +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, each player puts the top card of their library into their graveyard. +SVar:TrigMill:DB$Mill | NumCards$ 1 | Defined$ Player +Oracle:Flying\nWhenever Eye Collector deals combat damage to a player, each player puts the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_vandal.txt b/forge-gui/res/cardsfolder/upcoming/faerie_vandal.txt new file mode 100644 index 00000000000..d75cabc8602 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/faerie_vandal.txt @@ -0,0 +1,10 @@ +Name:Faerie Vandal +ManaCost:1 U +Types:Creature Faerie Rogue +PT:1/2 +K:Flash +K:Flying +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you draw your second card each turn, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +AI:RemoveDeck:Random +Oracle:Flash\nFlying\nWhenever you draw your second card each turn, put a +1/+1 counter on Faerie Vandal. diff --git a/forge-gui/res/cardsfolder/upcoming/fireborn_knight.txt b/forge-gui/res/cardsfolder/upcoming/fireborn_knight.txt new file mode 100644 index 00000000000..eec17b67b89 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fireborn_knight.txt @@ -0,0 +1,7 @@ +Name:Fireborn Knight +ManaCost:R/W R/W R/W R/W +Types:Creature Human Knight +PT:2/3 +K:Double Strike +A:AB$ Pump | Cost$ RW RW RW RW | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. +Oracle:Double strike\n{R/W}{R/W}{R/W}{R/W}: Fireborn Knight gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt b/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt index ae4ba35da20..dd8cd58571c 100644 --- a/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt +++ b/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt @@ -3,8 +3,9 @@ ManaCost:G Types:Creature Bird PT:0/2 K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield create a food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") SVar:TrigFood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld A:AB$ Token | Cost$ 1 G T | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food Token. A:AB$ Mana | Cost$ T Sac<1/Food> | Produced$ Any | SpellDescription$ Add one mana of any color. -Oracle:Flying\nWhen Gilded Goose enters the battlefield create a food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{1}{G}, {T}: Create a Food token.\n{T}, Sacrifice a Food: Add one mana of any color. +DeckHas:Ability$LifeGain +Oracle:Flying\nWhen Gilded Goose enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{1}{G}, {T}: Create a Food token.\n{T}, Sacrifice a Food: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/heraldic_banner.txt b/forge-gui/res/cardsfolder/upcoming/heraldic_banner.txt new file mode 100644 index 00000000000..4146dfe3285 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/heraldic_banner.txt @@ -0,0 +1,9 @@ +Name:Heraldic Banner +ManaCost:3 +Types:Artifact +K:ETBReplacement:Other:ChooseColor +SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color. | AILogic$ MostProminentHumanCreatures +S:Mode$ Continuous | Affected$ Creature.ChosenColor+YouCtrl | AddPower$ 1 | Description$ Creatures you control of the chosen color get +1/+0. +A:AB$ Mana | Cost$ T | Produced$ Chosen | SpellDescription$ Add one mana of the chosen color. +SVar:PlayMain1:TRUE +Oracle:As Heraldic Banner enters the battlefield, choose a color.\nCreatures you control of the chosen color get +1/+0.\n{T}: Add one mana of the chosen color. diff --git a/forge-gui/res/cardsfolder/upcoming/maraleaf_pixie.txt b/forge-gui/res/cardsfolder/upcoming/maraleaf_pixie.txt new file mode 100644 index 00000000000..c337e03e800 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/maraleaf_pixie.txt @@ -0,0 +1,8 @@ +Name:Maraleaf Pixie +ManaCost:G U +Types:Creature Faerie +PT:2/2 +K:Flying +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Flying\n{T}: Add {G} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt new file mode 100644 index 00000000000..a92cf6c1230 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt @@ -0,0 +1,13 @@ +Name:Midnight Clock +ManaCost:2 U +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ PutCounter | Cost$ 2 U | CounterType$ HOUR | CounterNum$ 1 | SpellDescription$ Put an hour counter on CARDNAME. +AI:RemoveDeck:Random +T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each upkeep, put an hour counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ HOUR | CounterNum$ 1 +T:Mode$ CounterAdded | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ HOUR | CounterAmount$ EQ12 | Execute$ TrigChangeAll | TriggerDescription$ When the twelfth hour counter is put on CARDNAME, shuffle your hand and graveyard into your library, then draw seven cards. Exile CARDNAME. +SVar:TrigChangeAll:DB$ ChangeZoneAll | Origin$ Graveyard,Hand | Destination$ Library | ChangeType$ Card.YouOwn | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 7 | SubAbility$ DBExile +SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile +Oracle:{T}: Add {U}.\n{2}{U}: Put an hour counter on Midnight Clock.\nAt the beginning of each upkeep, put an hour counter on Midnight Clock.\nWhen the twelfth hour counter is put on Midnight Clock, shuffle your hand and graveyard into your library, then draw seven cards. Exile Midnight Clock. diff --git a/forge-gui/res/cardsfolder/upcoming/piper_of_the_swarm.txt b/forge-gui/res/cardsfolder/upcoming/piper_of_the_swarm.txt new file mode 100644 index 00000000000..cf376559189 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/piper_of_the_swarm.txt @@ -0,0 +1,11 @@ +Name:Piper of the Swarm +ManaCost:1 B +Types:Creature Human Warlock +PT:1/3 +S:Mode$ Continuous | Affected$ Rat.YouCtrl | AddKeyword$ Menace | Description$ Rats you control have menace. +SVar:PlayMain1:TRUE +DeckHints:Type$Rat +A:AB$ Token | Cost$ 1 B T | TokenAmount$ 1 | TokenScript$ b_1_1_rat | TokenOwner$ You | LegacyImage$ b 1 1 rat eld | SpellDescription$ Create a 1/1 black Rat creature token. +A:AB$ GainControl | Cost$ 2 B B T Sac<3/Rat> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Gain control of target creature. +AI:RemoveDeck:All +Oracle:Rats you control have menace.\n{1}{B}, {T}: Create a 1/1 black Rat creature token.\n{2}{B}{B}, {T}, Sacrifice three Rats: Gain control of target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_konrad_the_grim.txt b/forge-gui/res/cardsfolder/upcoming/syr_konrad_the_grim.txt new file mode 100644 index 00000000000..3d7b61f5af9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_konrad_the_grim.txt @@ -0,0 +1,10 @@ +Name:Syr Konrad, the Grim +ManaCost:3 B B +Types:Legendary Creature Human Knight +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever another creature dies, or a creature card is put into a graveyard from anywhere than the battlefield, or a creature card leaves your graveyard, CARDNAME deals 1 damage to each opponent. +T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Any | ValidCard$ Card.Creature+Other | TriggerZones$ Battlefield | Execute$ TrigDmg | Secondary$ True | TriggerDescription$ Whenever another creature dies, or a creature card is put into a graveyard from anywhere than the battlefield, or a creature card leaves your graveyard, CARDNAME deals 1 damage to each opponent. +SVar:TrigDmg:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 +A:AB$ Mill | Cost$ 1 B | NumCards$ 1 | Defined$ Player | SpellDescription$ Each player puts the top card of their library into their graveyard. +AI:RemoveDeck:All +Oracle:Whenever another creature dies, or a creature card is put into a graveyard from anywhere other than the battlefield, or a creature card leaves your graveyard, Syr Konrad, the Grim deals 1 damage to each opponent.\n{1}{B}: Each player puts the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/the_circle_of_loyalty.txt b/forge-gui/res/cardsfolder/upcoming/the_circle_of_loyalty.txt new file mode 100644 index 00000000000..16efcc7b77e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_circle_of_loyalty.txt @@ -0,0 +1,14 @@ +Name:The Circle of Loyalty +ManaCost:4 W W +Types:Legendary Artifact +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each Knight you control. +SVar:X:Count$Valid Knight.YouCtrl +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1. +T:Mode$ SpellCast | ValidCard$ Card.Legendary | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a legendary spell, create a 2/2 white Knight creature token with vigilance. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You | LegacyImage$ w 2 2 knight vigilance eld +A:AB$ Token | Cost$ 3 W T | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You | LegacyImage$ w 2 2 knight vigilance eld | SpellDescription$ Create a 2/2 white Knight creature token with vigilance. +SVar:PlayMain1:TRUE +SVar:BuffedBy:Legendary +DeckHas:Ability$Token +DeckHints:Type$Knight +Oracle:This spell costs {1} less to cast for each Knight you control.\nCreatures you control get +1/+1.\nWhenever you cast a legendary spell, create a 2/2 white Knight creature token with vigilance.\n{3}{W}, {T}: Create a 2/2 white Knight creature token with vigilance. diff --git a/forge-gui/res/cardsfolder/upcoming/tome_raider.txt b/forge-gui/res/cardsfolder/upcoming/tome_raider.txt new file mode 100644 index 00000000000..f28b1077eda --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tome_raider.txt @@ -0,0 +1,8 @@ +Name:Tome Raider +ManaCost:2 U +Types:Creature Faerie +PT:1/1 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Flying\nWhen Tome Raider enters the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/tournament_grounds.txt b/forge-gui/res/cardsfolder/upcoming/tournament_grounds.txt new file mode 100644 index 00000000000..dfaf64e80d0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tournament_grounds.txt @@ -0,0 +1,9 @@ +Name:Tournament Grounds +ManaCost:no cost +Types:Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Mana | Cost$ T | Produced$ R | RestrictValid$ Card.Knight,Card.Equipment | SpellDescription$ Add {R}. Spend this mana only to cast a Knight or Equipment spell. +A:AB$ Mana | Cost$ T | Produced$ W | RestrictValid$ Card.Knight,Card.Equipment | SpellDescription$ Add {W}. Spend this mana only to cast a Knight or Equipment spell. +A:AB$ Mana | Cost$ T | Produced$ B | RestrictValid$ Card.Knight,Card.Equipment | SpellDescription$ Add {B}. Spend this mana only to cast a Knight or Equipment spell. +AI:RemoveDeck:Random +Oracle:{T}: Add {C}.\n{T}: Add {R}, {W}, or {B}. Spend this mana only to cast a Knight or Equipment spell. diff --git a/forge-gui/res/cardsfolder/upcoming/wintermoor_commander.txt b/forge-gui/res/cardsfolder/upcoming/wintermoor_commander.txt new file mode 100644 index 00000000000..8ae9de01b7f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wintermoor_commander.txt @@ -0,0 +1,12 @@ +Name:Wintermoor Commander +ManaCost:W B +Types:Creature Human Knight +PT:2/* +K:Deathtouch +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetToughness$ X | References$ X | Description$ CARDNAME's toughness is equal to the number of Knights you control. +SVar:X:Count$Valid Knight.YouCtrl +SVar:BuffedBy:Knight +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target Knight you control gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) +SVar:TrigPump:DB$ Pump | ValidTgts$ Knight.YouCtrl+Other | TgtPrompt$ Select another target Knight you control | KW$ Indestructible +DeckHints:Type$Knight +Oracle:Deathtouch\nWintermoor Commander's toughness is equal to the number of Knights you control.\nWhenever Wintermoor Commander attacks, another target Knight you control gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/wishful_merfolk.txt b/forge-gui/res/cardsfolder/upcoming/wishful_merfolk.txt new file mode 100644 index 00000000000..fe1d0778d33 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wishful_merfolk.txt @@ -0,0 +1,8 @@ +Name:Wishful Merfolk +ManaCost:1 U +Types:Creature Merfolk +PT:3/2 +K:Defender +A:AB$ Debuff | Cost$ 1 U | Defined$ Self | Keywords$ Defender | SubAbility$ DBAnimate | SpellDescription$ CARDNAME loses defender and becomes a Human until end of turn. +SVar:DBAnimate:DB$Animate | Defined$ Self | Types$ Human | RemoveCreatureTypes$ True +Oracle:Defender\n{1}{U}: Wishful Merfolk loses defender and becomes a Human until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/witching_well.txt b/forge-gui/res/cardsfolder/upcoming/witching_well.txt new file mode 100644 index 00000000000..d0899ba9348 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/witching_well.txt @@ -0,0 +1,7 @@ +Name:Witching Well +ManaCost:U +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on the top in any order.) +SVar:TrigScry:DB$ Scry | ScryNum$ 2 +A:AB$ Draw | Cost$ 3 U Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. +Oracle:When Witching Well enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on the top in any order.)\n{3}{U}, Sacrifice Witching Well: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt new file mode 100644 index 00000000000..b6b9625fad9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt @@ -0,0 +1,10 @@ +Name:Witch's Cottage +ManaCost:no cost +Types:Land Swamp +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Swamps. +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield +SVar:ETBCheckSVar:Count$Valid Swamp.YouCtrl+Other +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target creature card from your graveyard on top of your library. +SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Library +Oracle:({T}: Add {B}.)\nWitch's Cottage enters the battlefield tapped unless you control three or more other Swamps.\nWhen Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. From 0f62a297c7f8b1c6b0c5555e3df0265f06cad4c4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 5 Sep 2019 18:20:36 +0800 Subject: [PATCH 37/68] Updated some codes --- .../main/java/forge/ai/AiBlockController.java | 2 +- .../src/main/java/forge/ai/AiController.java | 4 ++-- .../src/main/java/forge/ai/AiCostDecision.java | 8 ++++---- .../src/main/java/forge/ai/ComputerUtil.java | 2 +- .../src/main/java/forge/ai/ComputerUtilCard.java | 9 +++++---- .../src/main/java/forge/ai/ComputerUtilMana.java | 4 +++- .../src/main/java/forge/ai/SpecialCardAi.java | 16 ++++++++-------- .../main/java/forge/ai/ability/ChangeZoneAi.java | 2 +- .../src/main/java/forge/game/GameAction.java | 4 +++- .../src/main/java/forge/game/GameFormat.java | 2 +- .../forge/game/ability/effects/CharmEffect.java | 3 +-- .../src/main/java/forge/game/card/CardLists.java | 10 +++++----- .../src/main/java/forge/game/cost/Cost.java | 3 +-- 13 files changed, 36 insertions(+), 33 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index 82df82ef46f..e87a974d2db 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -124,7 +124,7 @@ public class AiBlockController { ComputerUtilCard.sortByEvaluateCreature(attackers); CardLists.sortByPowerDesc(attackers); //move cards like Phage the Untouchable to the front - Collections.sort(attackers, new Comparator() { + attackers.sort(new Comparator() { @Override public int compare(final Card o1, final Card o2) { if (o1.hasSVar("MustBeBlocked") && !o2.hasSVar("MustBeBlocked")) { diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index a027cc9ea1c..9a7dbc61048 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -608,7 +608,7 @@ public class AiController { ComputerUtilAbility.getAvailableCards(game, player); List all = ComputerUtilAbility.getSpellAbilities(cards, player); - Collections.sort(all, saComparator); // put best spells first + all.sort(saComparator); // put best spells first for (final SpellAbility sa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, player)) { ApiType saApi = sa.getApi(); @@ -1571,7 +1571,7 @@ public class AiController { if (all == null || all.isEmpty()) return null; - Collections.sort(all, saComparator); // put best spells first + all.sort(saComparator); // put best spells first for (final SpellAbility sa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, player)) { // Don't add Counterspells to the "normal" playcard lookups diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 47dfbbd4d4b..ef3d0b509cf 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -631,7 +631,7 @@ public class AiCostDecision extends CostDecisionMakerBase { CardPredicates.hasKeyword("Undying")); if (!prefs.isEmpty()) { - Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.P1P1)); + prefs.sort(CardPredicates.compareByCounterType(CounterType.P1P1)); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.P1P1; return result; @@ -642,7 +642,7 @@ public class AiCostDecision extends CostDecisionMakerBase { CardPredicates.hasKeyword("Persist")); if (!prefs.isEmpty()) { - Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.M1M1)); + prefs.sort(CardPredicates.compareByCounterType(CounterType.M1M1)); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.M1M1; return result; @@ -653,7 +653,7 @@ public class AiCostDecision extends CostDecisionMakerBase { CardPredicates.nameEquals("Chronozoa")); if (!prefs.isEmpty()) { - Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.TIME)); + prefs.sort(CardPredicates.compareByCounterType(CounterType.TIME)); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.TIME; return result; @@ -676,7 +676,7 @@ public class AiCostDecision extends CostDecisionMakerBase { return crd.getCounters(CounterType.QUEST) >= e + c; } }); - Collections.sort(prefs, Collections.reverseOrder(CardPredicates.compareByCounterType(CounterType.QUEST))); + prefs.sort(Collections.reverseOrder(CardPredicates.compareByCounterType(CounterType.QUEST))); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.QUEST; return result; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index f3172be4a43..ef3512b752f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2197,7 +2197,7 @@ public class ComputerUtil { } } - Collections.sort(goodChoices, CardLists.TextLenComparator); + goodChoices.sort(CardLists.TextLenComparator); CardLists.sortByCmcDesc(goodChoices); dChoices.add(goodChoices.get(0)); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 21197757d99..1587fcdb91b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -70,7 +70,7 @@ public class ComputerUtilCard { * @param list */ public static void sortByEvaluateCreature(final CardCollection list) { - Collections.sort(list, ComputerUtilCard.EvaluateCreatureComparator); + list.sort(ComputerUtilCard.EvaluateCreatureComparator); } // sortByEvaluateCreature() // The AI doesn't really pick the best artifact, just the most expensive. @@ -390,7 +390,7 @@ public class ComputerUtilCard { if (!Iterables.isEmpty(list)) { CardCollection cc = CardLists.filter(new CardCollection(list), Predicates.or(CardPredicates.isType("Instant"), CardPredicates.isType("Sorcery"))); - Collections.sort(cc, CardLists.CmcComparatorInv); + cc.sort(CardLists.CmcComparatorInv); if (cc.isEmpty()) { return null; @@ -802,8 +802,9 @@ public class ComputerUtilCard { if (color.hasGreen()) map.get(4).setValue(Integer.valueOf(map.get(4).getValue()+1)); } // for - Collections.sort(map, new Comparator>() { - @Override public int compare(Pair o1, Pair o2) { + map.sort(new Comparator>() { + @Override + public int compare(Pair o1, Pair o2) { return o2.getValue() - o1.getValue(); } }); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 8e9c0f84e2d..445c1bb08a3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -1,5 +1,7 @@ package forge.ai; - +/** + * Refactoring this class to use List sort (Instead of Collection) causes Android build not to compile... + * */ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.*; diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 27700e2455b..18750349f53 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -579,7 +579,7 @@ public class SpecialCardAi { int changeNum = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("ChangeNum"), sa); CardCollection lib = CardLists.filter(ai.getCardsIn(ZoneType.Library), Predicates.not(CardPredicates.nameEquals(sa.getHostCard().getName()))); - Collections.sort(lib, CardLists.CmcComparatorInv); + lib.sort(CardLists.CmcComparatorInv); // Additional cards which are difficult to auto-classify but which are generally good to Intuition for List highPriorityNamedCards = Lists.newArrayList("Accumulated Knowledge", "Take Inventory"); @@ -679,7 +679,7 @@ public class SpecialCardAi { // If we're playing Reanimator, we're really interested just in the highest CMC spells, not the // ones we necessarily have multiples of if (ComputerUtil.isPlayingReanimator(ai)) { - Collections.sort(libHighPriorityList, CardLists.CmcComparatorInv); + libHighPriorityList.sort(CardLists.CmcComparatorInv); } // Otherwise, try to grab something that is hopefully decent to grab, in priority order @@ -1173,7 +1173,7 @@ public class SpecialCardAi { if (atTargetCMCInLib.isEmpty()) { atTargetCMCInLib = CardLists.filter(creatsInLib, CardPredicates.greaterCMC(numManaSrcs)); } - Collections.sort(atTargetCMCInLib, CardLists.CmcComparatorInv); + atTargetCMCInLib.sort(CardLists.CmcComparatorInv); if (atTargetCMCInLib.isEmpty()) { // Nothing to aim for? return null; @@ -1181,11 +1181,11 @@ public class SpecialCardAi { // Cards in hand that are below the max CMC affordable by the AI CardCollection belowMaxCMC = CardLists.filter(creatsInHand, CardPredicates.lessCMC(numManaSrcs - 1)); - Collections.sort(belowMaxCMC, Collections.reverseOrder(CardLists.CmcComparatorInv)); + belowMaxCMC.sort(Collections.reverseOrder(CardLists.CmcComparatorInv)); // Cards in hand that are above the max CMC affordable by the AI CardCollection aboveMaxCMC = CardLists.filter(creatsInHand, CardPredicates.greaterCMC(numManaSrcs + 1)); - Collections.sort(aboveMaxCMC, CardLists.CmcComparatorInv); + aboveMaxCMC.sort(CardLists.CmcComparatorInv); Card maxCMC = !aboveMaxCMC.isEmpty() ? aboveMaxCMC.getFirst() : null; Card minCMC = !belowMaxCMC.isEmpty() ? belowMaxCMC.getFirst() : null; @@ -1218,7 +1218,7 @@ public class SpecialCardAi { // worth to fill the graveyard now if (ComputerUtil.isPlayingReanimator(ai) && !creatsInLib.isEmpty()) { CardCollection creatsInHandByCMC = new CardCollection(creatsInHand); - Collections.sort(creatsInHandByCMC, CardLists.CmcComparatorInv); + creatsInHandByCMC.sort(CardLists.CmcComparatorInv); return creatsInHandByCMC.getFirst(); } @@ -1243,14 +1243,14 @@ public class SpecialCardAi { if (atTargetCMCInLib.isEmpty()) { atTargetCMCInLib = CardLists.filter(creatsInLib, CardPredicates.greaterCMC(numManaSrcs)); } - Collections.sort(atTargetCMCInLib, CardLists.CmcComparatorInv); + atTargetCMCInLib.sort(CardLists.CmcComparatorInv); Card bestInLib = atTargetCMCInLib != null ? atTargetCMCInLib.getFirst() : null; if (bestInLib == null && ComputerUtil.isPlayingReanimator(ai)) { // For Reanimator, we don't mind grabbing the biggest thing possible to recycle it again with SotF later. CardCollection creatsInLibByCMC = new CardCollection(creatsInLib); - Collections.sort(creatsInLibByCMC, CardLists.CmcComparatorInv); + creatsInLibByCMC.sort(CardLists.CmcComparatorInv); return creatsInLibByCMC.getFirst(); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 93163475b87..98d5a90e960 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1321,7 +1321,7 @@ public class ChangeZoneAi extends SpellAbilityAi { chance = aic.getIntProperty(AiProps.BLINK_RELOAD_PLANESWALKER_CHANCE); } if (MyRandom.percentTrue(chance)) { - Collections.sort(aiPlaneswalkers, new Comparator() { + aiPlaneswalkers.sort(new Comparator() { @Override public int compare(final Card a, final Card b) { return a.getCounters(CounterType.LOYALTY) - b.getCounters(CounterType.LOYALTY); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 50d3523676d..50aa898902a 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -16,7 +16,9 @@ * along with this program. If not, see . */ package forge.game; - +/** + * Refactoring this class to use List sort (Instead of Collection) causes Android build not to compile... + * */ import com.google.common.base.Predicate; import com.google.common.collect.*; import forge.GameCommand; diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index bfa3f08efae..d0a6f0ce29a 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -403,7 +403,7 @@ public class GameFormat implements Comparable { naturallyOrdered = reader.naturallyOrdered; reverseDateOrdered = new ArrayList<>(naturallyOrdered); Collections.sort(naturallyOrdered); - Collections.sort(reverseDateOrdered, new InverseDateComparator()); + reverseDateOrdered.sort(new InverseDateComparator()); } public Iterable getOrderedList() { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index ef8dfcba924..15093f84f08 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -11,7 +11,6 @@ import forge.game.spellability.SpellAbility; import forge.util.Lang; import forge.util.collect.FCollection; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -191,7 +190,7 @@ public class CharmEffect extends SpellAbilityEffect { } // Sort Chosen by SA order - Collections.sort(chosen, new Comparator() { + chosen.sort(new Comparator() { @Override public int compare(AbilitySub o1, AbilitySub o2) { return Integer.compare(o1.getSVarInt("CharmOrder"), o2.getSVarInt("CharmOrder")); diff --git a/forge-game/src/main/java/forge/game/card/CardLists.java b/forge-game/src/main/java/forge/game/card/CardLists.java index cbb9a147018..844015cfeca 100644 --- a/forge-game/src/main/java/forge/game/card/CardLists.java +++ b/forge-game/src/main/java/forge/game/card/CardLists.java @@ -119,7 +119,7 @@ public class CardLists { * @param list */ public static void sortByCmcDesc(final List list) { - Collections.sort(list, CmcComparatorInv); + list.sort(CmcComparatorInv); } // sortByCmcDesc /** @@ -130,7 +130,7 @@ public class CardLists { * @param list */ public static void sortByToughnessAsc(final List list) { - Collections.sort(list, ToughnessComparator); + list.sort(ToughnessComparator); } // sortByToughnessAsc() /** @@ -141,7 +141,7 @@ public class CardLists { * @param list */ public static void sortByToughnessDesc(final List list) { - Collections.sort(list, ToughnessComparatorInv); + list.sort(ToughnessComparatorInv); } // sortByToughnessDesc() /** @@ -152,7 +152,7 @@ public class CardLists { * @param list */ public static void sortByPowerAsc(final List list) { - Collections.sort(list, PowerComparator); + list.sort(PowerComparator); } // sortAttackLowFirst() // the higher the attack the better @@ -164,7 +164,7 @@ public class CardLists { * @param list */ public static void sortByPowerDesc(final List list) { - Collections.sort(list, Collections.reverseOrder(PowerComparator)); + list.sort(Collections.reverseOrder(PowerComparator)); } // sortAttack() diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index 09f0b69b4d9..01ff97a94f9 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -18,7 +18,6 @@ package forge.game.cost; import java.io.Serializable; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -126,7 +125,7 @@ public class Cost implements Serializable { // Things that are pretty much happen at the end (Untap) 16+ // Things that NEED to happen last 100+ - Collections.sort(this.costParts, new Comparator() { + this.costParts.sort(new Comparator() { @Override public int compare(CostPart o1, CostPart o2) { return o1.paymentOrder() - o2.paymentOrder(); From 28d2f3cef69691a91c0abe561335bce0a7451a3d Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 5 Sep 2019 20:52:17 +0800 Subject: [PATCH 38/68] Update forgescribed cards --- .../upcoming/alela_artful_provocateur.txt | 14 ++++++++++++++ .../cardsfolder/upcoming/all_that_glitters.txt | 10 ++++++++++ .../cardsfolder/upcoming/banish_into_fable.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/chittering_witch.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/corridor_monitor.txt | 7 +++++++ .../cardsfolder/upcoming/embereth_skyblazer.txt | 9 +++++++++ .../res/cardsfolder/upcoming/gluttonous_troll.txt | 12 ++++++++++++ .../res/cardsfolder/upcoming/knights_charge.txt | 10 ++++++++++ .../upcoming/korvold_fae_cursed_king.txt | 15 +++++++++++++++ .../cardsfolder/upcoming/mace_of_the_valiant.txt | 12 ++++++++++++ .../res/cardsfolder/upcoming/shimmer_dragon.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/shining_armor.txt | 11 +++++++++++ .../cardsfolder/upcoming/silverwing_squadron.txt | 14 ++++++++++++++ .../res/cardsfolder/upcoming/steelbane_hydra.txt | 8 ++++++++ .../upcoming/syr_gwyn_hero_of_ashenvale.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/thorn_mammoth.txt | 9 +++++++++ .../res/cardsfolder/upcoming/tome_of_legends.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/venerable_knight.txt | 8 ++++++++ .../res/cardsfolder/upcoming/workshop_elders.txt | 10 ++++++++++ forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt | 2 +- 20 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/alela_artful_provocateur.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/all_that_glitters.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/banish_into_fable.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chittering_witch.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/corridor_monitor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/embereth_skyblazer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gluttonous_troll.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/knights_charge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/korvold_fae_cursed_king.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mace_of_the_valiant.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/shimmer_dragon.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/shining_armor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/silverwing_squadron.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/steelbane_hydra.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashenvale.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thorn_mammoth.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tome_of_legends.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/venerable_knight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/workshop_elders.txt diff --git a/forge-gui/res/cardsfolder/upcoming/alela_artful_provocateur.txt b/forge-gui/res/cardsfolder/upcoming/alela_artful_provocateur.txt new file mode 100644 index 00000000000..90269915dfc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/alela_artful_provocateur.txt @@ -0,0 +1,14 @@ +Name:Alela, Artful Provocateur +ManaCost:1 W U B +Types:Legendary Creature Faerie Warlock +PT:2/3 +K:Flying +K:Deathtouch +K:Lifelink +S:Mode$ Continuous | Affected$ Creature.withFlying+Other+YouCtrl | AddPower$ 1 | Description$ Other creatures you control with flying get +1/+0. +SVar:PlayMain1:TRUE +T:Mode$ SpellCast | ValidCard$ Artifact,Enchantment | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an artifact or enchantment spell, create a 1/1 blue Faerie creature token with flying. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_1_1_faerie_flying | TokenOwner$ You | LegacyImage$ u 1 1 faerie flying eld +SVar:BuffedBy:Artifact,Enchantment +DeckHints:Type$Artifact | Enchantment +Oracle:Flying, deathtouch, lifelink\nOther creatures you control with flying get +1/+0.\nWhenever you cast an artifact or enchantment spell, create a 1/1 blue Faerie creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/all_that_glitters.txt b/forge-gui/res/cardsfolder/upcoming/all_that_glitters.txt new file mode 100644 index 00000000000..c010c289fc2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/all_that_glitters.txt @@ -0,0 +1,10 @@ +Name:All That Glitters +ManaCost:1 W +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ X | References$ X | Description$ Enchanted creature gets +1/+1 for each artifact and/or enchantment you control. +SVar:X:Count$Valid Artifact.YouCtrl,Enchantment.YouCtrl +SVar:BuffedBy:Artifact,Enchantment +DeckHints:Type$Artifact|Enchantment +Oracle:Enchant creature\nEnchanted creature gets +1/+1 for each artifact and/or enchantment you control. diff --git a/forge-gui/res/cardsfolder/upcoming/banish_into_fable.txt b/forge-gui/res/cardsfolder/upcoming/banish_into_fable.txt new file mode 100644 index 00000000000..4aab936b038 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/banish_into_fable.txt @@ -0,0 +1,10 @@ +Name:Banish into Fable +ManaCost:4 W U +Types:Instant +T:Mode$ SpellCast | ValidCard$ Card.Self+wasCastFromHand | Execute$ TrigCopy | TriggerDescription$ When you cast this spell from your hand, copy it if you control an artifact, then copy it if you control an enchantment. You may choose new targets for the copies. +SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE1 | SubAbility$ DBCopy +SVar:DBCopy:DB$ CopySpellAbility| Defined$ TriggeredSpellAbility | ConditionPresent$ Enchantment.YouCtrl | ConditionCompare$ GE1 +A:SP$ ChangeZone | Cost$ 4 W U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBToken | SpellDescription$ Return target nonland permanent to its owner's hand. You create a 2/2 white Knight creature token with vigilance. +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You | LegacyImage$ w 2 2 knight vigilance eld +DeckHas:Ability$Token +Oracle:When you cast this spell from your hand, copy it if you control an artifact, then copy it if you control an enchantment. You may choose new targets for the copies.\nReturn target nonland permanent to its owner's hand. You create a 2/2 white Knight creature token with vigilance. diff --git a/forge-gui/res/cardsfolder/upcoming/chittering_witch.txt b/forge-gui/res/cardsfolder/upcoming/chittering_witch.txt new file mode 100644 index 00000000000..f2130f0197b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chittering_witch.txt @@ -0,0 +1,10 @@ +Name:Chittering Witch +ManaCost:3 B +Types:Creature Human Warlock +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 black Rat creature tokens equal to the number of opponents you have. +SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ b_1_1_rat | TokenOwner$ You | LegacyImage$ b 1 1 rat eld | References$ X +SVar:X:PlayerCountOpponents$Amount +A:AB$ Pump | Cost$ 1 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. +AI:RemoveDeck:All +Oracle:When Chittering Witch enters the battlefield, create a number of 1/1 black Rat creature tokens equal to the number of opponents you have.\n{1}{B}, Sacrifice a creature: Target creature gets -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/corridor_monitor.txt b/forge-gui/res/cardsfolder/upcoming/corridor_monitor.txt new file mode 100644 index 00000000000..a7c4ab70133 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/corridor_monitor.txt @@ -0,0 +1,7 @@ +Name:Corridor Monitor +ManaCost:1 U +Types:Artifact Creature Construct +PT:1/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap target artifact or creature you control. +SVar:TrigUntap:DB$ Untap | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Choose target artifact or creature you control. +Oracle:When Corridor Monitor enters the battlefield, untap target artifact or creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/embereth_skyblazer.txt b/forge-gui/res/cardsfolder/upcoming/embereth_skyblazer.txt new file mode 100644 index 00000000000..9d234610c0f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/embereth_skyblazer.txt @@ -0,0 +1,9 @@ +Name:Embereth Skyblazer +ManaCost:3 R +Types:Creature Human Knight +PT:4/3 +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Flying | Condition$ PlayerTurn | Description$ As long as it's your turn, CARDNAME has flying. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, you may pay {2}{R}. If you do, creatures you control get +X/+0 until end of turn, where X is the number of opponents you have. +SVar:TrigPumpAll:AB$ PumpAll | Cost$ 2 R | ValidCards$ Creature.YouCtrl | NumAtt$ +X | References$ X +SVar:X:PlayerCountOpponents$Amount +Oracle:As long as it's your turn, Embereth Skyblazer has flying.\nWhenever Embereth Skyblazer attacks, you may pay {2}{R}. If you do, creatures you control get +X/+0 until end of turn, where X is the number of opponents you have. diff --git a/forge-gui/res/cardsfolder/upcoming/gluttonous_troll.txt b/forge-gui/res/cardsfolder/upcoming/gluttonous_troll.txt new file mode 100644 index 00000000000..96c2f493bf0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gluttonous_troll.txt @@ -0,0 +1,12 @@ +Name:Gluttonous Troll +ManaCost:2 B G +Types:Creature Troll +PT:3/3 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of Food tokens equal to the number of opponents you have. (Food tokens are artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +SVar:X:PlayerCountOpponents$Amount +SVar:PlayMain1:TRUE +DeckHas:Ability$Token +A:AB$ Pump | Cost$ 1 G Sac<1/Permanent.Other/another nonland permanent> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. +Oracle:Trample\nWhen Gluttonous Troll enters the battlefield, create a number of Food tokens equal to the number of opponents you have. (Food tokens are artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{1}{G}, Sacrifice another nonland permanent: Gluttonous Troll gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/knights_charge.txt b/forge-gui/res/cardsfolder/upcoming/knights_charge.txt new file mode 100644 index 00000000000..d02512c705b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knights_charge.txt @@ -0,0 +1,10 @@ +Name:Knights' Charge +ManaCost:1 W B +Types:Enchantment +T:Mode$ Attacks | ValidCard$ Card.Knight+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever a Knight you control attacks, each opponent loses 1 life and you gain 1 life. +SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1 +A:AB$ ChangeZoneAll | Cost$ 6 W B Sac<1/CARDNAME> | ChangeType$ Card.Knight+Creature+YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return all Knight creature cards from your graveyard to the battlefield. +DeckHints:Type$Knight +SVar:BuffedBy:Knight +Oracle:Whenever a Knight you control attacks, each opponent loses 1 life and you gain 1 life.\n{6}{W}{B}, Sacrifice Knights' Charge: Return all Knight creature cards from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/korvold_fae_cursed_king.txt b/forge-gui/res/cardsfolder/upcoming/korvold_fae_cursed_king.txt new file mode 100644 index 00000000000..cf1098c79c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/korvold_fae_cursed_king.txt @@ -0,0 +1,15 @@ +Name:Korvold, Fae-Cursed King +ManaCost:2 B R G +Types:Legendary Creature Dragon Noble +PT:4/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, sacrifice another permanent. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, sacrifice another permanent. +SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Permanent.Other +SVar:NeedsToPlay:Permanent.YouCtrl+cmcLE2 +T:Mode$ Sacrificed | ValidCard$ Permanent | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a permanent, put a +1/+1 counter on CARDNAME and draw a card. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +AI:RemoveDeck:Random +SVar:BuffedBy:Permanent.YouCtrl +Oracle:Flying\nWhenever Korvold, Fae-Cursed King enters the battlefield or attacks, sacrifice another permanent.\nWhenever you sacrifice a permanent, put a +1/+1 counter on Korvold and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/mace_of_the_valiant.txt b/forge-gui/res/cardsfolder/upcoming/mace_of_the_valiant.txt new file mode 100644 index 00000000000..74a5c24fddb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mace_of_the_valiant.txt @@ -0,0 +1,12 @@ +Name:Mace of the Valiant +ManaCost:2 W +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | AddKeyword$ Vigilance | Description$ Equipped creature gets +1/+1 for each charge counter on CARDNAME and has vigilance. +SVar:X:Count$CardCounters.CHARGE +SVar:NeedsToPlayVar:X GE3 +AI:RemoveDeck:Random +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature enters the battlefield under your control, put a charge counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 +SVar:BuffedBy:Creature +K:Equip:3 +Oracle:Equipped creature gets +1/+1 for each charge counter on Mace of the Valiant and has vigilance.\nWhenever a creature enters the battlefield under your control, put a charge counter on Mace of the Valiant.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/upcoming/shimmer_dragon.txt b/forge-gui/res/cardsfolder/upcoming/shimmer_dragon.txt new file mode 100644 index 00000000000..f76836c523d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shimmer_dragon.txt @@ -0,0 +1,10 @@ +Name:Shimmer Dragon +ManaCost:4 U U +Types:Creature Dragon +PT:5/6 +K:Flying +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE4 | Description$ As long as you control four or more artifacts, CARDNAME has hexproof. +A:AB$ Draw | Cost$ tapXType<2/Artifact> | NumCards$ 1 | SpellDescription$ Draw a card. +SVar:BuffedBy:Artifact +DeckHints:Type$Artifact +Oracle:Flying\nAs long as you control four or more artifacts, Shimmer Dragon has hexproof.\nTap two untapped artifacts you control: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/shining_armor.txt b/forge-gui/res/cardsfolder/upcoming/shining_armor.txt new file mode 100644 index 00000000000..68e38c4abe4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shining_armor.txt @@ -0,0 +1,11 @@ +Name:Shining Armor +ManaCost:1 W +Types:Artifact Equipment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target Knight you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Knight.YouCtrl | TgtPrompt$ Select target Knight you control +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Equipped creature gets +0/+2 and has vigilance. +K:Equip:3 +SVar:BuffedBy:Knight +DeckHints:Type$Knight +Oracle:Flash\nWhen Shining Armor enters the battlefield, attach it to target Knight you control.\nEquipped creature gets +0/+2 and has vigilance.\Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/silverwing_squadron.txt b/forge-gui/res/cardsfolder/upcoming/silverwing_squadron.txt new file mode 100644 index 00000000000..ec7e1b888ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverwing_squadron.txt @@ -0,0 +1,14 @@ +Name:Silverwing Squadron +ManaCost:5 W +Types:Creature Human Knight +PT:*/* +K:Flying +K:Vigilance +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of creatures you control. +SVar:X:Count$Valid Creature.YouCtrl +SVar:BuffedBy:Creature +SVar:NoZeroToughnessAI:True +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you have. +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ Y | TokenScript$ w_2_2_knight_vigilance | LegacyImage$ w 2 2 knight vigilance eld | References$ Y +SVar:Y:PlayerCountOpponents$Amount +Oracle:Flying, vigilance\nSilverwing Squadron's power and toughness are each equal to the number of creatures you control.\nWhenever Silverwing Squadron attacks, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you have. diff --git a/forge-gui/res/cardsfolder/upcoming/steelbane_hydra.txt b/forge-gui/res/cardsfolder/upcoming/steelbane_hydra.txt new file mode 100644 index 00000000000..600dcc1b8fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steelbane_hydra.txt @@ -0,0 +1,8 @@ +Name:Steelbane Hydra +ManaCost:X G G +Types:Creature Turtle Hydra +PT:0/0 +K:etbCounter:P1P1:X +SVar:X:Count$xPaid +A:AB$ Destroy | Cost$ 2 G SubCounter<1/P1P1> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. +Oracle:Steelbane Hydra enters the battlefield with X +1/+1 counters on it.\n{2}{G}, Remove a +1/+1 counter from Steelbane Hydra: Destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashenvale.txt b/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashenvale.txt new file mode 100644 index 00000000000..43ff964d386 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashenvale.txt @@ -0,0 +1,11 @@ +Name:Syr Gwyn, Hero of Ashenvale +ManaCost:3 R W B +Types:Legendary Creature Human Knight +PT:5/5 +K:Vigilance +K:Menace +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl+equipped | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an equipped creature you control attacks, you draw a card and you lose 1 life. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 +S:Mode$ Continuous | Affected$ Equipment.YouCtrl | AddKeyword$ Equip:0:Creature.YouCtrl+Knight:Knight | Description$ Equipment you control have equip Knight {0}. +Oracle:Vigilance, menace\nWhenever an equipped creature you control attacks, you draw a card and you lose 1 life.\nEquipment you control have equip Knight {0}. diff --git a/forge-gui/res/cardsfolder/upcoming/thorn_mammoth.txt b/forge-gui/res/cardsfolder/upcoming/thorn_mammoth.txt new file mode 100644 index 00000000000..06cfcb29fb2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thorn_mammoth.txt @@ -0,0 +1,9 @@ +Name:Thorn Mammoth +ManaCost:5 G G +Types:Creature Elephant +PT:6/6 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, CARDNAME fights up to one target creature you don't control. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigFight | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, CARDNAME fights up to one target creature you don't control. +SVar:TrigFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | TargetMin$ 0 | TargetMax$ 1 +Oracle:Trample\nWhenever Thorn Mammoth or another creature enters the battlefield under your control, Thorn Mammoth fights up to one target creature you don't control. diff --git a/forge-gui/res/cardsfolder/upcoming/tome_of_legends.txt b/forge-gui/res/cardsfolder/upcoming/tome_of_legends.txt new file mode 100644 index 00000000000..c2becfeeed6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tome_of_legends.txt @@ -0,0 +1,11 @@ +Name:Tome of Legends +ManaCost:2 +Types:Artifact +K:etbCounter:PAGE:1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.IsCommander+YouOwn+YouCtrl | Execute$ TrigPutCounter | TriggerDescription$ Whenever your commander enters the battlefield or attacks, put a page counter on CARDNAME. +T:Mode$ Attacks | ValidCard$ Card.IsCommander+YouOwn+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever your commander enters the battlefield or attacks, put a page counter on CARDNAME. +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ PAGE | CounterNum$ 1 +SVar:HasAttackEffect:TRUE +DeckHints:Type$IsCommander +A:AB$ Draw | Cost$ 1 T SubCounter<1/PAGE> | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Tome of Legends enters the battlefield with a page counter on it.\nWhenever your commander enters the battlefield or attacks, put a page counter on Tome of Legends.\n{1}, {T}, Remove a page counter from Tome of Legends: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/venerable_knight.txt b/forge-gui/res/cardsfolder/upcoming/venerable_knight.txt new file mode 100644 index 00000000000..90adcc55028 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venerable_knight.txt @@ -0,0 +1,8 @@ +Name:Venerable Knight +ManaCost:W +Types:Creature Human Knight +PT:2/1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put a +1/+1 counter on target Knight you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Knight.YouCtrl | TgtPrompt$ Select target Knight you control | CounterType$ P1P1 | CounterNum$ 1 +DeckHints:Type$Knight +Oracle:When Venerable Knight dies, put a +1/+1 counter on target Knight you control. diff --git a/forge-gui/res/cardsfolder/upcoming/workshop_elders.txt b/forge-gui/res/cardsfolder/upcoming/workshop_elders.txt new file mode 100644 index 00000000000..8d4ae5b13f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/workshop_elders.txt @@ -0,0 +1,10 @@ +Name:Workshop Elders +ManaCost:6 U +Types:Creature Human Artificer +PT:4/4 +S:Mode$ Continuous | Affected$ Creature.Artifact+YouCtrl | AddKeyword$ Flying | Description$ Artifact creatures you control have flying. +SVar:PlayMain1:TRUE +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, you may have target noncreature artifact you control becomes a 0/0 artifact creature. If you do, put four +1/+1 counters on it. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 4 +Oracle:Artifact creatures you control have flying.\nAt the beginning of combat on your turn, you may have target noncreature artifact you control become a 0/0 artifact creature. If you do, put four +1/+1 counters on it. diff --git a/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt b/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt index fbd6f310c49..6f5aeeb6a74 100644 --- a/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt +++ b/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt @@ -5,4 +5,4 @@ Colors:black,green PT:2/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature dies, put a loyalty counter on each Garruk you control. SVar:TrigPutCounter:DB$ PutCounterAll | ValidCards$ Garruk.YouCtrl | CounterType$ LOYALTY | CounterNum$ 1 -SVar:When this creature dies, put a loyalty counter on each Garruk you control. +Oracle:When this creature dies, put a loyalty counter on each Garruk you control. From efbd2a08eb126d271105c41bb465644cc902bf6e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 5 Sep 2019 20:56:17 +0800 Subject: [PATCH 39/68] Updated codes --- .../main/java/forge/ai/ComputerUtilMana.java | 23 +++++++++++++------ .../main/java/forge/game/CardTraitBase.java | 2 +- forge-game/src/main/java/forge/game/Game.java | 2 +- .../src/main/java/forge/game/GameAction.java | 6 ++--- .../java/forge/game/GameLogFormatter.java | 4 ++-- .../forge/game/ability/AbilityFactory.java | 4 ++-- .../src/main/java/forge/game/card/Card.java | 6 ++--- .../main/java/forge/game/card/CardState.java | 6 +---- .../java/forge/game/cost/CostAdjustment.java | 2 +- .../main/java/forge/game/player/Player.java | 4 ++-- .../game/spellability/AbilityManaPart.java | 6 ++--- .../StaticAbilityCantBeCast.java | 2 +- .../StaticAbilityPreventDamage.java | 2 +- .../java/forge/gui/ImportSourceAnalyzer.java | 4 ++-- .../java/forge/itemmanager/ItemManager.java | 6 +---- .../main/java/forge/sound/AltSoundSystem.java | 2 +- .../java/forge/quest/QuestEventDraft.java | 18 +++------------ .../forge/quest/bazaar/QuestPetStorage.java | 4 ++++ 18 files changed, 47 insertions(+), 56 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 445c1bb08a3..9c9ba23e640 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -1,7 +1,5 @@ package forge.ai; -/** - * Refactoring this class to use List sort (Instead of Collection) causes Android build not to compile... - * */ + import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.*; @@ -130,7 +128,7 @@ public class ComputerUtilMana { } } } - Collections.sort(orderedCards, new Comparator() { + orderedCards.sort(new Comparator() { @Override public int compare(final Card card1, final Card card2) { return Integer.compare(manaCardMap.get(card1), manaCardMap.get(card2)); @@ -153,7 +151,7 @@ public class ComputerUtilMana { System.out.println("Unsorted Abilities: " + newAbilities); } - Collections.sort(newAbilities, new Comparator() { + newAbilities.sort(new Comparator() { @Override public int compare(final SpellAbility ability1, final SpellAbility ability2) { int preOrder = orderedCards.indexOf(ability1.getHostCard()) - orderedCards.indexOf(ability2.getHostCard()); @@ -172,8 +170,7 @@ public class ComputerUtilMana { } return ability1.compareTo(ability2); - } - else { + } else { return preOrder; } } @@ -346,6 +343,10 @@ public class ComputerUtilMana { payMultipleMana(cost, manaProduced, ai); // remove from available lists + /* + * Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard())); + * causes Android build not to compile + * */ Iterator itSa = sourcesForShards.values().iterator(); while (itSa.hasNext()) { SpellAbility srcSa = itSa.next(); @@ -489,6 +490,10 @@ public class ComputerUtilMana { payMultipleMana(cost, manaProduced, ai); // remove from available lists + /* + * Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard())); + * causes Android build not to compile + * */ Iterator itSa = sourcesForShards.values().iterator(); while (itSa.hasNext()) { SpellAbility srcSa = itSa.next(); @@ -519,6 +524,10 @@ public class ComputerUtilMana { if (hasConverge) { // hack to prevent converge re-using sources // remove from available lists + /* + * Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard())); + * causes Android build not to compile + * */ Iterator itSa = sourcesForShards.values().iterator(); while (itSa.hasNext()) { SpellAbility srcSa = itSa.next(); diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 7897017b187..399e18456a6 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -547,7 +547,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { Map result = Maps.newHashMap(output); for (Map.Entry e : input.entrySet()) { String value = e.getValue(); - result.put(e.getKey(), output.containsKey(value) ? output.get(value) : value); + result.put(e.getKey(), output.getOrDefault(value, value)); } return result; } diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index beef5eade46..da8d612fed7 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -202,7 +202,7 @@ public class Game { if (c == null) { return null; } - return changeZoneLKIInfo.containsKey(c.getId()) ? changeZoneLKIInfo.get(c.getId()) : c; + return changeZoneLKIInfo.getOrDefault(c.getId(), c); } public final void clearChangeZoneLKIInfo() { changeZoneLKIInfo.clear(); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 50aa898902a..89c790b3374 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -16,9 +16,7 @@ * along with this program. If not, see . */ package forge.game; -/** - * Refactoring this class to use List sort (Instead of Collection) causes Android build not to compile... - * */ + import com.google.common.base.Predicate; import com.google.common.collect.*; import forge.GameCommand; @@ -826,7 +824,7 @@ public class GameAction { .result(); } }; - Collections.sort(staticAbilities, comp); + staticAbilities.sort(comp); final Map affectedPerAbility = Maps.newHashMap(); for (final StaticAbilityLayer layer : StaticAbilityLayer.CONTINUOUS_LAYERS) { diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index bed7d9a2755..dbaa656ff5e 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -136,13 +136,13 @@ public class GameLogFormatter extends IGameEventVisitor.Base { for (final GameOutcome game : gamesPlayed) { RegisteredPlayer player = game.getWinningPlayer(); - int amount = winCount.containsKey(player) ? winCount.get(player) : 0; + int amount = winCount.getOrDefault(player, 0); winCount.put(player, amount + 1); } final StringBuilder sb = new StringBuilder(); for (Entry entry : players.entrySet()) { - int amount = winCount.containsKey(entry.getKey()) ? winCount.get(entry.getKey()) : 0; + int amount = winCount.getOrDefault(entry.getKey(), 0); sb.append(entry.getValue()).append(": ").append(amount).append(" "); } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index 1e770f1fce9..2421f8416e0 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -311,8 +311,8 @@ public final class AbilityFactory { } private static final TargetRestrictions readTarget(Map mapParams) { - final String min = mapParams.containsKey("TargetMin") ? mapParams.get("TargetMin") : "1"; - final String max = mapParams.containsKey("TargetMax") ? mapParams.get("TargetMax") : "1"; + final String min = mapParams.getOrDefault("TargetMin", "1"); + final String max = mapParams.getOrDefault("TargetMax", "1"); // TgtPrompt now optional diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 1ee0b0f0f17..02f48f06494 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1330,7 +1330,7 @@ public class Card extends GameEntity implements Comparable { int counterAmount = 0; if (countersAddedBy.containsKey(source)) { final Map counterMap = countersAddedBy.get(source); - counterAmount = counterMap.containsKey(counterType) ? counterMap.get(counterType) : 0; + counterAmount = counterMap.getOrDefault(counterType, 0); countersAddedBy.remove(source); } return counterAmount; @@ -6189,7 +6189,7 @@ public class Card extends GameEntity implements Comparable { } return 0; } - return numberTurnActivations.containsKey(original) ? numberTurnActivations.get(original) : 0; + return numberTurnActivations.getOrDefault(original, 0); } public int getAbilityActivatedThisGame(SpellAbility ability) { @@ -6204,7 +6204,7 @@ public class Card extends GameEntity implements Comparable { } return 0; } - return numberGameActivations.containsKey(original) ? numberGameActivations.get(original) : 0; + return numberGameActivations.getOrDefault(original, 0); } public void resetTurnActivations() { diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index b2b4d60e72a..ccb021be854 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -449,11 +449,7 @@ public class CardState extends GameObject { return sVars; } public final String getSVar(final String var) { - if (sVars.containsKey(var)) { - return sVars.get(var); - } else { - return ""; - } + return sVars.getOrDefault(var, ""); } public final boolean hasSVar(final String var) { if (var == null) { diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 75d87c49e64..a64b3f2b118 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -96,7 +96,7 @@ public class CostAdjustment { return; } - final String scost = params.containsKey("Cost") ? params.get("Cost") : "1"; + final String scost = params.getOrDefault("Cost", "1"); Cost part = new Cost(scost, sa.isAbility()); int count = 0; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index d4214940983..4489f06814b 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -598,12 +598,12 @@ public class Player extends GameEntity implements Comparable { view.updateCommanderDamage(this); } - int old = assignedDamage.containsKey(source) ? assignedDamage.get(source) : 0; + int old = assignedDamage.getOrDefault(source, 0); assignedDamage.put(source, old + amount); source.getDamageHistory().registerDamage(this); if (isCombat) { - old = assignedCombatDamage.containsKey(source) ? assignedCombatDamage.get(source) : 0; + old = assignedCombatDamage.getOrDefault(source, 0); assignedCombatDamage.put(source, old + amount); for (final String type : source.getType().getCreatureTypes()) { source.getController().addProwlType(type); diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index b3b9040bf61..6304bf4870f 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -89,8 +89,8 @@ public class AbilityManaPart implements java.io.Serializable { public AbilityManaPart(final Card sourceCard, final Map params) { this.sourceCard = sourceCard; - origProduced = params.containsKey("Produced") ? params.get("Produced") : "1"; - this.manaRestrictions = params.containsKey("RestrictValid") ? params.get("RestrictValid") : ""; + origProduced = params.getOrDefault("Produced", "1"); + this.manaRestrictions = params.getOrDefault("RestrictValid", ""); this.cannotCounterSpell = params.get("AddsNoCounter"); this.addsKeywords = params.get("AddsKeywords"); this.addsKeywordsType = params.get("AddsKeywordsType"); @@ -98,7 +98,7 @@ public class AbilityManaPart implements java.io.Serializable { this.addsCounters = params.get("AddsCounters"); this.triggersWhenSpent = params.get("TriggersWhenSpent"); this.persistentMana = (null != params.get("PersistentMana")) && "True".equalsIgnoreCase(params.get("PersistentMana")); - this.manaReplaceType = params.containsKey("ManaReplaceType") ? params.get("ManaReplaceType") : ""; + this.manaReplaceType = params.getOrDefault("ManaReplaceType", ""); } /** diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java index d670ab3414a..602db1b7ccb 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java @@ -81,7 +81,7 @@ public class StaticAbilityCantBeCast { if (params.containsKey("NumLimitEachTurn") && activator != null) { int limit = Integer.parseInt(params.get("NumLimitEachTurn")); - String valid = params.containsKey("ValidCard") ? params.get("ValidCard") : "Card"; + String valid = params.getOrDefault("ValidCard", "Card"); List thisTurnCast = CardUtil.getThisTurnCast(valid, card); if (CardLists.filterControlledBy(thisTurnCast, activator).size() < limit) { return false; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java index 1608837e826..cb150702654 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java @@ -83,7 +83,7 @@ public class StaticAbilityPreventDamage { if (params.containsKey("Optional")) { //Assume if param is present it should be optional if (!isTest) { - final String logic = params.containsKey("AILogic") ? params.get("AILogic") : ""; + final String logic = params.getOrDefault("AILogic", ""); final String message = "Apply the effect of " + hostCard + "? (Affected: " + target + ")"; boolean confirmed = hostCard.getController().getController().confirmStaticApplication(hostCard, target, logic, message); diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index c19d9c5b10f..e07a0c1d1bc 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -446,7 +446,7 @@ public class ImportSourceAnalyzer { analyzeListedDir(root, ForgeConstants.CACHE_ICON_PICS_DIR, new ListedAnalyzer() { @Override public String map(final String filename) { - return iconFileNames.containsKey(filename) ? iconFileNames.get(filename) : null; + return iconFileNames.getOrDefault(filename, null); } @Override @@ -618,7 +618,7 @@ public class ImportSourceAnalyzer { analyzeListedDir(root, targetDir, new ListedAnalyzer() { @Override public String map(final String filename) { - return fileDb.containsKey(filename) ? fileDb.get(filename) : null; + return fileDb.getOrDefault(filename, null); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index 8a0f5236431..887196a8970 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -857,11 +857,7 @@ public abstract class ItemManager extends JPanel implem @SuppressWarnings("unchecked") public void addFilter(final ItemFilter filter) { final Class> filterClass = (Class>) filter.getClass(); - List> classFilters = this.filters.get(filterClass); - if (classFilters == null) { - classFilters = new ArrayList>(); - this.filters.put(filterClass, classFilters); - } + List> classFilters = this.filters.computeIfAbsent(filterClass, k -> new ArrayList>()); if (classFilters.size() > 0) { //if filter with the same class already exists, try to merge if allowed //NOTE: can always use first filter for these checks since if diff --git a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java index a62ca687e8a..38302668390 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java @@ -36,7 +36,7 @@ class AsyncSoundRegistry { } public synchronized static int getNumIterations(String soundName) { - return soundsPlayed.containsKey(soundName) ? soundsPlayed.get(soundName) : 0; + return soundsPlayed.getOrDefault(soundName, 0); } } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java index 460bb8a4a5e..d3e36257b84 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java @@ -294,11 +294,7 @@ public class QuestEventDraft implements IQuestEvent { int value; final String boosterName = FModel.getMagicDb().getEditions().get(boosterSet).getName() + " Booster Pack"; - if (MAP_PRICES.containsKey(boosterName)) { - value = MAP_PRICES.get(boosterName); - } else { - value = 395; - } + value = MAP_PRICES.getOrDefault(boosterName, 395); boosterPrices += value; @@ -518,11 +514,7 @@ public class QuestEventDraft implements IQuestEvent { final String boosterName = booster.getName(); - if (MAP_PRICES.containsKey(boosterName)) { - value = MAP_PRICES.get(boosterName); - } else { - value = 395; - } + value = MAP_PRICES.getOrDefault(boosterName, 395); return value; @@ -949,11 +941,7 @@ public class QuestEventDraft implements IQuestEvent { int value; final String boosterName = FModel.getMagicDb().getEditions().get(boosterSet).getName() + " Booster Pack"; - if (MAP_PRICES.containsKey(boosterName)) { - value = MAP_PRICES.get(boosterName); - } else { - value = 395; - } + value = MAP_PRICES.getOrDefault(boosterName, 395); entryFee += value; diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java index 00216780b9f..5c49b541f26 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java @@ -89,6 +89,10 @@ public class QuestPetStorage { */ private void addToMap(final QuestPetController petCtrl) { final int iSlot = petCtrl.getSlot(); + /* + * Refactoring this to List list = this.petsBySlot.computeIfAbsent(Integer.valueOf(iSlot), k -> new ArrayList()); + * will cause Android not to compile + * */ List list = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null == list) { list = new ArrayList(); From dc6361d5b9dbedaf4d6a82b9d84405858b264970 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Thu, 5 Sep 2019 14:34:32 +0000 Subject: [PATCH 40/68] Update some 'format' translations --- forge-gui/res/languages/cn-ZH.properties | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/languages/cn-ZH.properties b/forge-gui/res/languages/cn-ZH.properties index e6a89f7f898..52fd1fbef33 100644 --- a/forge-gui/res/languages/cn-ZH.properties +++ b/forge-gui/res/languages/cn-ZH.properties @@ -63,7 +63,7 @@ cbManaBurn=法术力灼烧 cbManaLostPrompt=提示法术力池将要清空 cbDevMode=开发人员模式 cbLoadCardsLazily=惰性加载卡牌脚本 -cbLoadHistoricFormats=加载史记格式 +cbLoadHistoricFormats=加载史记赛制 cbWorkshopSyntax=作坊语法检查 cbEnforceDeckLegality=套牌一致性 cbSideboardForAI=玩家为AI换备 @@ -148,11 +148,11 @@ nlWorkshopSyntax=在作坊中启用卡牌脚本检查。注意:该功能任在 nlGameLogEntryType=更改游戏中日志显示的信息量。排序为最少到最详细。 nlCloseAction=更改单击右上角X按钮时的行为 nlLoadCardsLazily=如果打开该选项Forge将在使用到卡牌脚本时才加载(警告:实验状态)。 -nlLoadHistoricFormats=如果打开,Forge将加载史记格式,这个能会导致游戏载入时间变长。 +nlLoadHistoricFormats=如果打开,Forge将加载史记赛制,这个能会导致游戏载入时间变长。 GraphicOptions=图形选项 nlDefaultFontSize=UI中字体的默认大小。所有字体元素都相对于此缩放。(需要重启) cbpMulliganRule = 调度规则 -nlImageFetcher=允许在在线资源中实时获取缺失的图片 +nlImageFetcher=允许从在线资源中实时获取缺失的图片 nlDisplayFoil=显示闪卡 nlRandomFoil=随机将牌设置为闪卡 nlScaleLarger=允许卡牌图片缩放为初始大小 @@ -432,10 +432,10 @@ lblStartingWorld=初始时空 lblStartingPool=初始牌池 lblAllCardsAvailable=所有牌都可用 lblStarterEventdeck=初始/活动套牌 -lblSanctionedformat=合法格式: +lblSanctionedformat=合法赛制: lblCustomdeck=自定义套牌 -lblDefineCustomFormat=定义自定义格式 -lblSelectFormat=选择格式 +lblDefineCustomFormat=定义自定义赛制 +lblSelectFormat=选择赛制 lblStartWithAllCards=从所选系列的所有牌开始 lblAllowDuplicateCards=允许重复的卡牌 lblStartingPoolDistribution=初始牌池分配 @@ -456,7 +456,7 @@ lblChallenges=挑战 lblMatchBestof=匹配-BO lblDuels=决斗 #CSubmenuQuestData.java -lblNotFormatDefined=你已经将自定义格式设置为不包含任何系列。\n这将选择所有系列而不受限制为奖品。\n\n继续? +lblNotFormatDefined=你已经将自定义赛制设置为不包含任何系列。\n这将选择所有系列而不受限制为奖品。\n\n继续? lbldckStartPool=你还没有选择一个套牌来开始。 lblCannotStartaQuest=无法开始一个探索 lblFromDeck=从套牌 @@ -471,7 +471,7 @@ lblEnteraNumber=输入一个数 lblSavefailed=保存错误 #DialogChooseFormats.java cbWantReprints=允许来自其他系列的重印牌 -lblChooseFormats=选择格式 +lblChooseFormats=选择赛制 lblSanctioned=合法 lblOther=其他 lblHistoric=十几 @@ -823,8 +823,8 @@ lblPrinttoHTMLfile=打印成HTML文件 #PaperCard.java lblCard=牌 #CardManager.java -lblFormat=格式 -lblFormats=格式 +lblFormat=赛制 +lblFormats=赛制 lblQuestWorld=冒险时空 lblSets=系列 lblTypes=类型 From 59bf5830fe5b52bae59e7430f5232ffaf670fd39 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 6 Sep 2019 00:03:04 +0800 Subject: [PATCH 41/68] Big Cleanup --- .../java/forge/ai/AiAttackController.java | 28 +++++++-------- .../src/main/java/forge/ai/AiProfileUtil.java | 8 ++--- .../src/main/java/forge/ai/ComputerUtil.java | 20 +++++------ .../main/java/forge/ai/ComputerUtilCard.java | 10 +++--- .../java/forge/ai/ComputerUtilCombat.java | 12 +++---- .../main/java/forge/ai/ComputerUtilMana.java | 6 ++-- .../src/main/java/forge/ai/GameState.java | 10 +++--- .../java/forge/ai/PlayerControllerAi.java | 6 ++-- .../main/java/forge/ai/ability/AttachAi.java | 10 +++--- .../java/forge/ai/ability/ChangeZoneAi.java | 6 ++-- .../ai/ability/ChooseGenericEffectAi.java | 2 +- .../forge/ai/ability/DamagePreventAi.java | 2 +- .../main/java/forge/ai/ability/DebuffAi.java | 2 +- .../java/forge/ai/ability/LifeLoseAi.java | 2 +- .../main/java/forge/ai/ability/ProtectAi.java | 2 +- .../main/java/forge/ai/ability/PumpAllAi.java | 2 +- .../java/forge/ai/ability/RegenerateAi.java | 2 +- .../java/forge/ai/ability/StoreSVarAi.java | 2 +- .../main/java/forge/ai/ability/TokenAi.java | 2 +- .../java/forge/ai/ability/TwoPilesAi.java | 2 +- .../java/forge/ai/ability/UnattachAllAi.java | 2 +- .../forge/ai/simulation/GameSimulator.java | 12 +++---- .../ai/simulation/PossibleTargetSelector.java | 6 ++-- .../ai/simulation/SimulationController.java | 10 +++--- .../SpellAbilityChoicesIterator.java | 4 +-- .../ai/simulation/SpellAbilityPicker.java | 4 +-- .../main/java/forge/CardStorageReader.java | 4 +-- forge-core/src/main/java/forge/FTrace.java | 2 +- .../src/main/java/forge/StaticData.java | 2 +- .../src/main/java/forge/card/CardDb.java | 20 +++++------ .../src/main/java/forge/card/CardFace.java | 16 ++++----- .../java/forge/card/CardRulesPredicates.java | 2 +- .../src/main/java/forge/card/ColorSet.java | 2 +- .../src/main/java/forge/card/PrintSheet.java | 2 +- forge-core/src/main/java/forge/deck/Deck.java | 4 +-- .../src/main/java/forge/deck/DeckFormat.java | 4 +-- .../src/main/java/forge/deck/DeckGroup.java | 2 +- .../forge/deck/generation/DeckGenPool.java | 2 +- .../deck/generation/DeckGeneratorBase.java | 6 ++-- .../java/forge/deck/io/DeckFileHeader.java | 2 +- .../java/forge/deck/io/DeckSerializer.java | 2 +- .../src/main/java/forge/item/BoosterBox.java | 2 +- .../main/java/forge/item/BoxedProduct.java | 2 +- .../src/main/java/forge/item/FatPack.java | 2 +- .../src/main/java/forge/util/Aggregates.java | 6 ++-- .../src/main/java/forge/util/FileSection.java | 8 ++--- .../src/main/java/forge/util/FileUtil.java | 8 ++--- .../src/main/java/forge/util/ItemPool.java | 14 ++++---- .../main/java/forge/util/ItemPoolSorter.java | 2 +- .../main/java/forge/util/NameGenerator.java | 10 +++--- .../src/main/java/forge/util/TextUtil.java | 2 +- .../java/forge/util/collect/FCollection.java | 4 +-- .../util/maps/LinkedHashMapToAmount.java | 2 +- .../java/forge/util/maps/MapToAmountUtil.java | 8 ++--- .../java/forge/util/storage/StorageBase.java | 4 +-- .../storage/StorageImmediatelySerialized.java | 4 +-- .../util/storage/StorageNestedFolders.java | 2 +- .../forge/util/storage/StorageReaderFile.java | 2 +- .../storage/StorageReaderFileSections.java | 4 +-- .../util/storage/StorageReaderFolder.java | 4 +-- ...geReaderRecursiveFolderWithUserFolder.java | 6 ++-- forge-game/src/main/java/forge/game/Game.java | 2 +- .../src/main/java/forge/game/GameAction.java | 6 +++- .../main/java/forge/game/GameEntityCache.java | 4 +-- .../main/java/forge/game/GameEntityView.java | 2 +- .../src/main/java/forge/game/GameFormat.java | 18 +++++----- .../src/main/java/forge/game/GameLog.java | 6 ++-- .../java/forge/game/GameLogFormatter.java | 2 +- .../main/java/forge/game/GameObjectMap.java | 2 +- .../src/main/java/forge/game/Match.java | 8 ++--- .../src/main/java/forge/game/PlanarDice.java | 2 +- .../main/java/forge/game/StaticEffect.java | 26 +++++++------- .../java/forge/game/ability/AbilityUtils.java | 18 +++++----- .../game/ability/SpellAbilityEffect.java | 2 +- .../ability/effects/AnimateAllEffect.java | 30 ++++++++-------- .../game/ability/effects/AttachEffect.java | 2 +- .../game/ability/effects/BalanceEffect.java | 2 +- .../game/ability/effects/BidLifeEffect.java | 2 +- .../game/ability/effects/BlockEffect.java | 8 ++--- .../ability/effects/ChangeZoneEffect.java | 2 +- .../ability/effects/ChooseColorEffect.java | 2 +- .../effects/ChooseDirectionEffect.java | 2 +- .../ability/effects/ChooseTypeEffect.java | 4 +-- .../game/ability/effects/ClashEffect.java | 2 +- .../effects/ControlExchangeEffect.java | 4 +-- .../effects/CopySpellAbilityEffect.java | 2 +- .../ability/effects/DamagePreventEffect.java | 10 +++--- .../forge/game/ability/effects/DigEffect.java | 2 +- .../game/ability/effects/DiscardEffect.java | 2 +- .../game/ability/effects/DrainManaEffect.java | 2 +- .../game/ability/effects/LifeSetEffect.java | 2 +- .../game/ability/effects/MustBlockEffect.java | 2 +- .../game/ability/effects/PlayEffect.java | 2 +- .../ability/effects/ProtectAllEffect.java | 2 +- .../game/ability/effects/ProtectEffect.java | 6 ++-- .../ability/effects/RestartGameEffect.java | 4 +-- .../ability/effects/RunSVarAbilityEffect.java | 2 +- .../game/ability/effects/StoreMapEffect.java | 4 +-- .../main/java/forge/game/card/CardState.java | 20 +++++------ .../main/java/forge/game/card/CardUtil.java | 2 +- .../main/java/forge/game/card/CardView.java | 8 ++--- .../forge/game/combat/AttackConstraints.java | 12 +++---- .../forge/game/combat/AttackRequirement.java | 6 ++-- .../forge/game/combat/AttackRestriction.java | 2 +- .../java/forge/game/combat/AttackingBand.java | 2 +- .../main/java/forge/game/combat/Combat.java | 12 +++---- .../java/forge/game/combat/CombatLki.java | 2 +- .../java/forge/game/combat/CombatUtil.java | 2 +- .../java/forge/game/combat/CombatView.java | 14 ++++---- .../game/combat/GlobalAttackRestrictions.java | 6 ++-- .../java/forge/game/cost/CostAddMana.java | 2 +- .../main/java/forge/game/cost/CostDraw.java | 2 +- .../java/forge/game/cost/CostGainLife.java | 2 +- .../game/event/GameEventBlockersDeclared.java | 2 +- .../main/java/forge/game/keyword/Keyword.java | 6 ++-- .../forge/game/mana/ManaCostBeingPaid.java | 10 +++--- .../main/java/forge/game/mana/ManaPool.java | 8 ++--- .../main/java/forge/game/phase/ExtraTurn.java | 2 +- .../src/main/java/forge/game/phase/Phase.java | 10 +++--- .../java/forge/game/phase/PhaseHandler.java | 8 ++--- .../main/java/forge/game/phase/PhaseType.java | 4 +-- .../forge/game/player/AchievementTracker.java | 4 +-- .../main/java/forge/game/player/Player.java | 10 +++--- .../forge/game/player/PlayerProperty.java | 6 ++-- .../java/forge/game/player/PlayerView.java | 8 ++--- .../forge/game/player/RegisteredPlayer.java | 2 +- .../spellability/SpellAbilityCondition.java | 2 +- .../game/spellability/SpellAbilityView.java | 2 +- .../game/spellability/StackItemView.java | 2 +- .../game/spellability/TargetChoices.java | 6 ++-- .../game/spellability/TargetRestrictions.java | 2 +- .../StaticAbilityContinuous.java | 4 +-- .../main/java/forge/game/trigger/Trigger.java | 6 ++-- .../forge/game/trigger/TriggerHandler.java | 18 +++++----- .../java/forge/game/trigger/TriggerVote.java | 2 +- .../forge/game/trigger/WrappedAbility.java | 4 +-- .../forge/game/zone/CostPaymentStack.java | 2 +- .../main/java/forge/game/zone/MagicStack.java | 6 ++-- .../main/java/forge/game/zone/ZoneType.java | 2 +- .../java/forge/trackable/TrackableObject.java | 2 +- .../java/forge/trackable/TrackableTypes.java | 2 +- .../src/main/java/forge/ImageCache.java | 2 +- .../java/forge/control/KeyboardShortcuts.java | 6 ++-- .../java/forge/deckchooser/DecksComboBox.java | 4 +-- .../java/forge/deckchooser/FDeckChooser.java | 4 +-- .../java/forge/deckchooser/FDeckViewer.java | 2 +- .../java/forge/error/BugReportDialog.java | 2 +- .../forge/gui/BoxedProductCardListViewer.java | 2 +- .../main/java/forge/gui/CardListViewer.java | 2 +- .../src/main/java/forge/gui/DualListBox.java | 12 +++---- .../src/main/java/forge/gui/GuiChoose.java | 14 ++++---- .../src/main/java/forge/gui/GuiDialog.java | 2 +- .../src/main/java/forge/gui/ImportDialog.java | 16 ++++----- .../src/main/java/forge/gui/ListChooser.java | 2 +- .../main/java/forge/gui/MultiLineLabelUI.java | 4 +-- .../java/forge/gui/UnsortedListModel.java | 2 +- .../java/forge/gui/framework/DragCell.java | 4 +-- .../java/forge/gui/framework/SLayoutIO.java | 2 +- .../forge/gui/framework/SRearrangingUtil.java | 4 +-- .../forge/gui/framework/SResizingUtil.java | 10 +++--- .../java/forge/itemmanager/CardManager.java | 4 +-- .../java/forge/itemmanager/DeckManager.java | 4 +-- .../java/forge/itemmanager/ItemManager.java | 28 +++++++-------- .../filters/AdvancedSearchFilter.java | 4 +-- .../itemmanager/filters/CardCMCFilter.java | 2 +- .../filters/CardQuestWorldFilter.java | 4 +-- .../itemmanager/filters/CardSearchFilter.java | 2 +- .../itemmanager/filters/CardSetFilter.java | 2 +- .../itemmanager/filters/CardTypeFilter.java | 2 +- .../itemmanager/filters/DeckFolderFilter.java | 2 +- .../filters/DeckQuestWorldFilter.java | 4 +-- .../itemmanager/filters/DeckSetFilter.java | 2 +- .../itemmanager/filters/FormatFilter.java | 8 ++--- .../itemmanager/filters/StatTypeFilter.java | 2 +- .../itemmanager/filters/TextSearchFilter.java | 2 +- .../filters/ToggleButtonsFilter.java | 2 +- .../filters/TokenSearchFilter.java | 2 +- .../forge/itemmanager/views/ImageView.java | 20 +++++------ .../forge/itemmanager/views/ItemListView.java | 4 +-- .../forge/itemmanager/views/ItemView.java | 6 ++-- .../src/main/java/forge/menus/ForgeMenu.java | 2 +- .../deckeditor/AddBasicLandsDialog.java | 4 +-- .../screens/deckeditor/CDeckEditorUI.java | 4 +-- .../forge/screens/deckeditor/DeckImport.java | 4 +-- .../deckeditor/controllers/ACEditorBase.java | 2 +- .../controllers/CEditorCommander.java | 10 +++--- .../controllers/CEditorConstructed.java | 12 +++---- .../controllers/CEditorLimited.java | 4 +-- .../deckeditor/controllers/CEditorQuest.java | 12 +++---- .../controllers/CEditorQuestCardShop.java | 6 ++-- .../controllers/CEditorQuestLimited.java | 10 +++--- .../controllers/CEditorVariant.java | 2 +- .../controllers/CProbabilities.java | 6 ++-- .../controllers/DeckController.java | 4 +-- .../deckeditor/menus/CDeckEditorUIMenus.java | 2 +- .../main/java/forge/screens/home/CLobby.java | 2 +- .../java/forge/screens/home/PlayerPanel.java | 4 +-- .../main/java/forge/screens/home/VHomeUI.java | 8 ++--- .../main/java/forge/screens/home/VLobby.java | 32 ++++++++--------- .../home/gauntlet/CSubmenuGauntletBuild.java | 6 ++-- .../gauntlet/CSubmenuGauntletContests.java | 4 +-- .../home/gauntlet/CSubmenuGauntletLoad.java | 4 +-- .../home/gauntlet/CSubmenuGauntletQuick.java | 4 +-- .../home/gauntlet/ContestGauntletLister.java | 4 +-- .../home/gauntlet/QuickGauntletLister.java | 4 +-- .../home/gauntlet/VSubmenuGauntletBuild.java | 2 +- .../home/online/CSubmenuOnlineLobby.java | 2 +- .../home/puzzle/CSubmenuPuzzleCreate.java | 4 +-- .../home/puzzle/CSubmenuPuzzleSolve.java | 4 +-- .../home/quest/CSubmenuChallenges.java | 2 +- .../screens/home/quest/CSubmenuQuestData.java | 4 +-- .../screens/home/quest/QuestFileLister.java | 4 +-- .../home/quest/VSubmenuChallenges.java | 4 +-- .../forge/screens/home/quest/ViewStall.java | 2 +- .../home/sanctioned/AvatarSelector.java | 2 +- .../home/sanctioned/CSubmenuConstructed.java | 2 +- .../home/sanctioned/CSubmenuDraft.java | 2 +- .../home/sanctioned/CSubmenuSealed.java | 2 +- .../home/sanctioned/CSubmenuWinston.java | 2 +- .../home/sanctioned/VSubmenuDraft.java | 2 +- .../home/sanctioned/VSubmenuSealed.java | 2 +- .../home/sanctioned/VSubmenuWinston.java | 2 +- .../home/settings/VSubmenuAchievements.java | 2 +- .../home/settings/VSubmenuDownloaders.java | 4 +-- .../java/forge/screens/match/CMatchUI.java | 14 ++++---- .../forge/screens/match/GameLogPanel.java | 2 +- .../screens/match/QuestWinLoseCardViewer.java | 2 +- .../forge/screens/match/TargetingOverlay.java | 16 ++++----- .../java/forge/screens/match/VAutoYields.java | 4 +-- .../java/forge/screens/match/VMatchUI.java | 4 +-- .../screens/match/controllers/CHand.java | 4 +-- .../forge/screens/match/views/VAntes.java | 2 +- .../java/forge/screens/match/views/VLog.java | 2 +- .../workshop/menus/CWorkshopUIMenus.java | 2 +- .../main/java/forge/sound/AltSoundSystem.java | 2 +- .../java/forge/toolbox/CardFaceSymbols.java | 2 +- .../java/forge/toolbox/FCheckBoxList.java | 2 +- .../java/forge/toolbox/FComboBoxPanel.java | 4 +-- .../java/forge/toolbox/FComboBoxWrapper.java | 6 ++-- .../java/forge/toolbox/FDigitalClock.java | 2 +- .../src/main/java/forge/toolbox/FList.java | 2 +- .../main/java/forge/toolbox/FOptionPane.java | 2 +- .../src/main/java/forge/toolbox/FPanel.java | 2 +- .../toolbox/special/PlayerDetailsPanel.java | 2 +- .../src/main/java/forge/view/FDialog.java | 2 +- .../src/main/java/forge/view/FView.java | 16 ++++----- .../java/forge/view/arcane/CardPanel.java | 2 +- .../forge/view/arcane/CardPanelContainer.java | 4 +-- .../forge/view/arcane/FloatingCardArea.java | 2 +- .../java/forge/view/arcane/FloatingZone.java | 4 +-- .../java/forge/view/arcane/ListCardArea.java | 8 ++--- .../main/java/forge/view/arcane/PlayArea.java | 12 +++---- .../src/test/java/forge/CardRankerTest.java | 2 +- .../gamesimulationtests/util/GameWrapper.java | 4 +-- .../util/LobbyPlayerForTests.java | 2 +- .../util/PlayerControllerForTests.java | 4 +-- .../util/SpecificationHandler.java | 2 +- .../GameStateSpecificationBuilder.java | 4 +-- .../playeractions/DeclareAttackersAction.java | 4 +-- .../util/playeractions/PlayerActions.java | 2 +- .../test/java/forge/gui/ListChooserTest.java | 2 +- .../test/java/forge/item/DeckHintsTest.java | 10 +++--- forge-gui-mobile/src/forge/Forge.java | 4 +-- forge-gui-mobile/src/forge/Graphics.java | 2 +- .../src/forge/animation/ForgeAnimation.java | 2 +- .../src/forge/animation/ForgeTransition.java | 4 +-- .../src/forge/animation/GifDecoder.java | 4 +-- .../src/forge/assets/BitmapFontWriter.java | 2 +- .../src/forge/assets/FLanguage.java | 2 +- forge-gui-mobile/src/forge/assets/FSkin.java | 10 +++--- .../src/forge/assets/FSkinColor.java | 4 +-- .../src/forge/assets/FSkinFont.java | 2 +- .../src/forge/assets/ImageCache.java | 2 +- .../src/forge/assets/TextRenderer.java | 6 ++-- .../src/forge/card/CardFaceSymbols.java | 2 +- .../src/forge/card/CardImageRenderer.java | 2 +- .../src/forge/card/CardRenderer.java | 6 ++-- forge-gui-mobile/src/forge/card/CardZoom.java | 2 +- .../src/forge/card/GameEntityPicker.java | 2 +- .../src/forge/deck/AddBasicLandsDialog.java | 4 +-- .../src/forge/deck/FDeckChooser.java | 20 ++++++----- .../src/forge/deck/FDeckEditor.java | 34 +++++++++---------- .../src/forge/deck/FDeckImportDialog.java | 4 +-- .../src/forge/itemmanager/CardManager.java | 2 +- .../src/forge/itemmanager/DeckManager.java | 4 +-- .../src/forge/itemmanager/ItemManager.java | 28 +++++++-------- .../filters/AdvancedSearchFilter.java | 4 +-- .../itemmanager/filters/CardTypeFilter.java | 2 +- .../itemmanager/filters/DeckFolderFilter.java | 2 +- .../itemmanager/filters/FormatFilter.java | 10 +++--- .../filters/HistoricFormatSelect.java | 2 +- .../itemmanager/filters/StatTypeFilter.java | 2 +- .../itemmanager/filters/TextSearchFilter.java | 2 +- .../filters/ToggleButtonsFilter.java | 2 +- .../forge/itemmanager/views/ImageView.java | 18 +++++----- .../forge/itemmanager/views/ItemListView.java | 2 +- .../src/forge/itemmanager/views/ItemView.java | 8 ++--- .../src/forge/menu/FDropDownMenu.java | 2 +- forge-gui-mobile/src/forge/menu/FMenuBar.java | 2 +- .../src/forge/screens/TabPageScreen.java | 6 ++-- .../achievements/AchievementsScreen.java | 2 +- .../screens/constructed/LobbyScreen.java | 10 +++--- .../screens/constructed/PlayerPanel.java | 4 +-- .../screens/gauntlet/LoadGauntletScreen.java | 6 ++-- .../screens/gauntlet/NewGauntletScreen.java | 20 ++++++----- .../src/forge/screens/home/HomeScreen.java | 2 +- .../screens/limited/LoadDraftScreen.java | 4 +-- .../screens/limited/LoadSealedScreen.java | 4 +-- .../forge/screens/match/MatchController.java | 4 +-- .../src/forge/screens/match/MatchScreen.java | 4 +-- .../screens/match/views/VAssignDamage.java | 6 ++-- .../screens/match/views/VAutoYields.java | 2 +- .../screens/match/views/VCardDisplayArea.java | 10 +++--- .../src/forge/screens/match/views/VField.java | 8 ++--- .../forge/screens/match/views/VManaPool.java | 2 +- .../screens/match/views/VPhaseIndicator.java | 2 +- .../screens/match/views/VPlayerPanel.java | 4 +-- .../src/forge/screens/match/views/VStack.java | 4 +-- .../ConquestCommandersScreen.java | 4 +-- .../planarconquest/ConquestRewardDialog.java | 6 ++-- .../planarconquest/ConquestStatsScreen.java | 2 +- .../planarconquest/LoadConquestScreen.java | 6 ++-- .../forge/screens/quest/LoadQuestScreen.java | 6 ++-- .../forge/screens/quest/NewQuestScreen.java | 12 +++---- .../forge/screens/quest/QuestDeckEditor.java | 2 +- .../screens/quest/QuestSpellShopScreen.java | 8 ++--- .../forge/screens/quest/QuestStatsScreen.java | 4 +-- .../src/forge/screens/settings/FilesPage.java | 2 +- .../forge/screens/settings/SettingsPage.java | 6 ++-- .../src/forge/toolbox/DualListBox.java | 2 +- .../src/forge/toolbox/FChoiceList.java | 4 +-- .../src/forge/toolbox/FComboBox.java | 2 +- .../src/forge/toolbox/FContainer.java | 2 +- .../src/forge/toolbox/FGroupList.java | 6 ++-- forge-gui-mobile/src/forge/toolbox/FList.java | 6 ++-- .../src/forge/toolbox/FOptionPane.java | 2 +- .../src/forge/toolbox/FOverlay.java | 4 +-- .../src/forge/toolbox/FProgressBar.java | 2 +- .../src/forge/toolbox/FRadioButton.java | 2 +- .../src/forge/toolbox/GuiChoose.java | 10 +++--- .../src/forge/toolbox/ListChooser.java | 4 +-- .../main/java/forge/achievement/Domain.java | 2 +- .../main/java/forge/card/CardDetailUtil.java | 2 +- .../main/java/forge/card/CardPreferences.java | 2 +- .../forge/card/CardReaderExperiments.java | 6 ++-- .../control/FControlGameEventHandler.java | 10 +++--- .../forge/deck/ArchetypeDeckGenerator.java | 2 +- .../forge/deck/CardArchetypeLDAGenerator.java | 2 +- .../deck/CardRelationMatrixGenerator.java | 10 +++--- .../forge/deck/CardThemedDeckGenerator.java | 2 +- .../java/forge/deck/ColorDeckGenerator.java | 4 +-- .../forge/deck/CommanderDeckGenerator.java | 8 ++--- .../java/forge/deck/DeckGeneratorTheme.java | 6 ++-- .../java/forge/deck/DeckImportController.java | 2 +- .../src/main/java/forge/deck/DeckProxy.java | 32 ++++++++--------- .../src/main/java/forge/deck/DeckgenUtil.java | 10 +++--- .../main/java/forge/deck/NetDeckCategory.java | 4 +-- .../java/forge/deck/RandomDeckGenerator.java | 8 ++--- .../java/forge/deck/io/DeckPreferences.java | 2 +- .../main/java/forge/deck/io/DeckRecords.java | 4 +-- .../forge/download/GuiDownloadPicturesHQ.java | 2 +- .../forge/download/GuiDownloadPicturesLQ.java | 2 +- .../forge/download/GuiDownloadZipService.java | 2 +- .../java/forge/gauntlet/GauntletData.java | 6 ++-- .../java/forge/gauntlet/GauntletUtil.java | 6 ++-- .../forge/itemmanager/AdvancedSearch.java | 20 +++++------ .../main/java/forge/itemmanager/GroupDef.java | 2 +- .../forge/itemmanager/ItemManagerConfig.java | 14 ++++---- .../forge/itemmanager/ItemManagerModel.java | 11 +++--- .../java/forge/itemmanager/SColumnUtil.java | 12 +++---- .../java/forge/itemmanager/SFilterUtil.java | 2 +- .../forge/itemmanager/SItemManagerUtil.java | 4 +-- .../java/forge/limited/BoosterDraftAI.java | 6 ++-- .../forge/limited/CardThemedDeckBuilder.java | 2 +- .../java/forge/limited/CustomLimited.java | 2 +- .../main/java/forge/limited/GauntletMini.java | 4 +-- .../forge/limited/LimitedDeckBuilder.java | 12 +++---- .../java/forge/limited/ReadDraftRankings.java | 8 ++--- .../limited/SealedCardPoolGenerator.java | 10 +++--- .../java/forge/limited/SealedDeckBuilder.java | 6 ++-- .../main/java/forge/limited/WinstonDraft.java | 4 +-- .../java/forge/limited/WinstonDraftAI.java | 3 +- .../src/main/java/forge/match/GameLobby.java | 2 +- .../main/java/forge/match/HostedMatch.java | 4 +-- .../forge/match/input/InputPassPriority.java | 4 +-- .../java/forge/match/input/InputPayMana.java | 6 ++-- .../java/forge/match/input/InputProxy.java | 4 +-- .../java/forge/match/input/InputQueue.java | 2 +- ...InputSelectCardsForConvokeOrImprovise.java | 4 +-- .../input/InputSelectEntitiesFromList.java | 4 +-- .../forge/match/input/InputSelectTargets.java | 4 +-- .../src/main/java/forge/model/CardBlock.java | 8 ++--- .../java/forge/model/CardCollections.java | 22 ++++++------ .../main/java/forge/model/UnOpenedMeta.java | 4 +-- .../planarconquest/ConquestAwardPool.java | 8 ++--- .../planarconquest/ConquestController.java | 14 ++++---- .../forge/planarconquest/ConquestData.java | 22 ++++++------ .../planarconquest/ConquestLocation.java | 2 +- .../forge/planarconquest/ConquestPlane.java | 12 +++---- .../forge/planarconquest/ConquestRegion.java | 6 ++-- .../java/forge/player/HumanCostDecision.java | 18 +++++----- .../src/main/java/forge/player/HumanPlay.java | 8 ++--- .../forge/player/PlayerControllerHuman.java | 18 +++++----- .../java/forge/player/TargetSelection.java | 4 +-- .../forge/properties/PreferencesStore.java | 2 +- .../java/forge/quest/QuestController.java | 12 +++---- .../java/forge/quest/QuestDeckGroupMap.java | 2 +- .../java/forge/quest/QuestEventChallenge.java | 4 +-- .../forge/quest/QuestEventDuelManager.java | 8 ++--- .../forge/quest/QuestEventLDADuelManager.java | 10 +++--- .../java/forge/quest/QuestRewardCard.java | 2 +- .../forge/quest/QuestRewardCardChooser.java | 4 +-- .../forge/quest/QuestRewardCardDuplicate.java | 2 +- .../forge/quest/QuestRewardCardFiltered.java | 2 +- .../java/forge/quest/QuestUtilUnlockSets.java | 10 +++--- .../src/main/java/forge/quest/QuestWorld.java | 8 ++--- .../quest/bazaar/QuestBazaarManager.java | 12 +++---- .../quest/bazaar/QuestPetController.java | 2 +- .../forge/quest/bazaar/QuestPetStorage.java | 10 +++--- .../quest/bazaar/QuestStallDefinition.java | 2 +- .../forge/quest/data/GameFormatQuest.java | 2 +- .../java/forge/quest/data/QuestAssets.java | 14 ++++---- .../main/java/forge/quest/data/QuestData.java | 2 +- .../main/java/forge/sound/SoundSystem.java | 4 +-- .../java/forge/tournament/TournamentData.java | 6 ++-- .../java/forge/tournament/TournamentUtil.java | 6 ++-- .../main/java/forge/util/IgnoringXStream.java | 2 +- .../src/main/java/forge/util/LineReader.java | 2 +- .../src/main/java/forge/util/XmlReader.java | 12 +++---- .../src/main/java/forge/util/XmlWriter.java | 2 +- .../main/java/forge/util/gui/SGuiChoose.java | 2 +- 431 files changed, 1181 insertions(+), 1173 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index c309b41ac01..12b309f09aa 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -81,7 +81,7 @@ public class AiAttackController { this.defendingOpponent = choosePreferredDefenderPlayer(); this.oppList = getOpponentCreatures(this.defendingOpponent); this.myList = ai.getCreaturesInPlay(); - this.attackers = new ArrayList(); + this.attackers = new ArrayList<>(); for (Card c : myList) { if (CombatUtil.canAttack(c, this.defendingOpponent)) { attackers.add(c); @@ -95,7 +95,7 @@ public class AiAttackController { this.defendingOpponent = choosePreferredDefenderPlayer(); this.oppList = getOpponentCreatures(this.defendingOpponent); this.myList = ai.getCreaturesInPlay(); - this.attackers = new ArrayList(); + this.attackers = new ArrayList<>(); if (CombatUtil.canAttack(attacker, this.defendingOpponent)) { attackers.add(attacker); } @@ -103,7 +103,7 @@ public class AiAttackController { } // overloaded constructor to evaluate single specified attacker public static List getOpponentCreatures(final Player defender) { - List defenders = new ArrayList(); + List defenders = new ArrayList<>(); defenders.addAll(defender.getCreaturesInPlay()); Predicate canAnimate = new Predicate() { @Override @@ -151,7 +151,7 @@ public class AiAttackController { * */ public final static List sortAttackers(final List in) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); // Cards with triggers should come first (for Battle Cry) for (final Card attacker : in) { @@ -256,7 +256,7 @@ public class AiAttackController { } public final static List getPossibleBlockers(final List blockers, final List attackers) { - List possibleBlockers = new ArrayList(blockers); + List possibleBlockers = new ArrayList<>(blockers); possibleBlockers = CardLists.filter(possibleBlockers, new Predicate() { @Override public boolean apply(final Card c) { @@ -267,7 +267,7 @@ public class AiAttackController { } public final static boolean canBlockAnAttacker(final Card c, final List attackers, final boolean nextTurn) { - final List attackerList = new ArrayList(attackers); + final List attackerList = new ArrayList<>(attackers); if (!c.isCreature()) { return false; } @@ -280,7 +280,7 @@ public class AiAttackController { } public final static Card getCardCanBlockAnAttacker(final Card c, final List attackers, final boolean nextTurn) { - final List attackerList = new ArrayList(attackers); + final List attackerList = new ArrayList<>(attackers); if (!c.isCreature()) { return null; } @@ -295,9 +295,9 @@ public class AiAttackController { // this checks to make sure that the computer player doesn't lose when the human player attacks // this method is used by getAttackers() public final List notNeededAsBlockers(final Player ai, final List attackers) { - final List notNeededAsBlockers = new ArrayList(attackers); + final List notNeededAsBlockers = new ArrayList<>(attackers); int fixedBlockers = 0; - final List vigilantes = new ArrayList(); + final List vigilantes = new ArrayList<>(); //check for time walks if (ai.getGame().getPhaseHandler().getNextTurn().equals(ai)) { return attackers; @@ -336,7 +336,7 @@ public class AiAttackController { } } - List opponentsAttackers = new ArrayList(oppList); + List opponentsAttackers = new ArrayList<>(oppList); opponentsAttackers = CardLists.filter(opponentsAttackers, new Predicate() { @Override public boolean apply(final Card c) { @@ -681,7 +681,7 @@ public class AiAttackController { // Determine who will be attacked GameEntity defender = this.chooseDefender(combat, bAssault); - List attackersLeft = new ArrayList(this.attackers); + List attackersLeft = new ArrayList<>(this.attackers); // TODO probably use AttackConstraints instead of only GlobalAttackRestrictions? GlobalAttackRestrictions restrict = GlobalAttackRestrictions.getGlobalRestrictions(ai, combat.getDefenders()); @@ -821,12 +821,12 @@ public class AiAttackController { int humanForcesForAttritionalAttack = 0; // examine the potential forces - final List nextTurnAttackers = new ArrayList(); + final List nextTurnAttackers = new ArrayList<>(); int candidateCounterAttackDamage = 0; final Player opp = this.defendingOpponent; // get the potential damage and strength of the AI forces - final List candidateAttackers = new ArrayList(); + final List candidateAttackers = new ArrayList<>(); int candidateUnblockedDamage = 0; for (final Card pCard : this.myList) { // if the creature can attack then it's a potential attacker this @@ -908,7 +908,7 @@ public class AiAttackController { // get player life total int humanLife = opp.getLife(); // get the list of attackers up to the first blocked one - final List attritionalAttackers = new ArrayList(); + final List attritionalAttackers = new ArrayList<>(); for (int x = 0; x < (this.attackers.size() - humanForces); x++) { attritionalAttackers.add(this.attackers.get(x)); } diff --git a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java index cfe4bcd61dc..06f60545f52 100644 --- a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java +++ b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java @@ -39,7 +39,7 @@ import java.util.Map; * @version $Id: AIProfile.java 20169 2013-03-08 08:24:17Z Agetian $ */ public class AiProfileUtil { - private static Map> loadedProfiles = new HashMap>(); + private static Map> loadedProfiles = new HashMap<>(); private static String AI_PROFILE_DIR; private static final String AI_PROFILE_EXT = ".ai"; @@ -74,7 +74,7 @@ public class AiProfileUtil { * @param profileName a profile to load. */ private static final Map loadProfile(final String profileName) { - Map profileMap = new HashMap(); + Map profileMap = new HashMap<>(); List lines = FileUtil.readFile(buildFileName(profileName)); for (String line : lines) { @@ -122,7 +122,7 @@ public class AiProfileUtil { */ public static List getAvailableProfiles() { - final List availableProfiles = new ArrayList(); + final List availableProfiles = new ArrayList<>(); final File dir = new File(AI_PROFILE_DIR); final String[] children = dir.list(); @@ -146,7 +146,7 @@ public class AiProfileUtil { * available profiles including special random profile tags. */ public static List getProfilesDisplayList() { - final List availableProfiles = new ArrayList(); + final List availableProfiles = new ArrayList<>(); availableProfiles.add(AI_PROFILE_RANDOM_MATCH); availableProfiles.add(AI_PROFILE_RANDOM_DUEL); availableProfiles.addAll(getAvailableProfiles()); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index ef3512b752f..9cf6b37e417 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1514,7 +1514,7 @@ public class ComputerUtil { */ public static List predictThreatenedObjects(final Player ai, final SpellAbility sa, boolean top) { final Game game = ai.getGame(); - final List objects = new ArrayList(); + final List objects = new ArrayList<>(); if (game.getStack().isEmpty()) { return objects; } @@ -1543,8 +1543,8 @@ public class ComputerUtil { private static Iterable predictThreatenedObjects(final Player aiPlayer, final SpellAbility saviour, final SpellAbility topStack) { - Iterable objects = new ArrayList(); - final List threatened = new ArrayList(); + Iterable objects = new ArrayList<>(); + final List threatened = new ArrayList<>(); ApiType saviourApi = saviour == null ? null : saviour.getApi(); int toughness = 0; boolean grantIndestructible = false; @@ -1574,7 +1574,7 @@ public class ComputerUtil { } } else { objects = topStack.getTargets().getTargets(); - final List canBeTargeted = new ArrayList(); + final List canBeTargeted = new ArrayList<>(); for (Object o : objects) { if (o instanceof Card) { final Card c = (Card) o; @@ -1597,7 +1597,7 @@ public class ComputerUtil { toughness = saviorWithSubs.hasParam("NumDef") ? AbilityUtils.calculateAmount(saviorWithSubs.getHostCard(), saviorWithSubs.getParam("NumDef"), saviour) : 0; final List keywords = saviorWithSubs.hasParam("KW") ? - Arrays.asList(saviorWithSubs.getParam("KW").split(" & ")) : new ArrayList(); + Arrays.asList(saviorWithSubs.getParam("KW").split(" & ")) : new ArrayList<>(); if (keywords.contains("Indestructible")) { grantIndestructible = true; } @@ -1630,7 +1630,7 @@ public class ComputerUtil { final SpellAbility sub = topStack.getSubAbility(); boolean noRegen = false; if (sub != null && sub.getApi() == ApiType.Pump) { - final List keywords = sub.hasParam("KW") ? Arrays.asList(sub.getParam("KW").split(" & ")) : new ArrayList(); + final List keywords = sub.hasParam("KW") ? Arrays.asList(sub.getParam("KW").split(" & ")) : new ArrayList<>(); for (String kw : keywords) { if (kw.contains("can't be regenerated")) { noRegen = true; @@ -2053,7 +2053,7 @@ public class ComputerUtil { //Too many lands! //Init int cntColors = MagicColor.WUBRG.length; - List numProducers = new ArrayList(cntColors); + List numProducers = new ArrayList<>(cntColors); for (byte col : MagicColor.WUBRG) { numProducers.add(col, new CardCollection()); } @@ -2283,7 +2283,7 @@ public class ComputerUtil { chosen = ComputerUtilCard.getMostProminentType(list, valid); } else if (logic.equals("MostNeededType")) { // Choose a type that is in the deck, but not in hand or on the battlefield - final List basics = new ArrayList(); + final List basics = new ArrayList<>(); basics.addAll(CardType.Constant.BASIC_TYPES); CardCollectionView presentCards = CardCollection.combine(ai.getCardsIn(ZoneType.Battlefield), ai.getCardsIn(ZoneType.Hand)); CardCollectionView possibleCards = ai.getAllCards(); @@ -2588,7 +2588,7 @@ public class ComputerUtil { int damage = 0; final Game game = player.getGame(); final Card card = sa.getHostCard(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card c : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(c.getTriggers()); @@ -2680,7 +2680,7 @@ public class ComputerUtil { public static int getDamageFromETB(final Player player, final Card permanent) { int damage = 0; final Game game = player.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 1587fcdb91b..db112c4f973 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -564,7 +564,7 @@ public class ComputerUtilCard { AiBlockController aiBlk = new AiBlockController(ai); Combat combat = new Combat(ai); combat.addAttacker(attacker, ai); - final List attackers = new ArrayList(); + final List attackers = new ArrayList<>(); attackers.add(attacker); aiBlk.assignBlockersGivenAttackers(combat, attackers); return ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, combat); @@ -788,7 +788,7 @@ public class ComputerUtilCard { public static List getColorByProminence(final List list) { int cntColors = MagicColor.WUBRG.length; - final List> map = new ArrayList>(); + final List> map = new ArrayList<>(); for(int i = 0; i < cntColors; i++) { map.add(MutablePair.of(MagicColor.WUBRG[i], 0)); } @@ -810,7 +810,7 @@ public class ComputerUtilCard { }); // will this part be once dropped? - List result = new ArrayList(cntColors); + List result = new ArrayList<>(cntColors); for(Pair idx : map) { // fetch color names in the same order result.add(MagicColor.toLongString(idx.getKey())); } @@ -882,7 +882,7 @@ public class ComputerUtilCard { } }; public static List chooseColor(SpellAbility sa, int min, int max, List colorChoices) { - List chosen = new ArrayList(); + List chosen = new ArrayList<>(); Player ai = sa.getActivatingPlayer(); final Game game = ai.getGame(); Player opp = ai.getWeakestOpponent(); @@ -1572,7 +1572,7 @@ public class ComputerUtilCard { Card pumped = CardFactory.copyCard(c, true); pumped.setSickness(c.hasSickness()); final long timestamp = c.getGame().getNextTimestamp(); - final List kws = new ArrayList(); + final List kws = new ArrayList<>(); for (String kw : keywords) { if (kw.startsWith("HIDDEN")) { pumped.addHiddenExtrinsicKeyword(kw); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 9c030f3a2d4..262d63705e9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -965,7 +965,7 @@ public class ComputerUtilCombat { } } - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1100,7 +1100,7 @@ public class ComputerUtilCombat { } final Game game = attacker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1284,7 +1284,7 @@ public class ComputerUtilCombat { } final Game game = attacker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1505,7 +1505,7 @@ public class ComputerUtilCombat { } final Game game = attacker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1726,7 +1726,7 @@ public class ComputerUtilCombat { } // check Destroy triggers (Cockatrice and friends) - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : attacker.getGame().getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -2006,7 +2006,7 @@ public class ComputerUtilCombat { } final Game game = blocker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 9c9ba23e640..1972cac990e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -365,7 +365,7 @@ public class ComputerUtilMana { private static boolean payManaCost(final ManaCostBeingPaid cost, final SpellAbility sa, final Player ai, final boolean test, boolean checkPlayable) { adjustManaCostToAvoidNegEffects(cost, sa.getHostCard(), ai); - List manaSpentToPay = test ? new ArrayList() : sa.getPayingMana(); + List manaSpentToPay = test ? new ArrayList<>() : sa.getPayingMana(); boolean purePhyrexian = cost.containsOnlyPhyrexianMana(); int testEnergyPool = ai.getCounters(CounterType.ENERGY); @@ -1359,7 +1359,7 @@ public class ComputerUtilMana { final ListMultimap manaMap = ArrayListMultimap.create(); final Game game = ai.getGame(); - List replacementEffects = new ArrayList(); + List replacementEffects = new ArrayList<>(); for (final Player p : game.getPlayers()) { for (final Card crd : p.getAllCards()) { for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) { @@ -1565,7 +1565,7 @@ public class ComputerUtilMana { * @return map between creatures and shards to convoke */ public static Map getConvokeOrImproviseFromList(final ManaCost cost, List list, boolean improvise) { - final Map convoke = new HashMap(); + final Map convoke = new HashMap<>(); Card convoked = null; if (!improvise) { for (ManaCostShard toPay : cost) { diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index deb1a7d021b..1703b9b0869 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -41,7 +41,7 @@ import java.util.*; import java.util.Map.Entry; public abstract class GameState { - private static final Map ZONES = new HashMap(); + private static final Map ZONES = new HashMap<>(); static { ZONES.put(ZoneType.Battlefield, "battlefield"); ZONES.put(ZoneType.Hand, "hand"); @@ -66,8 +66,8 @@ public abstract class GameState { private boolean puzzleCreatorState = false; - private final Map humanCardTexts = new EnumMap(ZoneType.class); - private final Map aiCardTexts = new EnumMap(ZoneType.class); + private final Map humanCardTexts = new EnumMap<>(ZoneType.class); + private final Map aiCardTexts = new EnumMap<>(ZoneType.class); private final Map idToCard = new HashMap<>(); private final Map cardToAttachId = new HashMap<>(); @@ -1078,7 +1078,7 @@ public abstract class GameState { p.getZone(zt).removeAllCards(true); } - Map playerCards = new EnumMap(ZoneType.class); + Map playerCards = new EnumMap<>(ZoneType.class); for (Entry kv : cardTexts.entrySet()) { String value = kv.getValue(); playerCards.put(kv.getKey(), processCardsForZone(value.isEmpty() ? new String[0] : value.split(";"), p)); @@ -1091,7 +1091,7 @@ public abstract class GameState { for (Entry kv : playerCards.entrySet()) { PlayerZone zone = p.getZone(kv.getKey()); if (kv.getKey() == ZoneType.Battlefield) { - List cards = new ArrayList(); + List cards = new ArrayList<>(); for (final Card c : kv.getValue()) { if (c.isToken()) { cards.add(c); diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 7e4923d8c9d..3f461395650 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -168,8 +168,8 @@ public class PlayerControllerAi extends PlayerController { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix()); } - FCollection remaining = new FCollection(optionList); - List selecteds = new ArrayList(); + FCollection remaining = new FCollection<>(optionList); + List selecteds = new ArrayList<>(); T selected; do { selected = chooseSingleEntityForEffect(remaining, null, sa, title, selecteds.size()>=min, targetedPlayer); @@ -1072,7 +1072,7 @@ public class PlayerControllerAi extends PlayerController { } }); } else { - return new HashMap(); + return new HashMap<>(); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index cb723ad515c..43cfb9dd765 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -451,7 +451,7 @@ public class AttachAi extends SpellAbilityAi { */ private static Player attachToPlayerAIPreferences(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - List targetable = new ArrayList(); + List targetable = new ArrayList<>(); for (final Player player : aiPlayer.getGame().getPlayers()) { if (sa.canTarget(player)) { targetable.add(player); @@ -855,7 +855,7 @@ public class AttachAi extends SpellAbilityAi { int totToughness = 0; int totPower = 0; - final List keywords = new ArrayList(); + final List keywords = new ArrayList<>(); for (final StaticAbility stAbility : attachSource.getStaticAbilities()) { final Map stabMap = stAbility.getMapParams(); @@ -906,7 +906,7 @@ public class AttachAi extends SpellAbilityAi { Card c = null; if (prefList == null || prefList.isEmpty()) { - prefList = new ArrayList(list); + prefList = new ArrayList<>(list); } else { c = ComputerUtilCard.getBestAI(prefList); if (c != null) { @@ -960,7 +960,7 @@ public class AttachAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(final Player ai, final SpellAbility sa, final boolean mandatory) { final Card card = sa.getHostCard(); // Check if there are any valid targets - List targets = new ArrayList(); + List targets = new ArrayList<>(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt == null) { targets = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("Defined"), sa); @@ -1150,7 +1150,7 @@ public class AttachAi extends SpellAbilityAi { int totToughness = 0; int totPower = 0; - final List keywords = new ArrayList(); + final List keywords = new ArrayList<>(); boolean grantingAbilities = false; for (final StaticAbility stAbility : attachSource.getStaticAbilities()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 98d5a90e960..f677dcf779f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -482,7 +482,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } } - List origin = new ArrayList(); + List origin = new ArrayList<>(); if (sa.hasParam("Origin")) { origin = ZoneType.listValueOf(sa.getParam("Origin")); } @@ -557,7 +557,7 @@ public class ChangeZoneAi extends SpellAbilityAi { */ private static Card basicManaFixing(final Player ai, final List list) { // Search for a Basic Land final CardCollectionView combined = CardCollection.combine(ai.getCardsIn(ZoneType.Battlefield), ai.getCardsIn(ZoneType.Hand)); - final List basics = new ArrayList(); + final List basics = new ArrayList<>(); // what types can I go get? for (final String name : MagicColor.Constant.BASIC_LANDS) { @@ -1281,7 +1281,7 @@ public class ChangeZoneAi extends SpellAbilityAi { final List objects = ComputerUtil .predictThreatenedObjects(ai, sa); - final List threatenedTargets = new ArrayList(); + final List threatenedTargets = new ArrayList<>(); for (final Card c : aiPermanents) { if (objects.contains(c)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index 4ecfec696df..1f4e627bda8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -103,7 +103,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { Cost unless = new Cost(unlessCost, false); SpellAbility paycost = new SpellAbility.EmptySa(sa.getHostCard(), player); paycost.setPayCosts(unless); - if (ComputerUtilCost.willPayUnlessCost(sp, player, unless, false, new FCollection(player)) + if (ComputerUtilCost.willPayUnlessCost(sp, player, unless, false, new FCollection<>(player)) && ComputerUtilCost.canPayCost(paycost, player)) { return sp; } diff --git a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java index 84bb04ebaf9..c80e1db1a93 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java @@ -100,7 +100,7 @@ public class DamagePreventAi extends SpellAbilityAi { tcs.add(ai); chance = true; } - final List threatenedTargets = new ArrayList(); + final List threatenedTargets = new ArrayList<>(); // filter AIs battlefield by what I can target List targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard, sa); targetables = CardLists.getTargetableCards(targetables, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index 6f5047d533a..37bcd7c2d33 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -266,7 +266,7 @@ public class DebuffAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final List kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList(); + final List kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList<>(); if (sa.getTargetRestrictions() == null) { if (mandatory) { diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java index 087261271c2..23ee0a4712e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java @@ -182,7 +182,7 @@ public class LifeLoseAi extends SpellAbilityAi { } final List tgtPlayers = sa.usesTargeting() && !sa.hasParam("Defined") - ? new FCollection(sa.getTargets().getTargetPlayers()) + ? new FCollection<>(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); // For cards like Foul Imp, ETB you lose life diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java index 13ed8ff2e51..51db49de678 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java @@ -30,7 +30,7 @@ import forge.util.MyRandom; public class ProtectAi extends SpellAbilityAi { private static boolean hasProtectionFrom(final Card card, final String color) { - final List onlyColors = new ArrayList(MagicColor.Constant.ONLY_COLORS); + final List onlyColors = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); // make sure we have a valid color if (!onlyColors.contains(color)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index 9f1a6c7b159..0189574dc65 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -50,7 +50,7 @@ public class PumpAllAi extends PumpAiBase { final int power = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumAtt"), sa); final int defense = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDef"), sa); - final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList(); + final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList<>(); final PhaseType phase = game.getPhaseHandler().getPhase(); diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java index 1e5ed6f1d01..64603e40410 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java @@ -106,7 +106,7 @@ public class RegenerateAi extends SpellAbilityAi { // control final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa, true); - final List threatenedTargets = new ArrayList(); + final List threatenedTargets = new ArrayList<>(); for (final Card c : targetables) { if (objects.contains(c) && c.getShieldCount() == 0 && !ComputerUtil.canRegenerate(ai, c)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java b/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java index 88d585a3a25..2abada6610d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java @@ -47,7 +47,7 @@ public class StoreSVarAi extends SpellAbilityAi { possibleBlockers = CardLists.filter(possibleBlockers, Presets.UNTAPPED); int oppLife = opp.getLife(); int potentialDmg = 0; - List currentAttackers = new ArrayList(); + List currentAttackers = new ArrayList<>(); if (possibleBlockers.size() == 0) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index 6704b41e46b..ecc32895e01 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -435,7 +435,7 @@ public class TokenAi extends SpellAbilityAi { } } - final List imageNames = new ArrayList(1); + final List imageNames = new ArrayList<>(1); if (tokenImage.equals("")) { imageNames.add(PaperToken.makeTokenFileName(TextUtil.fastReplace(colorDesc, " ", ""), tokenPower, tokenToughness, tokenName)); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index 1589ec3f41d..0b1ac1ad906 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -39,7 +39,7 @@ public class TwoPilesAi extends SpellAbilityAi { } final List tgtPlayers = sa.usesTargeting() && !sa.hasParam("Defined") - ? new FCollection(sa.getTargets().getTargetPlayers()) + ? new FCollection<>(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); final Player p = tgtPlayers.get(0); diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java index 4f3292f58d4..4c877974ff2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java @@ -66,7 +66,7 @@ public class UnattachAllAi extends SpellAbilityAi { final Card card = sa.getHostCard(); final Player opp = ai.getWeakestOpponent(); // Check if there are any valid targets - List targets = new ArrayList(); + List targets = new ArrayList<>(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt == null) { targets = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("Defined"), sa); diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java index 6fe8a5074be..c1d0fac1e32 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java @@ -38,7 +38,7 @@ public class GameSimulator { aiPlayer = (Player) copier.find(origAiPlayer); eval = new GameStateEvaluator(); - origLines = new ArrayList(); + origLines = new ArrayList<>(); debugLines = origLines; debugPrint = false; @@ -52,7 +52,7 @@ public class GameSimulator { // first and get the updated eval score, since this is what we'll // want to compare to the eval score after simulating. if (COPY_STACK && !origGame.getStackZone().isEmpty()) { - origLines = new ArrayList(); + origLines = new ArrayList<>(); debugLines = origLines; Game copyOrigGame = copier.makeCopy(); Player copyOrigAiPlayer = copyOrigGame.getPlayers().get(1); @@ -66,12 +66,12 @@ public class GameSimulator { private void ensureGameCopyScoreMatches(Game origGame, Player origAiPlayer) { eval.setDebugging(true); - List simLines = new ArrayList(); + List simLines = new ArrayList<>(); debugLines = simLines; Score simScore = eval.getScoreForGameState(simGame, aiPlayer); if (!simScore.equals(origScore)) { // Re-eval orig with debug printing. - origLines = new ArrayList(); + origLines = new ArrayList<>(); debugLines = origLines; eval.getScoreForGameState(origGame, origAiPlayer); // Print debug info. @@ -216,7 +216,7 @@ public class GameSimulator { List simLines = null; if (debugPrint) { debugPrint("SimGame:"); - simLines = new ArrayList(); + simLines = new ArrayList<>(); debugLines = simLines; debugPrint = false; } @@ -245,7 +245,7 @@ public class GameSimulator { opponent.runWithController(new Runnable() { @Override public void run() { - final Set allAffectedCards = new HashSet(); + final Set allAffectedCards = new HashSet<>(); game.getAction().checkStateEffects(false, allAffectedCards); game.getStack().addAllTriggeredAbilitiesToStack(); while (!game.getStack().isEmpty() && !game.isGameOver()) { diff --git a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java index 3aa48b72945..8d3e3f06321 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java +++ b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java @@ -51,7 +51,7 @@ public class PossibleTargetSelector { this.sa = sa; this.targetingSa = targetingSa; this.targetingSaIndex = targetingSaIndex; - this.validTargets = new ArrayList(); + this.validTargets = new ArrayList<>(); generateValidTargets(sa.getHostCard().getController()); } @@ -81,7 +81,7 @@ public class PossibleTargetSelector { private static class SimilarTargetSkipper { private ArrayListMultimap validTargetsMap = ArrayListMultimap.create(); - private HashMap cardTypeStrings = new HashMap(); + private HashMap cardTypeStrings = new HashMap<>(); private HashMap creatureScores; private int getCreatureScore(Card c) { @@ -91,7 +91,7 @@ public class PossibleTargetSelector { return score; } } else { - creatureScores = new HashMap(); + creatureScores = new HashMap<>(); } int score = ComputerUtilCard.evaluateCreature(c); diff --git a/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java b/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java index 2593973d08c..f6588af7fe0 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java @@ -18,7 +18,7 @@ public class SimulationController { private List simulatorStack; private Plan.Decision bestSequence; // last action of sequence private Score bestScore; - private List effectCache = new ArrayList(); + private List effectCache = new ArrayList<>(); private GameObject[] currentHostAndTarget; private static class CachedEffect { @@ -39,10 +39,10 @@ public class SimulationController { public SimulationController(Score score) { bestScore = score; - scoreStack = new ArrayList(); + scoreStack = new ArrayList<>(); scoreStack.add(score); - simulatorStack = new ArrayList(); - currentStack = new ArrayList(); + simulatorStack = new ArrayList<>(); + currentStack = new ArrayList<>(); } private int getRecursionDepth() { @@ -97,7 +97,7 @@ public class SimulationController { throw new RuntimeException("getBestPlan() expects currentStack to be empty!"); } - ArrayList sequence = new ArrayList(); + ArrayList sequence = new ArrayList<>(); Plan.Decision current = bestSequence; while (current != null) { sequence.add(current); diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java index 36fbde8d365..b940278d477 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java @@ -84,7 +84,7 @@ public class SpellAbilityChoicesIterator { } ChoicePoint cp = choicePoints.get(cpIndex); // Prune duplicates. - HashSet uniqueCards = new HashSet(); + HashSet uniqueCards = new HashSet<>(); for (int i = 0; i < fetchList.size(); i++) { Card card = fetchList.get(i); if (uniqueCards.add(card.getName()) && uniqueCards.size() == cp.nextChoice + 1) { @@ -213,7 +213,7 @@ public class SpellAbilityChoicesIterator { } public static List getModeCombination(List choices, int[] modeIndexes) { - ArrayList modes = new ArrayList(); + ArrayList modes = new ArrayList<>(); for (int modeIndex : modeIndexes) { modes.add(choices.get(modeIndex)); } diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java index f6c9eec8dfa..43f0c6f5e89 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java @@ -61,7 +61,7 @@ public class SpellAbilityPicker { List all = ComputerUtilAbility.getSpellAbilities(cards, player); CardCollection landsToPlay = ComputerUtilAbility.getAvailableLandsToPlay(game, player); if (landsToPlay != null) { - HashMap landsDeDupe = new HashMap(); + HashMap landsDeDupe = new HashMap<>(); for (Card land : landsToPlay) { Card previousLand = landsDeDupe.get(land.getName()); // Skip identical lands. @@ -165,7 +165,7 @@ public class SpellAbilityPicker { PhaseType currentPhase = game.getPhaseHandler().getPhase(); if (currentPhase.isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - List candidateSAs2 = new ArrayList(); + List candidateSAs2 = new ArrayList<>(); for (SpellAbility sa : candidateSAs) { if (!isSorcerySpeed(sa, player)) { System.err.println("Not sorcery: " + sa); diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java index 02e4d414277..257305926d6 100644 --- a/forge-core/src/main/java/forge/CardStorageReader.java +++ b/forge-core/src/main/java/forge/CardStorageReader.java @@ -175,7 +175,7 @@ public class CardStorageReader { } if (zipEntriesMap == null) { - zipEntriesMap = new HashMap(); + zipEntriesMap = new HashMap<>(); for (ZipEntry entry : getZipEntries()) { zipEntriesMap.put(entry.getName(), entry); } @@ -256,7 +256,7 @@ public class CardStorageReader { return result; } - final List allFiles = collectCardFiles(new ArrayList(), this.cardsfolder); + final List allFiles = collectCardFiles(new ArrayList<>(), this.cardsfolder); if (!allFiles.isEmpty()) { int fileParts = zip == null ? NUMBER_OF_PARTS : 1 + NUMBER_OF_PARTS / 3; if (allFiles.size() < fileParts * 100) { diff --git a/forge-core/src/main/java/forge/FTrace.java b/forge-core/src/main/java/forge/FTrace.java index 06533b8365d..66da87c881a 100644 --- a/forge-core/src/main/java/forge/FTrace.java +++ b/forge-core/src/main/java/forge/FTrace.java @@ -8,7 +8,7 @@ import java.util.Map; public class FTrace { private static long appStartTime; - private static Map traces = new HashMap(); + private static Map traces = new HashMap<>(); public static void initialize() { appStartTime = new Date().getTime(); diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 7ff30567465..d9d02dcc78b 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -110,7 +110,7 @@ public class StaticData { private List sortedEditions; public final List getSortedEditions() { if (sortedEditions == null) { - sortedEditions = new ArrayList(); + sortedEditions = new ArrayList<>(); for (CardEdition set : editions) { sortedEditions.add(set); } diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 0b157f26ac2..79776618bed 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -41,16 +41,16 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { public final static char NameSetSeparator = '|'; // need this to obtain cardReference by name+set+artindex - private final ListMultimap allCardsByName = Multimaps.newListMultimap(new TreeMap>(String.CASE_INSENSITIVE_ORDER), CollectionSuppliers.arrayLists()); + private final ListMultimap allCardsByName = Multimaps.newListMultimap(new TreeMap<>(String.CASE_INSENSITIVE_ORDER), CollectionSuppliers.arrayLists()); private final Map uniqueCardsByName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); private final Map rulesByName; private final Map facesByName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); - private static Map artPrefs = new HashMap(); + private static Map artPrefs = new HashMap<>(); private final Map alternateName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); - private final Map artIds = new HashMap(); + private final Map artIds = new HashMap<>(); - private final List allCards = new ArrayList(); + private final List allCards = new ArrayList<>(); private final List roAllCards = Collections.unmodifiableList(allCards); private final CardEdition.Collection editions; @@ -166,8 +166,8 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } public void initialize(boolean logMissingPerEdition, boolean logMissingSummary) { - Set allMissingCards = new LinkedHashSet(); - List missingCards = new ArrayList(); + Set allMissingCards = new LinkedHashSet<>(); + List missingCards = new ArrayList<>(); CardEdition upcomingSet = null; Date today = new Date(); @@ -342,10 +342,10 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (request.artIndex <= 0) { // this stands for 'random art' Collection candidates; if (reqEdition == null) { - candidates = new ArrayList(cards); + candidates = new ArrayList<>(cards); } else { - candidates = new ArrayList(); + candidates = new ArrayList<>(); for (PaperCard pc : cards) { if (pc.getEdition().equalsIgnoreCase(reqEdition)) { candidates.add(pc); @@ -452,7 +452,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { firstWithoutImage = pc; //ensure first without image returns if none have image } if (cardsListReadOnly) { //ensure we don't modify a cached collection - cards = new ArrayList(cards); + cards = new ArrayList<>(cards); cardsListReadOnly = false; } cards.remove(randomIndex); //remove card from collection and try another random card @@ -686,7 +686,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { result = rulesByName.put(cardName, rules); // 1. generate all paper cards from edition data we have (either explicit, or found in res/editions, or add to unknown edition) - List paperCards = new ArrayList(); + List paperCards = new ArrayList<>(); if (null == whenItWasPrinted || whenItWasPrinted.isEmpty()) { for (CardEdition e : editions.getOrderedEditions()) { int artIdx = 1; diff --git a/forge-core/src/main/java/forge/card/CardFace.java b/forge-core/src/main/java/forge/card/CardFace.java index 3e7afb2858b..26afc2c06c7 100644 --- a/forge-core/src/main/java/forge/card/CardFace.java +++ b/forge-core/src/main/java/forge/card/CardFace.java @@ -24,8 +24,8 @@ final class CardFace implements ICardFace { } - private final static List emptyList = Collections.unmodifiableList(new ArrayList()); - private final static Map emptyMap = Collections.unmodifiableMap(new TreeMap()); + private final static List emptyList = Collections.unmodifiableList(new ArrayList<>()); + private final static Map emptyMap = Collections.unmodifiableMap(new TreeMap<>()); private final String name; private String altName = null; @@ -112,12 +112,12 @@ final class CardFace implements ICardFace { // Raw fields used for Card creation void setNonAbilityText(String value) { this.nonAbilityText = value; } - void addKeyword(String value) { if (null == this.keywords) { this.keywords = new ArrayList(); } this.keywords.add(value); } - void addAbility(String value) { if (null == this.abilities) { this.abilities = new ArrayList(); } this.abilities.add(value);} - void addTrigger(String value) { if (null == this.triggers) { this.triggers = new ArrayList(); } this.triggers.add(value);} - void addStaticAbility(String value) { if (null == this.staticAbilities) { this.staticAbilities = new ArrayList(); } this.staticAbilities.add(value);} - void addReplacementEffect(String value) { if (null == this.replacements) { this.replacements = new ArrayList(); } this.replacements.add(value);} - void addSVar(String key, String value) { if (null == this.variables) { this.variables = new TreeMap(String.CASE_INSENSITIVE_ORDER); } this.variables.put(key, value); } + void addKeyword(String value) { if (null == this.keywords) { this.keywords = new ArrayList<>(); } this.keywords.add(value); } + void addAbility(String value) { if (null == this.abilities) { this.abilities = new ArrayList<>(); } this.abilities.add(value);} + void addTrigger(String value) { if (null == this.triggers) { this.triggers = new ArrayList<>(); } this.triggers.add(value);} + void addStaticAbility(String value) { if (null == this.staticAbilities) { this.staticAbilities = new ArrayList<>(); } this.staticAbilities.add(value);} + void addReplacementEffect(String value) { if (null == this.replacements) { this.replacements = new ArrayList<>(); } this.replacements.add(value);} + void addSVar(String key, String value) { if (null == this.variables) { this.variables = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); } this.variables.put(key, value); } void assignMissingFields() { // Most scripts do not specify color explicitly diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index 4748c821013..6679b3ad673 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -627,7 +627,7 @@ public final class CardRulesPredicates { public static final Predicate IS_MONOCOLOR = CardRulesPredicates.hasCntColors((byte) 1); /** The Constant colors. */ - public static final List> COLORS = new ArrayList>(); + public static final List> COLORS = new ArrayList<>(); static { Presets.COLORS.add(Presets.IS_WHITE); Presets.COLORS.add(Presets.IS_BLUE); diff --git a/forge-core/src/main/java/forge/card/ColorSet.java b/forge-core/src/main/java/forge/card/ColorSet.java index c3b34c5cdd8..0384ff5a481 100644 --- a/forge-core/src/main/java/forge/card/ColorSet.java +++ b/forge-core/src/main/java/forge/card/ColorSet.java @@ -320,7 +320,7 @@ public final class ColorSet implements Comparable, Iterable, Ser if (isColorless()) { return EnumSet.of(Color.COLORLESS); } - List list = new ArrayList(); + List list = new ArrayList<>(); for (Color c : Color.values()) { if (hasAnyColor(c.getColormask())) { list.add(c); diff --git a/forge-core/src/main/java/forge/card/PrintSheet.java b/forge-core/src/main/java/forge/card/PrintSheet.java index 3aa29ad2527..7c5c22461fa 100644 --- a/forge-core/src/main/java/forge/card/PrintSheet.java +++ b/forge-core/src/main/java/forge/card/PrintSheet.java @@ -96,7 +96,7 @@ public class PrintSheet { number -= uniqueCards; } - List uniques = wantUnique ? new ArrayList() : null; + List uniques = wantUnique ? new ArrayList<>() : null; for(int iC = 0; iC < number; iC++) { int index = MyRandom.getRandom().nextInt(totalWeight); PaperCard toAdd = fetchRoulette(0, index, wantUnique ? uniques : null); diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java index 34f461432d8..9e8921d78b6 100644 --- a/forge-core/src/main/java/forge/deck/Deck.java +++ b/forge-core/src/main/java/forge/deck/Deck.java @@ -39,8 +39,8 @@ import java.util.Map.Entry; */ @SuppressWarnings("serial") public class Deck extends DeckBase implements Iterable> { - private final Map parts = new EnumMap(DeckSection.class); - private final Set tags = new TreeSet(String.CASE_INSENSITIVE_ORDER); + private final Map parts = new EnumMap<>(DeckSection.class); + private final Set tags = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); // Supports deferring loading a deck until we actually need its contents. This works in conjunction with // the lazy card load feature to ensure we don't need to load all cards on start up. private Map> deferredSections; diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index f0515c6494b..99bc2613fad 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -263,7 +263,7 @@ public enum DeckFormat { } } - final List erroneousCI = new ArrayList(); + final List erroneousCI = new ArrayList<>(); Set basicLandNames = new HashSet<>(); for (final Entry cp : deck.get(DeckSection.Main)) { @@ -306,7 +306,7 @@ public enum DeckFormat { } if (cardPoolFilter != null) { - final List erroneousCI = new ArrayList(); + final List erroneousCI = new ArrayList<>(); for (final Entry cp : deck.getAllCardsInASinglePool()) { if (!cardPoolFilter.apply(cp.getKey().getRules())) { erroneousCI.add(cp.getKey()); diff --git a/forge-core/src/main/java/forge/deck/DeckGroup.java b/forge-core/src/main/java/forge/deck/DeckGroup.java index 02b0368fa97..29a4961b5ce 100644 --- a/forge-core/src/main/java/forge/deck/DeckGroup.java +++ b/forge-core/src/main/java/forge/deck/DeckGroup.java @@ -37,7 +37,7 @@ public class DeckGroup extends DeckBase { private static final long serialVersionUID = -1628725522049635829L; private Deck humanDeck; - private List aiDecks = new ArrayList(); + private List aiDecks = new ArrayList<>(); /** * Gets the human deck. diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java index b319452123b..870c6472107 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java @@ -11,7 +11,7 @@ import forge.item.IPaperCard; import forge.item.PaperCard; public class DeckGenPool implements IDeckGenPool { - private final Map cards = new HashMap(); + private final Map cards = new HashMap<>(); public DeckGenPool() { } diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java index 050f1827e61..ec0b0c270ba 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java @@ -51,7 +51,7 @@ import java.util.regex.Pattern; */ public abstract class DeckGeneratorBase { protected final DebugTrace trace = new DebugTrace(); - protected final Map cardCounts = new HashMap(); + protected final Map cardCounts = new HashMap<>(); protected int maxDuplicates = 4; protected boolean useArtifacts = true; protected String basicLandEdition = null; @@ -299,7 +299,7 @@ public abstract class DeckGeneratorBase { protected static Map countLands(ItemPool outList) { // attempt to optimize basic land counts according // to color representation - Map res = new TreeMap(); + Map res = new TreeMap<>(); // count each card color using mana costs // TODO: count hybrid mana differently? for (Entry cpe : outList) { @@ -418,7 +418,7 @@ public abstract class DeckGeneratorBase { } public List regexLandSearch(String pattern, Iterable landCards){ - final List dLands = new ArrayList(); + final List dLands = new ArrayList<>(); Pattern p = Pattern.compile(pattern); for (PaperCard card:landCards){ if (card.getRules().getAiHints().getRemAIDecks()) { diff --git a/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java index 65a074e1cb7..43a7ffbd4a6 100644 --- a/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java +++ b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java @@ -74,7 +74,7 @@ public class DeckFileHeader { this.deckType = DeckFormat.smartValueOf(kvPairs.get(DeckFileHeader.DECK_TYPE), DeckFormat.Constructed); this.customPool = kvPairs.getBoolean(DeckFileHeader.CSTM_POOL); this.intendedForAi = "computer".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER)) || "ai".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER_TYPE)); - this.tags = new TreeSet(); + this.tags = new TreeSet<>(); String rawTags = kvPairs.get(DeckFileHeader.TAGS); if( StringUtils.isNotBlank(rawTags) ) { diff --git a/forge-core/src/main/java/forge/deck/io/DeckSerializer.java b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java index 1b50211c8cf..8b59c4e8dd2 100644 --- a/forge-core/src/main/java/forge/deck/io/DeckSerializer.java +++ b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java @@ -41,7 +41,7 @@ public class DeckSerializer { } private static List serializeDeck(Deck d) { - final List out = new ArrayList(); + final List out = new ArrayList<>(); out.add(TextUtil.enclosedBracket("metadata")); out.add(TextUtil.concatNoSpace(DeckFileHeader.NAME,"=", d.getName().replaceAll("\n", ""))); diff --git a/forge-core/src/main/java/forge/item/BoosterBox.java b/forge-core/src/main/java/forge/item/BoosterBox.java index b26824e498e..8b3c5e93f51 100644 --- a/forge-core/src/main/java/forge/item/BoosterBox.java +++ b/forge-core/src/main/java/forge/item/BoosterBox.java @@ -93,7 +93,7 @@ public class BoosterBox extends BoxedProduct { final String[] data = TextUtil.splitWithParenthesis(headAndData[1], ','); int nBoosters = 6; - List> slots = new ArrayList>(); + List> slots = new ArrayList<>(); for(String slotDesc : data) { String[] kv = TextUtil.split(slotDesc, ' ', 2); if (kv[1].startsWith("Booster")) diff --git a/forge-core/src/main/java/forge/item/BoxedProduct.java b/forge-core/src/main/java/forge/item/BoxedProduct.java index a73ee07f1e1..6bfdc48b438 100644 --- a/forge-core/src/main/java/forge/item/BoxedProduct.java +++ b/forge-core/src/main/java/forge/item/BoxedProduct.java @@ -44,7 +44,7 @@ public abstract class BoxedProduct extends SealedProduct { } public List getExtraCards() { - return new ArrayList(); + return new ArrayList<>(); } @Override diff --git a/forge-core/src/main/java/forge/item/FatPack.java b/forge-core/src/main/java/forge/item/FatPack.java index c45414c17bd..b57870b93a3 100644 --- a/forge-core/src/main/java/forge/item/FatPack.java +++ b/forge-core/src/main/java/forge/item/FatPack.java @@ -111,7 +111,7 @@ public class FatPack extends BoxedProduct { final String[] data = TextUtil.splitWithParenthesis(headAndData[1], ','); int nBoosters = 6; - List> slots = new ArrayList>(); + List> slots = new ArrayList<>(); for(String slotDesc : data) { String[] kv = TextUtil.split(slotDesc, ' ', 2); if (kv[1].startsWith("Booster")) diff --git a/forge-core/src/main/java/forge/util/Aggregates.java b/forge-core/src/main/java/forge/util/Aggregates.java index fb13b81400c..82fa8206d59 100644 --- a/forge-core/src/main/java/forge/util/Aggregates.java +++ b/forge-core/src/main/java/forge/util/Aggregates.java @@ -124,7 +124,7 @@ public class Aggregates { } public static final List random(final Iterable source, final int count) { - return random(source, count, new ArrayList()); + return random(source, count, new ArrayList<>()); } public static final > L random(final Iterable source, final int count, final L list) { // Using Reservoir Sampling to grab X random values from source @@ -163,7 +163,7 @@ public class Aggregates { } public static final Iterable uniqueByLast(final Iterable source, final Function fnUniqueKey) { // this might be exotic - final Map uniques = new Hashtable(); + final Map uniques = new Hashtable<>(); for (final U c : source) { uniques.put(fnUniqueKey.apply(c), c); } @@ -206,7 +206,7 @@ public class Aggregates { } public static Iterable> groupSumBy(Iterable> source, Function fnGetField) { - Map result = new HashMap(); + Map result = new HashMap<>(); for (Entry kv : source) { U k = fnGetField.apply(kv.getKey()); Integer v = kv.getValue(); diff --git a/forge-core/src/main/java/forge/util/FileSection.java b/forge-core/src/main/java/forge/util/FileSection.java index 1d67b4daeda..53a5f140d06 100644 --- a/forge-core/src/main/java/forge/util/FileSection.java +++ b/forge-core/src/main/java/forge/util/FileSection.java @@ -50,7 +50,7 @@ public class FileSection { * Instantiates a new file section. */ protected FileSection() { - this(new TreeMap(String.CASE_INSENSITIVE_ORDER)); + this(new TreeMap<>(String.CASE_INSENSITIVE_ORDER)); } protected FileSection(Map lines0) { @@ -71,7 +71,7 @@ public class FileSection { } public static Map parseToMap(final String line, final String kvSeparator, final String pairSeparator) { - Map result = new TreeMap(String.CASE_INSENSITIVE_ORDER); + Map result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); if (!StringUtils.isEmpty(line)) { final String[] pairs = line.split(Pattern.quote(pairSeparator)); final Pattern splitter = Pattern.compile(Pattern.quote(kvSeparator)); @@ -211,7 +211,7 @@ public class FileSection { */ @SuppressWarnings("unchecked") public static Map> parseSections(final List source) { - final Map> result = new TreeMap>(String.CASE_INSENSITIVE_ORDER); + final Map> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); String currentSection = ""; List currentList = null; @@ -234,7 +234,7 @@ public class FileSection { currentList = null; } else { if (currentList == null) { - currentList = new ArrayList(); + currentList = new ArrayList<>(); } currentList.add(st); } diff --git a/forge-core/src/main/java/forge/util/FileUtil.java b/forge-core/src/main/java/forge/util/FileUtil.java index 32eda08b4a2..212748744b1 100644 --- a/forge-core/src/main/java/forge/util/FileUtil.java +++ b/forge-core/src/main/java/forge/util/FileUtil.java @@ -196,7 +196,7 @@ public final class FileUtil { public static List readFile(final File file) { try { if ((file == null) || !file.exists()) { - return new ArrayList(); + return new ArrayList<>(); } return FileUtil.readAllLines(new FileReader(file), false); } catch (final Exception ex) { @@ -222,7 +222,7 @@ public final class FileUtil { * @return list of strings */ public static List readAllLines(final Reader reader, final boolean mayTrim) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); try { final BufferedReader in = new BufferedReader(reader); String line; @@ -244,7 +244,7 @@ public final class FileUtil { Pattern lineSplitter = Pattern.compile(Pattern.quote(" ")); Pattern replacer = Pattern.compile(Pattern.quote("%20")); - List> list = new ArrayList>(); + List> list = new ArrayList<>(); for (String line : readFile(nameUrlFile)) { if (StringUtils.isBlank(line) || line.startsWith("#")) { @@ -271,7 +271,7 @@ public final class FileUtil { } public static List readFile(final URL url) { - final List lines = new ArrayList(); + final List lines = new ArrayList<>(); ThreadUtil.executeWithTimeout(new Callable() { @Override public Void call() throws Exception { diff --git a/forge-core/src/main/java/forge/util/ItemPool.java b/forge-core/src/main/java/forge/util/ItemPool.java index 64ea51fbf2d..ed778df28f9 100644 --- a/forge-core/src/main/java/forge/util/ItemPool.java +++ b/forge-core/src/main/java/forge/util/ItemPool.java @@ -60,12 +60,12 @@ public class ItemPool implements Iterable cls) { - this(new LinkedHashMap(), cls); + this(new LinkedHashMap<>(), cls); } @SuppressWarnings("unchecked") public static ItemPool createFrom(final ItemPool from, final Class clsHint) { - final ItemPool result = new ItemPool(clsHint); + final ItemPool result = new ItemPool<>(clsHint); if (from != null) { for (final Entry e : from) { final Tin srcKey = e.getKey(); @@ -79,7 +79,7 @@ public class ItemPool implements Iterable ItemPool createFrom(final Iterable from, final Class clsHint) { - final ItemPool result = new ItemPool(clsHint); + final ItemPool result = new ItemPool<>(clsHint); if (from != null) { for (final Tin srcKey : from) { if (clsHint.isInstance(srcKey)) { @@ -95,7 +95,7 @@ public class ItemPool implements Iterable(); //prevent items being null + items = new HashMap<>(); //prevent items being null } myClass = cls; } @@ -161,7 +161,7 @@ public class ItemPool implements Iterable toFlatList() { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final Entry e : this) { for (int i = 0; i < e.getValue(); i++) { result.add(e.getKey()); @@ -171,7 +171,7 @@ public class ItemPool implements Iterable toNameLookup() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); for (final Entry e : this) { result.put(e.getKey().getName(), e.getValue()); } @@ -183,7 +183,7 @@ public class ItemPool implements Iterable getView() { - return new ItemPool(Collections.unmodifiableMap(items), getMyClass()); + return new ItemPool<>(Collections.unmodifiableMap(items), getMyClass()); } public void add(final T item) { diff --git a/forge-core/src/main/java/forge/util/ItemPoolSorter.java b/forge-core/src/main/java/forge/util/ItemPoolSorter.java index 1010abdb655..0b44e775a38 100644 --- a/forge-core/src/main/java/forge/util/ItemPoolSorter.java +++ b/forge-core/src/main/java/forge/util/ItemPoolSorter.java @@ -56,7 +56,7 @@ public class ItemPoolSorter implements Comparator> { } /** The Constant byNameThenSet. */ - public static final ItemPoolSorter BY_NAME_THEN_SET = new ItemPoolSorter( + public static final ItemPoolSorter BY_NAME_THEN_SET = new ItemPoolSorter<>( new Function, Comparable>() { @Override public Comparable apply(final Entry from) { diff --git a/forge-core/src/main/java/forge/util/NameGenerator.java b/forge-core/src/main/java/forge/util/NameGenerator.java index 6e7512ed844..625bbbc669d 100644 --- a/forge-core/src/main/java/forge/util/NameGenerator.java +++ b/forge-core/src/main/java/forge/util/NameGenerator.java @@ -195,7 +195,7 @@ public final class NameGenerator { "Coreshaker", "Forgewulf", "Sheepspear", "Elvenworm", "Lipswalker", "Sealight", "the Rotten" }; - private static List usedMonikers = new ArrayList(); + private static List usedMonikers = new ArrayList<>(); private static List usedNames; private static String[] sourceList; @@ -239,8 +239,8 @@ public final class NameGenerator { break; default: - List all = new ArrayList( - genericMales.length + fantasyMales.length + genericFemales.length + fantasyFemales.length); + List all = new ArrayList<>( + genericMales.length + fantasyMales.length + genericFemales.length + fantasyFemales.length); Collections.addAll(all, genericMales); Collections.addAll(all, fantasyMales); Collections.addAll(all, genericFemales); @@ -272,7 +272,7 @@ public final class NameGenerator { /** Generates a specified number of random names. */ public static List getRandomNames(final int generateAmount, final List excludeNames) { usedNames = excludeNames; - final List names = new ArrayList(generateAmount); + final List names = new ArrayList<>(generateAmount); for (int i = 0; i < generateAmount; i++) { getRandomName("Any", "Any", usedNames); } @@ -281,7 +281,7 @@ public final class NameGenerator { /** Generates a single name that doesn't match any names in the supplied list. */ public static String getRandomName(final String gender, final String type, final String notNamed) { - List exclude = new ArrayList(1); + List exclude = new ArrayList<>(1); exclude.add(notNamed); return getRandomName(gender, type, exclude); } diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index badf6d2533a..afb2683158c 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -71,7 +71,7 @@ public class TextUtil { * It's faster than String.split, and allows parenthesis */ public static String[] splitWithParenthesis(CharSequence input, char delimiter, int maxEntries, char openPar, char closePar, boolean skipEmpty) { - List result = new ArrayList(); + List result = new ArrayList<>(); // Assume that when equal non-zero parenthesis are passed, they need to be discarded boolean trimParenthesis = openPar == closePar && openPar > 0; int nPar = 0; diff --git a/forge-core/src/main/java/forge/util/collect/FCollection.java b/forge-core/src/main/java/forge/util/collect/FCollection.java index 7e8fef286fd..1438b4f802c 100644 --- a/forge-core/src/main/java/forge/util/collect/FCollection.java +++ b/forge-core/src/main/java/forge/util/collect/FCollection.java @@ -31,7 +31,7 @@ import java.util.Set; public class FCollection implements List, /*Set,*/ FCollectionView, Cloneable, Serializable { private static final long serialVersionUID = -1664555336364294106L; - private static final FCollection EMPTY = new EmptyFCollection(); + private static final FCollection EMPTY = new EmptyFCollection<>(); @SuppressWarnings("unchecked") public static FCollection getEmpty() { @@ -527,7 +527,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, @Override public Iterable threadSafeIterable() { //create a new linked list for iterating to make it thread safe and avoid concurrent modification exceptions - return Iterables.unmodifiableIterable(new LinkedList(list)); + return Iterables.unmodifiableIterable(new LinkedList<>(list)); } @Override diff --git a/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java b/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java index 360707b5236..d26165ecda1 100644 --- a/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java +++ b/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java @@ -6,7 +6,7 @@ public class LinkedHashMapToAmount extends LinkedHashMap implemen private static final long serialVersionUID = 1438913784333297606L; public static LinkedHashMapToAmount emptyMap() { - return new LinkedHashMapToAmount(0); + return new LinkedHashMapToAmount<>(0); } /** diff --git a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java index d793eded1a3..a0434aeab79 100644 --- a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java +++ b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java @@ -59,11 +59,11 @@ public final class MapToAmountUtil { throw new NullPointerException(); } if (map.isEmpty()) { - return new FCollection(); + return new FCollection<>(); } final int max = Collections.max(map.values()); - final FCollection set = new FCollection(); + final FCollection set = new FCollection<>(); for (final Entry entry : map.entrySet()) { if (entry.getValue().intValue() == max) { set.add(entry.getKey()); @@ -114,11 +114,11 @@ public final class MapToAmountUtil { throw new NullPointerException(); } if (map.isEmpty()) { - return new FCollection(); + return new FCollection<>(); } final int min = Collections.min(map.values()); - final FCollection set = new FCollection(); + final FCollection set = new FCollection<>(); for (final Entry entry : map.entrySet()) { if (entry.getValue().intValue() == min) { set.add(entry.getKey()); diff --git a/forge-core/src/main/java/forge/util/storage/StorageBase.java b/forge-core/src/main/java/forge/util/storage/StorageBase.java index 2c0c959fe20..b3ce9fad954 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageBase.java +++ b/forge-core/src/main/java/forge/util/storage/StorageBase.java @@ -35,7 +35,7 @@ import java.util.*; public class StorageBase implements IStorage { protected final Map map; - public final static StorageBase emptyMap = new StorageBase("Empty", null, new HashMap()); + public final static StorageBase emptyMap = new StorageBase<>("Empty", null, new HashMap<>()); public final String name, fullPath; public StorageBase(final String name0, final IItemReader io) { @@ -55,7 +55,7 @@ public class StorageBase implements IStorage { @Override public final Collection getItemNames() { - return new ArrayList(map.keySet()); + return new ArrayList<>(map.keySet()); } @Override diff --git a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java index 52a54c56d5d..e68658cbece 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java +++ b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java @@ -39,7 +39,7 @@ public class StorageImmediatelySerialized extends StorageBase { private final Function> nestedFactory = new Function>() { @Override public IStorage apply(File file) { - return new StorageImmediatelySerialized(file.getName(), (IItemSerializer) serializer.getReaderForFolder(file), true); + return new StorageImmediatelySerialized<>(file.getName(), (IItemSerializer) serializer.getReaderForFolder(file), true); } }; @@ -57,7 +57,7 @@ public class StorageImmediatelySerialized extends StorageBase { public StorageImmediatelySerialized(String name, final IItemSerializer io, boolean withSubFolders) { super(name, io); this.serializer = io; - subfolders = withSubFolders ? new StorageNestedFolders(io.getDirectory(), io.getSubFolders(), nestedFactory) : null; + subfolders = withSubFolders ? new StorageNestedFolders<>(io.getDirectory(), io.getSubFolders(), nestedFactory) : null; } /* diff --git a/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java b/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java index 269338e77f9..ddd83d49c1d 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java +++ b/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java @@ -9,7 +9,7 @@ public class StorageNestedFolders extends StorageBase> { private final File thisFolder; public StorageNestedFolders(File thisFolder, Iterable subfolders, Function> factory) { - super("", thisFolder.getPath(), new HashMap>()); + super("", thisFolder.getPath(), new HashMap<>()); this.thisFolder = thisFolder; for (File sf : subfolders) { IStorage newUnit = factory.apply(sf); diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java index 01b5f3f735f..61cb21c73a9 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java @@ -52,7 +52,7 @@ public abstract class StorageReaderFile extends StorageReaderBase { @Override public Map readAll() { - final Map result = new TreeMap(); + final Map result = new TreeMap<>(); int idx = 0; for (String line : FileUtil.readFile(file)) { diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java index eb599f579d5..c3c2773ad9f 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java @@ -53,7 +53,7 @@ public abstract class StorageReaderFileSections extends StorageReaderBase } protected Map createMap() { - return new TreeMap(); + return new TreeMap<>(); } /* (non-Javadoc) @@ -66,7 +66,7 @@ public abstract class StorageReaderFileSections extends StorageReaderBase int idx = 0; Iterable contents = FileUtil.readFile(file); - List accumulator = new ArrayList(); + List accumulator = new ArrayList<>(); String header = null; for (final String s : contents) { diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java index f7c35bacbbb..2fa2ea9fa63 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java @@ -75,14 +75,14 @@ public abstract class StorageReaderFolder extends StorageReaderBase { } } - public final List objectsThatFailedToLoad = new ArrayList(); + public final List objectsThatFailedToLoad = new ArrayList<>(); /* (non-Javadoc) * @see forge.util.IItemReader#readAll() */ @Override public Map readAll() { - final Map result = new TreeMap(); + final Map result = new TreeMap<>(); final File[] files = this.directory.listFiles(this.getFileFilter()); for (final File file : files) { diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java b/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java index fba09b57f74..5b81bfa5f2b 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java @@ -77,14 +77,14 @@ public abstract class StorageReaderRecursiveFolderWithUserFolder extends Stor } } - public final List objectsThatFailedToLoad = new ArrayList(); + public final List objectsThatFailedToLoad = new ArrayList<>(); /* (non-Javadoc) * @see forge.util.IItemReader#readAll() */ @Override public Map readAll() { - final Map result = new TreeMap(); + final Map result = new TreeMap<>(); Collection forgeFormats = listFileTree(directory); Collection customFormats = listFileTree(userDirectory); @@ -115,7 +115,7 @@ public abstract class StorageReaderRecursiveFolderWithUserFolder extends Stor } private Collection listFileTree(File dir) { - Set fileTree = new HashSet(); + Set fileTree = new HashSet<>(); if(dir==null||dir.listFiles(getFileFilter())==null){ return fileTree; } diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index da8d612fed7..6f2d66ffc95 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -713,7 +713,7 @@ public class Game { ingamePlayers.remove(p); lostPlayers.add(p); - final Map runParams = new TreeMap(); + final Map runParams = new TreeMap<>(); runParams.put("Player", p); getTriggerHandler().runTrigger(TriggerType.LosesGame, runParams, false); } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 89c790b3374..3346938c8fe 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -787,7 +787,7 @@ public class GameAction { } // search for cards with static abilities - final FCollection staticAbilities = new FCollection(); + final FCollection staticAbilities = new FCollection<>(); final CardCollection staticList = new CardCollection(); game.forEachCardInGame(new Visitor() { @@ -880,6 +880,10 @@ public class GameAction { c.getStaticCommandList().removeAll(toRemove); } // Exclude cards in hidden zones from update + /* + * Refactoring this code to affectedCards.removeIf((Card c) -> c.isInZone(ZoneType.Library)); + * causes Android build not to compile + * */ Iterator it = affectedCards.iterator(); while (it.hasNext()) { Card c = it.next(); diff --git a/forge-game/src/main/java/forge/game/GameEntityCache.java b/forge-game/src/main/java/forge/game/GameEntityCache.java index f61505bbf69..b5532f2bf96 100644 --- a/forge-game/src/main/java/forge/game/GameEntityCache.java +++ b/forge-game/src/main/java/forge/game/GameEntityCache.java @@ -8,7 +8,7 @@ import java.util.List; import forge.trackable.TrackableObject; public class GameEntityCache { - private HashMap entityCache = new HashMap(); + private HashMap entityCache = new HashMap<>(); public void put(Integer id, Entity entity) { entityCache.put(id, entity); @@ -33,7 +33,7 @@ public class GameEntityCache getList(Iterable views) { - List list = new ArrayList(); + List list = new ArrayList<>(); addToList(views, list); return list; } diff --git a/forge-game/src/main/java/forge/game/GameEntityView.java b/forge-game/src/main/java/forge/game/GameEntityView.java index 0e769a8cf56..0349b4c8e54 100644 --- a/forge-game/src/main/java/forge/game/GameEntityView.java +++ b/forge-game/src/main/java/forge/game/GameEntityView.java @@ -17,7 +17,7 @@ public abstract class GameEntityView extends TrackableObject { if (entities == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (GameEntity e : entities) { collection.add(e.getView()); } diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index d0a6f0ce29a..5afed3b31b3 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -101,14 +101,14 @@ public class GameFormat implements Comparable { } allowedSetCodes = Lists.newArrayList(parsedSets); }else{ - allowedSetCodes = new ArrayList(); + allowedSetCodes = new ArrayList<>(); } - bannedCardNames = bannedCards == null ? new ArrayList() : Lists.newArrayList(bannedCards); - restrictedCardNames = restrictedCards == null ? new ArrayList() : Lists.newArrayList(restrictedCards); - allowedRarities = rarities == null ? new ArrayList() : rarities; + bannedCardNames = bannedCards == null ? new ArrayList<>() : Lists.newArrayList(bannedCards); + restrictedCardNames = restrictedCards == null ? new ArrayList<>() : Lists.newArrayList(restrictedCards); + allowedRarities = rarities == null ? new ArrayList<>() : rarities; this.restrictedLegendary = restrictedLegendary; - additionalCardNames = additionalCards == null ? new ArrayList() : Lists.newArrayList(additionalCards); + additionalCardNames = additionalCards == null ? new ArrayList<>() : Lists.newArrayList(additionalCards); this.allowedSetCodes_ro = Collections.unmodifiableList(allowedSetCodes); this.bannedCardNames_ro = Collections.unmodifiableList(bannedCardNames); @@ -195,7 +195,7 @@ public class GameFormat implements Comparable { } public List getAllCards() { - List cards = new ArrayList(); + List cards = new ArrayList<>(); CardDb commonCards = StaticData.instance().getCommonCards(); for (String setCode : allowedSetCodes_ro) { CardEdition edition = StaticData.instance().getEditions().get(setCode); @@ -285,7 +285,7 @@ public class GameFormat implements Comparable { } public static class Reader extends StorageReaderRecursiveFolderWithUserFolder { - List naturallyOrdered = new ArrayList(); + List naturallyOrdered = new ArrayList<>(); boolean includeHistoric; private List coreFormats = new ArrayList<>(); { @@ -484,7 +484,7 @@ public class GameFormat implements Comparable { } public Set getAllFormatsOfCard(PaperCard card) { - Set result = new HashSet(); + Set result = new HashSet<>(); for (GameFormat gf : naturallyOrdered) { if (gf.getFilterRules().apply(card)) { result.add(gf); @@ -501,7 +501,7 @@ public class GameFormat implements Comparable { } public Set getAllFormatsOfDeck(Deck deck, Boolean exhaustive) { - SortedSet result = new TreeSet(); + SortedSet result = new TreeSet<>(); Set coveredTypes = new HashSet<>(); CardPool allCards = deck.getAllCardsInASinglePool(); for(GameFormat gf : reverseDateOrdered) { diff --git a/forge-game/src/main/java/forge/game/GameLog.java b/forge-game/src/main/java/forge/game/GameLog.java index 979e2880330..8fca317132b 100644 --- a/forge-game/src/main/java/forge/game/GameLog.java +++ b/forge-game/src/main/java/forge/game/GameLog.java @@ -34,7 +34,7 @@ import java.util.Observable; public class GameLog extends Observable implements Serializable { private static final long serialVersionUID = 6465283802022948827L; - private final List log = new ArrayList(); + private final List log = new ArrayList<>(); private final transient GameLogFormatter formatter = new GameLogFormatter(this); @@ -70,7 +70,7 @@ public class GameLog extends Observable implements Serializable { * @return the log text */ public List getLogEntries(final GameLogEntryType logLevel) { // null to fetch all - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (int i = log.size() - 1; i >= 0; i--) { GameLogEntry le = log.get(i); @@ -82,7 +82,7 @@ public class GameLog extends Observable implements Serializable { } public List getLogEntriesExact(final GameLogEntryType logLevel) { // null to fetch all - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (int i = log.size() - 1; i >= 0; i--) { GameLogEntry le = log.get(i); diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index dbaa656ff5e..520d39d33f4 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -130,7 +130,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { private static GameLogEntry generateSummary(final List gamesPlayed) { final GameOutcome outcome1 = gamesPlayed.get(0); final HashMap players = outcome1.getPlayerNames(); - final HashMap winCount = new HashMap(); + final HashMap winCount = new HashMap<>(); // Calculate total games each player has won. for (final GameOutcome game : gamesPlayed) { diff --git a/forge-game/src/main/java/forge/game/GameObjectMap.java b/forge-game/src/main/java/forge/game/GameObjectMap.java index f94953a0462..b98c8d790fe 100644 --- a/forge-game/src/main/java/forge/game/GameObjectMap.java +++ b/forge-game/src/main/java/forge/game/GameObjectMap.java @@ -36,7 +36,7 @@ public abstract class GameObjectMap { @SuppressWarnings("unchecked") public List mapList(final List objects) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final T o : objects) { result.add((T) map(o)); } diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java index c716709122b..d5ad5316568 100644 --- a/forge-game/src/main/java/forge/game/Match.java +++ b/forge-game/src/main/java/forge/game/Match.java @@ -28,7 +28,7 @@ public class Match { private final GameRules rules; private final String title; - private final List gamesPlayed = new ArrayList(); + private final List gamesPlayed = new ArrayList<>(); private final List gamesPlayedRo; public Match(final GameRules rules0, final List players0, final String title) { @@ -171,7 +171,7 @@ public class Match { private static Set getRemovedAnteCards(Deck toUse) { final String keywordToRemove = "Remove CARDNAME from your deck before playing if you're not playing for ante."; - Set myRemovedAnteCards = new HashSet(); + Set myRemovedAnteCards = new HashSet<>(); for (Entry ds : toUse) { for (Entry cp : ds.getValue()) { if (Iterables.contains(cp.getKey().getRules().getMainPart().getKeywords(), keywordToRemove)) { @@ -184,7 +184,7 @@ public class Match { private static void preparePlayerLibrary(Player player, final ZoneType zoneType, CardPool section, boolean canRandomFoil) { PlayerZone library = player.getZone(zoneType); - List newLibrary = new ArrayList(); + List newLibrary = new ArrayList<>(); for (final Entry stackOfCards : section) { final PaperCard cp = stackOfCards.getKey(); for (int i = 0; i < stackOfCards.getValue(); i++) { @@ -304,7 +304,7 @@ public class Match { GameOutcome outcome = lastGame.getOutcome(); // remove all the lost cards from owners' decks - List losses = new ArrayList(); + List losses = new ArrayList<>(); int cntPlayers = players.size(); int iWinner = -1; for (int i = 0; i < cntPlayers; i++) { diff --git a/forge-game/src/main/java/forge/game/PlanarDice.java b/forge-game/src/main/java/forge/game/PlanarDice.java index 34d826b3494..bdf3b292ed0 100644 --- a/forge-game/src/main/java/forge/game/PlanarDice.java +++ b/forge-game/src/main/java/forge/game/PlanarDice.java @@ -36,7 +36,7 @@ public enum PlanarDice { trigRes = Chaos; } - HashMap runParams = new HashMap(); + HashMap runParams = new HashMap<>(); runParams.put("Player", roller); runParams.put("Result", trigRes); roller.getGame().getTriggerHandler().runTrigger(TriggerType.PlanarDice, runParams,false); diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index 1d2d7b73151..31fe957de37 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -166,7 +166,7 @@ public class StaticEffect { */ public final void addOriginalAbilities(final Card c, final SpellAbility sa) { if (!this.originalAbilities.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(sa); this.originalAbilities.put(c, list); } else { @@ -185,7 +185,7 @@ public class StaticEffect { * a {@link java.util.List} object. */ public final void addOriginalAbilities(final Card c, final List s) { - final List list = new ArrayList(s); + final List list = new ArrayList<>(s); if (!this.originalAbilities.containsKey(c)) { this.originalAbilities.put(c, list); } else { @@ -204,7 +204,7 @@ public class StaticEffect { * @return a {@link java.util.List} object. */ public final List getOriginalAbilities(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.originalAbilities.containsKey(c)) { returnList.addAll(this.originalAbilities.get(c)); } @@ -271,7 +271,7 @@ public class StaticEffect { */ public final void addOriginalKeyword(final Card c, final String s) { if (!this.originalKeywords.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(s); this.originalKeywords.put(c, list); } else { @@ -290,7 +290,7 @@ public class StaticEffect { * a {@link List} object. */ public final void addOriginalKeywords(final Card c, final List s) { - final List list = new ArrayList(s); + final List list = new ArrayList<>(s); if (!this.originalKeywords.containsKey(c)) { this.originalKeywords.put(c, list); } else { @@ -309,7 +309,7 @@ public class StaticEffect { * @return a {@link List} object. */ public final List getOriginalKeywords(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.originalKeywords.containsKey(c)) { returnList.addAll(this.originalKeywords.get(c)); } @@ -424,7 +424,7 @@ public class StaticEffect { */ public final void addOriginalType(final Card c, final String s) { if (!this.originalTypes.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(s); this.originalTypes.put(c, list); } else { @@ -443,7 +443,7 @@ public class StaticEffect { * a {@link java.util.ArrayList} object. */ public final void addOriginalTypes(final Card c, final List s) { - final List list = new ArrayList(s); + final List list = new ArrayList<>(s); if (!this.originalTypes.containsKey(c)) { this.originalTypes.put(c, list); } else { @@ -462,7 +462,7 @@ public class StaticEffect { * @return a {@link java.util.ArrayList} object. */ public final List getOriginalTypes(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.originalTypes.containsKey(c)) { returnList.addAll(this.originalTypes.get(c)); } @@ -505,7 +505,7 @@ public class StaticEffect { */ public final void addType(final Card c, final String s) { if (!this.types.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(s); this.types.put(c, list); } else { @@ -523,7 +523,7 @@ public class StaticEffect { * @return a {@link java.util.List} object. */ public final List getTypes(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.types.containsKey(c)) { returnList.addAll(this.types.get(c)); } @@ -823,7 +823,7 @@ public class StaticEffect { if (colors.equals("ChosenColor")) { addColors = CardUtil.getShortColorsString(getSource().getChosenColors()); } else { - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(" & ")))); + addColors = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(" & ")))); } } @@ -832,7 +832,7 @@ public class StaticEffect { if (colors.equals("ChosenColor")) { addColors = CardUtil.getShortColorsString(getSource().getChosenColors()); } else { - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(" & ")))); + addColors = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(" & ")))); } } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 399515f6755..e4cb884ad78 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -432,7 +432,7 @@ public class AbilityUtils { val = CardFactoryUtil.doXMath(AbilityUtils.calculateAmount(card, l[0], ability), m, card); } else if (calcX[0].startsWith("PlayerCount")) { final String hType = calcX[0].substring(11); - final FCollection players = new FCollection(); + final FCollection players = new FCollection<>(); if (hType.equals("Players") || hType.equals("")) { players.addAll(game.getPlayers()); val = CardFactoryUtil.playerXCount(players, calcX[1], card); @@ -577,7 +577,7 @@ public class AbilityUtils { // Player attribute counting if (calcX[0].startsWith("TargetedPlayer")) { - final List players = new ArrayList(); + final List players = new ArrayList<>(); final SpellAbility saTargeting = sa.getSATargetingPlayer(); if (null != saTargeting) { Iterables.addAll(players, saTargeting.getTargets().getTargetPlayers()); @@ -585,12 +585,12 @@ public class AbilityUtils { return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } if (calcX[0].startsWith("ThisTargetedPlayer")) { - final List players = new ArrayList(); + final List players = new ArrayList<>(); Iterables.addAll(players, sa.getTargets().getTargetPlayers()); return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } if (calcX[0].startsWith("TargetedObjects")) { - final List objects = new ArrayList(); + final List objects = new ArrayList<>(); // Make list of all targeted objects starting with the root SpellAbility SpellAbility loopSA = sa.getRootAbility(); while (loopSA != null) { @@ -602,7 +602,7 @@ public class AbilityUtils { return CardFactoryUtil.objectXCount(objects, calcX[1], card) * multiplier; } if (calcX[0].startsWith("TargetedController")) { - final List players = new ArrayList(); + final List players = new ArrayList<>(); final CardCollection list = getDefinedCards(card, "Targeted", sa); final List sas = AbilityUtils.getDefinedSpellAbilities(card, "Targeted", sa); @@ -641,7 +641,7 @@ public class AbilityUtils { if (calcX[0].startsWith("TriggeredPlayers")) { key = "Triggered" + key.substring(16); } - final List players = new ArrayList(); + final List players = new ArrayList<>(); Iterables.addAll(players, getDefinedPlayers(card, key, sa)); return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } @@ -751,7 +751,7 @@ public class AbilityUtils { * @return a {@link java.util.ArrayList} object. */ public static FCollection getDefinedObjects(final Card card, final String def, final SpellAbility sa) { - final FCollection objects = new FCollection(); + final FCollection objects = new FCollection<>(); final String defined = (def == null) ? "Self" : def; objects.addAll(AbilityUtils.getDefinedPlayers(card, defined, sa)); @@ -1223,7 +1223,7 @@ public class AbilityUtils { */ public static FCollection getDefinedSpellAbilities(final Card card, final String def, final SpellAbility sa) { - final FCollection sas = new FCollection(); + final FCollection sas = new FCollection<>(); final String defined = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self final Game game = card.getGame(); @@ -1690,7 +1690,7 @@ public class AbilityUtils { } public static final List getBasicSpellsFromPlayEffect(final Card tgtCard, final Player controller) { - List sas = new ArrayList(); + List sas = new ArrayList<>(); for (SpellAbility s : tgtCard.getBasicSpells()) { final Spell newSA = (Spell) s.copy(); newSA.setActivatingPlayer(controller); diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index a0d4e8b10b4..831141a7b0b 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -186,7 +186,7 @@ public abstract class SpellAbilityEffect { private static FCollection getPlayers(final boolean definedFirst, final String definedParam, final SpellAbility sa) { final boolean useTargets = sa.usesTargeting() && (!definedFirst || !sa.hasParam(definedParam)); - return useTargets ? new FCollection(sa.getTargets().getTargetPlayers()) + return useTargets ? new FCollection<>(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam(definedParam), sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java index 0f3219c7e55..623a727ed55 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java @@ -71,17 +71,17 @@ public class AnimateAllEffect extends AnimateEffectBase { types.add(host.getChosenType()); } - final List keywords = new ArrayList(); + final List keywords = new ArrayList<>(); if (sa.hasParam("Keywords")) { keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & "))); } - final List removeKeywords = new ArrayList(); + final List removeKeywords = new ArrayList<>(); if (sa.hasParam("RemoveKeywords")) { removeKeywords.addAll(Arrays.asList(sa.getParam("RemoveKeywords").split(" & "))); } - final List hiddenKeywords = new ArrayList(); + final List hiddenKeywords = new ArrayList<>(); if (sa.hasParam("HiddenKeywords")) { hiddenKeywords.addAll(Arrays.asList(sa.getParam("HiddenKeywords").split(" & "))); } @@ -101,29 +101,29 @@ public class AnimateAllEffect extends AnimateEffectBase { if (colors.equals("ChosenColor")) { tmpDesc = CardUtil.getShortColorsString(host.getChosenColors()); } else { - tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(",")))); + tmpDesc = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(",")))); } } final String finalDesc = tmpDesc; // abilities to add to the animated being - final List abilities = new ArrayList(); + final List abilities = new ArrayList<>(); if (sa.hasParam("Abilities")) { abilities.addAll(Arrays.asList(sa.getParam("Abilities").split(","))); } // replacement effects to add to the animated being - final List replacements = new ArrayList(); + final List replacements = new ArrayList<>(); if (sa.hasParam("Replacements")) { replacements.addAll(Arrays.asList(sa.getParam("Replacements").split(","))); } // triggers to add to the animated being - final List triggers = new ArrayList(); + final List triggers = new ArrayList<>(); if (sa.hasParam("Triggers")) { triggers.addAll(Arrays.asList(sa.getParam("Triggers").split(","))); } // sVars to add to the animated being - final List sVars = new ArrayList(); + final List sVars = new ArrayList<>(); if (sa.hasParam("sVars")) { sVars.addAll(Arrays.asList(sa.getParam("sVars").split(","))); } @@ -154,7 +154,7 @@ public class AnimateAllEffect extends AnimateEffectBase { keywords, removeKeywords, hiddenKeywords, timestamp); // give abilities - final List addedAbilities = new ArrayList(); + final List addedAbilities = new ArrayList<>(); if (abilities.size() > 0) { for (final String s : abilities) { final String actualAbility = host.getSVar(s); @@ -165,7 +165,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // remove abilities - final List removedAbilities = new ArrayList(); + final List removedAbilities = new ArrayList<>(); if (sa.hasParam("OverwriteAbilities") || removeAll || removeIntrinsic) { for (final SpellAbility ab : c.getSpellAbilities()) { if (ab.isAbility()) { @@ -178,7 +178,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } } // give replacement effects - final List addedReplacements = new ArrayList(); + final List addedReplacements = new ArrayList<>(); if (replacements.size() > 0) { for (final String s : replacements) { final String actualReplacement = host.getSVar(s); @@ -187,7 +187,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } } // Grant triggers - final List addedTriggers = new ArrayList(); + final List addedTriggers = new ArrayList<>(); if (triggers.size() > 0) { for (final String s : triggers) { final String actualTrigger = host.getSVar(s); @@ -197,7 +197,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // suppress triggers from the animated card - final List removedTriggers = new ArrayList(); + final List removedTriggers = new ArrayList<>(); if (sa.hasParam("OverwriteTriggers") || removeAll || removeIntrinsic) { final FCollectionView triggersToRemove = c.getTriggers(); for (final Trigger trigger : triggersToRemove) { @@ -210,7 +210,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // suppress static abilities from the animated card - final List removedStatics = new ArrayList(); + final List removedStatics = new ArrayList<>(); if (sa.hasParam("OverwriteStatics") || removeAll || removeIntrinsic) { for (final StaticAbility stAb : c.getStaticAbilities()) { if (removeIntrinsic && !stAb.isIntrinsic()) { @@ -222,7 +222,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // suppress static abilities from the animated card - final List removedReplacements = new ArrayList(); + final List removedReplacements = new ArrayList<>(); if (sa.hasParam("OverwriteReplacements") || removeAll || removeIntrinsic) { for (final ReplacementEffect re : c.getReplacementEffects()) { if (removeIntrinsic && !re.isIntrinsic()) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 44643d555d2..3e1b4f5e11d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -166,7 +166,7 @@ public class AttachEffect extends SpellAbilityEffect { Player p = source.getController(); if (tgt.canTgtPlayer()) { - final FCollection players = new FCollection(); + final FCollection players = new FCollection<>(); for (Player player : game.getPlayers()) { if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source, null)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java index 27821b41b89..311fd3ae2a0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java @@ -34,7 +34,7 @@ public class BalanceEffect extends SpellAbilityEffect { int min = Integer.MAX_VALUE; final FCollectionView players = game.getPlayersInTurnOrder(); - final List validCards = new ArrayList(players.size()); + final List validCards = new ArrayList<>(players.size()); for(int i = 0; i < players.size(); i++) { // Find the minimum of each Valid per player diff --git a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java index 0ea798f50e9..36026b174dc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java @@ -22,7 +22,7 @@ public class BidLifeEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); final Player activator = sa.getActivatingPlayer(); - final FCollection bidPlayers = new FCollection(); + final FCollection bidPlayers = new FCollection<>(); final int startBidding; if (sa.hasParam("StartBidding")) { String start = sa.getParam("StartBidding"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java index 5160b929da7..3ec32f0532e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java @@ -22,7 +22,7 @@ public class BlockEffect extends SpellAbilityEffect { final Game game = host.getGame(); final Combat combat = game.getPhaseHandler().getCombat(); - List attackers = new ArrayList(); + List attackers = new ArrayList<>(); if (sa.hasParam("DefinedAttacker")) { for (final Card attacker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa)) { if (combat.isAttacking(attacker)) @@ -30,7 +30,7 @@ public class BlockEffect extends SpellAbilityEffect { } } - List blockers = new ArrayList(); + List blockers = new ArrayList<>(); if (sa.hasParam("DefinedBlocker")) { for (final Card blocker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedBlocker"), sa)) { if (blocker.isCreature() && blocker.isInZone(ZoneType.Battlefield)) @@ -90,14 +90,14 @@ public class BlockEffect extends SpellAbilityEffect { // end standard pre- - List attackers = new ArrayList(); + List attackers = new ArrayList<>(); if (sa.hasParam("DefinedAttacker")) { for (final Card attacker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa)) { attackers.add(attacker.toString()); } } - List blockers = new ArrayList(); + List blockers = new ArrayList<>(); if (sa.hasParam("DefinedBlocker")) { for (final Card blocker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedBlocker"), sa)) { blockers.add(blocker.toString()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 8cbf3f0ba5b..8f8baaaaa00 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -641,7 +641,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // for things like Gaea's Blessing if (destination.equals(ZoneType.Library) && sa.hasParam("Shuffle") && "True".equals(sa.getParam("Shuffle"))) { - FCollection pl = new FCollection(); + FCollection pl = new FCollection<>(); // use defined controller. it does need to work even without Targets. if (sa.hasParam("TargetsWithDefinedController")) { pl.addAll(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("TargetsWithDefinedController"), sa)); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java index 7407314dff0..7b7a0f2740c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java @@ -34,7 +34,7 @@ public class ChooseColorEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); - List colorChoices = new ArrayList(MagicColor.Constant.ONLY_COLORS); + List colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); if (sa.hasParam("Choices")) { String[] restrictedChoices = sa.getParam("Choices").split(","); colorChoices = Arrays.asList(restrictedChoices); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java index b2bf0f36a9c..3c0dac6f8a1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java @@ -16,7 +16,7 @@ public class ChooseDirectionEffect extends SpellAbilityEffect { public void resolve(final SpellAbility sa) { final Card source = sa.getHostCard(); final Game game = source.getGame(); - final FCollection left = new FCollection(game.getPlayers()); + final FCollection left = new FCollection<>(game.getPlayers()); // TODO: We'd better set up turn order UI here final String info = "Left (clockwise): " + left + "\r\nRight (anticlockwise):" + Lists.reverse(left); sa.getActivatingPlayer().getController().notifyOfValue(sa, source, info); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java index 731cfcc5426..36ac0d24e5c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java @@ -29,9 +29,9 @@ public class ChooseTypeEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); final String type = sa.getParam("Type"); - final List invalidTypes = sa.hasParam("InvalidTypes") ? Arrays.asList(sa.getParam("InvalidTypes").split(",")) : new ArrayList(); + final List invalidTypes = sa.hasParam("InvalidTypes") ? Arrays.asList(sa.getParam("InvalidTypes").split(",")) : new ArrayList<>(); - final List validTypes = new ArrayList(); + final List validTypes = new ArrayList<>(); if (sa.hasParam("ValidTypes")) { validTypes.addAll(Arrays.asList(sa.getParam("ValidTypes").split(","))); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java index 930f2b28477..55d43b0c51e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java @@ -32,7 +32,7 @@ public class ClashEffect extends SpellAbilityEffect { final boolean victory = clashWithOpponent(sa); // Run triggers - final HashMap runParams = new HashMap(); + final HashMap runParams = new HashMap<>(); runParams.put("Player", sa.getHostCard().getController()); if (victory) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java index 5976bfe7173..0e2ea5a6ce6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java @@ -22,7 +22,7 @@ public class ControlExchangeEffect extends SpellAbilityEffect { Card object1 = null; Card object2 = null; final TargetRestrictions tgt = sa.getTargetRestrictions(); - List tgts = tgt == null ? new ArrayList() : Lists.newArrayList(sa.getTargets().getTargetCards()); + List tgts = tgt == null ? new ArrayList<>() : Lists.newArrayList(sa.getTargets().getTargetCards()); if (tgts.size() > 0) { object1 = tgts.get(0); } @@ -47,7 +47,7 @@ public class ControlExchangeEffect extends SpellAbilityEffect { Card object1 = null; Card object2 = null; final TargetRestrictions tgt = sa.getTargetRestrictions(); - List tgts = tgt == null ? new ArrayList() : Lists.newArrayList(sa.getTargets().getTargetCards()); + List tgts = tgt == null ? new ArrayList<>() : Lists.newArrayList(sa.getTargets().getTargetCards()); if (tgts.size() > 0) { object1 = tgts.get(0); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index fcb79639e2b..a1db15665f8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -78,7 +78,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { } boolean mayChooseNewTargets = true; - List copies = new ArrayList(); + List copies = new ArrayList<>(); if (sa.hasParam("CopyMultipleSpells")) { final int spellCount = Integer.parseInt(sa.getParam("CopyMultipleSpells")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java index 4c35db52d4d..fb2df2a405a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java @@ -69,7 +69,7 @@ public class DamagePreventEffect extends SpellAbilityEffect { int numDam = AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa); final List tgts = getTargets(sa); - final List untargetedCards = new ArrayList(); + final List untargetedCards = new ArrayList<>(); if (sa.hasParam("Radiance") && (sa.usesTargeting())) { Card origin = null; @@ -96,12 +96,12 @@ public class DamagePreventEffect extends SpellAbilityEffect { final Card c = (Card) o; if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) { if (preventionWithEffect) { - Map effectMap = new TreeMap(); + Map effectMap = new TreeMap<>(); effectMap.put("EffectString", sa.getSVar(sa.getParam("PreventionSubAbility"))); effectMap.put("ShieldAmount", String.valueOf(numDam)); if (sa.hasParam("ShieldEffectTarget")) { String effTgtString = ""; - List effTgts = new ArrayList(); + List effTgts = new ArrayList<>(); effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa); for (final Object effTgt : effTgts) { if (effTgt instanceof Card) { @@ -123,12 +123,12 @@ public class DamagePreventEffect extends SpellAbilityEffect { final Player p = (Player) o; if (!targeted || p.canBeTargetedBy(sa)) { if (preventionWithEffect) { - Map effectMap = new TreeMap(); + Map effectMap = new TreeMap<>(); effectMap.put("EffectString", sa.getSVar(sa.getParam("PreventionSubAbility"))); effectMap.put("ShieldAmount", String.valueOf(numDam)); if (sa.hasParam("ShieldEffectTarget")) { String effTgtString = ""; - List effTgts = new ArrayList(); + List effTgts = new ArrayList<>(); effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa); for (final Object effTgt : effTgts) { if (effTgt instanceof Card) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index f3e66bad91b..7c654e8689d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -264,7 +264,7 @@ public class DigEffect extends SpellAbilityEffect { if ( p == chooser ) { // the digger can still see all the dug cards when choosing chooser.getController().tempShowCards(top); } - List chosen = new ArrayList(); + List chosen = new ArrayList<>(); int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); int min = (anyNumber || optional) ? 0 : max; diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index ac5bd969092..4218d8897f7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -108,7 +108,7 @@ public class DiscardEffect extends SpellAbilityEffect { final Game game = source.getGame(); //final boolean anyNumber = sa.hasParam("AnyNumber"); - final List discarded = new ArrayList(); + final List discarded = new ArrayList<>(); final List targets = getTargetPlayers(sa), discarders; Player firstTarget = null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java index 20353da8342..873a8fab135 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java @@ -27,7 +27,7 @@ public class DrainManaEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - List drained = new ArrayList(); + List drained = new ArrayList<>(); for (final Player p : getTargetPlayers(sa)) { if ((tgt == null) || p.canBeTargetedBy(sa)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java index 984f76b5ab4..5224b7792a6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java @@ -19,7 +19,7 @@ public class LifeSetEffect extends SpellAbilityEffect { final boolean redistribute = sa.hasParam("Redistribute"); final int lifeAmount = redistribute ? 20 : AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); final TargetRestrictions tgt = sa.getTargetRestrictions(); - final List lifetotals = new ArrayList(); + final List lifetotals = new ArrayList<>(); if (redistribute) { for (final Player p : getTargetPlayers(sa)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java index f48ca1824c9..504d17ba0b1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java @@ -23,7 +23,7 @@ public class MustBlockEffect extends SpellAbilityEffect { if (sa.hasParam("DefinedAttacker")) { cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa); } else { - cards = new ArrayList(); + cards = new ArrayList<>(); cards.add(host); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 38dceefcb16..4056b367799 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -97,7 +97,7 @@ public class PlayEffect extends SpellAbilityEffect { cards = Lists.newArrayList(Iterables.filter(cards, cpp)); } if (sa.hasParam("RandomCopied")) { - final List copysource = new ArrayList(cards); + final List copysource = new ArrayList<>(cards); final CardCollection choice = new CardCollection(); final String num = sa.hasParam("RandomNum") ? sa.getParam("RandomNum") : "1"; int ncopied = AbilityUtils.calculateAmount(source, num, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index 8929a776217..6f09ea7e577 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -48,7 +48,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { final boolean isChoice = sa.getParam("Gains").contains("Choice"); final List choices = ProtectEffect.getProtectionList(sa); - final List gains = new ArrayList(); + final List gains = new ArrayList<>(); if (isChoice) { Player choser = sa.getActivatingPlayer(); final String choice = choser.getController().chooseProtectionType("Choose a protection", sa, choices); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java index df30dea7f34..45b268b9873 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java @@ -100,7 +100,7 @@ public class ProtectEffect extends SpellAbilityEffect { final boolean isChoice = sa.getParam("Gains").contains("Choice"); final List choices = getProtectionList(sa); - final List gains = new ArrayList(); + final List gains = new ArrayList<>(); final List tgtCards = getTargetCards(sa); if (isChoice && !choices.isEmpty()) { @@ -128,7 +128,7 @@ public class ProtectEffect extends SpellAbilityEffect { gainsKWList.add(TextUtil.concatWithSpace("Protection from", color)); } - final List untargetedCards = new ArrayList(); + final List untargetedCards = new ArrayList<>(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (sa.hasParam("Radiance") && (tgt != null)) { @@ -205,7 +205,7 @@ public class ProtectEffect extends SpellAbilityEffect { public static List getProtectionList(final SpellAbility sa) { - final List gains = new ArrayList(); + final List gains = new ArrayList<>(); final String gainStr = sa.getParam("Gains"); if (gainStr.equals("Choice")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index d89e2c9066b..4641d05d75f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -29,10 +29,10 @@ public class RestartGameEffect extends SpellAbilityEffect { final Player activator = sa.getActivatingPlayer(); final Game game = activator.getGame(); FCollectionView players = game.getPlayers(); - Map> playerLibraries = new HashMap>(); + Map> playerLibraries = new HashMap<>(); // Don't grab Ante Zones - List restartZones = new ArrayList(Arrays.asList(ZoneType.Battlefield, + List restartZones = new ArrayList<>(Arrays.asList(ZoneType.Battlefield, ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command)); ZoneType leaveZone = ZoneType.smartValueOf(sa.hasParam("RestrictFromZone") ? sa.getParam("RestrictFromZone") : null); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java index 903c20b25d0..e812e83a209 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java @@ -20,7 +20,7 @@ public class RunSVarAbilityEffect extends SpellAbilityEffect { if (sVars == null || cards.isEmpty()) { return; } - List validSA = new ArrayList(); + List validSA = new ArrayList<>(); final boolean isTrigger = sa.hasParam("IsTrigger"); for (final Card tgtC : cards) { if (!tgtC.hasSVar(sVars)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java index 32d4d05e12e..a74bb75cd6f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java @@ -14,8 +14,8 @@ public class StoreMapEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); - List entity = new ArrayList(); - List objects = new ArrayList(); + List entity = new ArrayList<>(); + List objects = new ArrayList<>(); if (sa.hasParam("RememberEntity")) { entity.addAll(AbilityUtils.getDefinedPlayers(source, sa.getParam("RememberEntity"), sa)); diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index ccb021be854..ae24cc3a7a0 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -56,11 +56,11 @@ public class CardState extends GameObject { private String baseLoyalty = ""; private KeywordCollection intrinsicKeywords = new KeywordCollection(); - private final FCollection nonManaAbilities = new FCollection(); - private final FCollection manaAbilities = new FCollection(); - private FCollection triggers = new FCollection(); - private FCollection replacementEffects = new FCollection(); - private FCollection staticAbilities = new FCollection(); + private final FCollection nonManaAbilities = new FCollection<>(); + private final FCollection manaAbilities = new FCollection<>(); + private FCollection triggers = new FCollection<>(); + private FCollection replacementEffects = new FCollection<>(); + private FCollection staticAbilities = new FCollection<>(); private String imageKey = ""; private Map sVars = Maps.newTreeMap(); @@ -257,24 +257,24 @@ public class CardState extends GameObject { } public final FCollectionView getSpellAbilities() { - FCollection newCol = new FCollection(manaAbilities); + FCollection newCol = new FCollection<>(manaAbilities); newCol.addAll(nonManaAbilities); card.updateSpellAbilities(newCol, this, null); return newCol; } public final FCollectionView getManaAbilities() { - FCollection newCol = new FCollection(manaAbilities); + FCollection newCol = new FCollection<>(manaAbilities); card.updateSpellAbilities(newCol, this, true); return newCol; } public final FCollectionView getNonManaAbilities() { - FCollection newCol = new FCollection(nonManaAbilities); + FCollection newCol = new FCollection<>(nonManaAbilities); card.updateSpellAbilities(newCol, this, false); return newCol; } public final FCollectionView getIntrinsicSpellAbilities() { - return new FCollection(Iterables.filter(getSpellAbilities(), SpellAbilityPredicates.isIntrinsic())); + return new FCollection<>(Iterables.filter(getSpellAbilities(), SpellAbilityPredicates.isIntrinsic())); } public final boolean hasSpellAbility(final SpellAbility sa) { @@ -386,7 +386,7 @@ public class CardState extends GameObject { return staticAbilities.remove(stab); } public final void setStaticAbilities(final Iterable staticAbilities0) { - staticAbilities = new FCollection(staticAbilities0); + staticAbilities = new FCollection<>(staticAbilities0); } public final void clearStaticAbilities() { staticAbilities.clear(); diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 8d0c2000fff..2f1efa59769 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -423,7 +423,7 @@ public final class CardUtil { colors.add(MagicColor.Constant.COLORLESS); } } else if (reflectProperty.equals("Produce")) { - final FCollection abilities = new FCollection(); + final FCollection abilities = new FCollection<>(); for (final Card c : cards) { abilities.addAll(c.getManaAbilities()); } diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 8762d2816d2..8f33fc065ad 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -46,7 +46,7 @@ public class CardView extends GameEntityView { if (cards == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (Card c : cards) { if (c.getCardForUi() == c) { //only add cards that match their card for UI collection.add(c.getView()); @@ -352,7 +352,7 @@ public class CardView extends GameEntityView { TrackableCollection col = get(prop); if (mayLook) { if (col == null) { - col = new TrackableCollection(p.getView()); + col = new TrackableCollection<>(p.getView()); set(prop, col); } else if (col.add(p.getView())) { @@ -1060,7 +1060,7 @@ public class CardView extends GameEntityView { if (oldCards.add(cardToAdd)) { TrackableCollection views = get(key); if (views == null) { - views = new TrackableCollection(); + views = new TrackableCollection<>(); views.add(cardToAdd.getView()); set(key, views); } @@ -1081,7 +1081,7 @@ public class CardView extends GameEntityView { for (Card c : cardsToAdd) { if (c != null && oldCards.add(c)) { if (views == null) { - views = new TrackableCollection(); + views = new TrackableCollection<>(); views.add(c.getView()); set(key, views); } diff --git a/forge-game/src/main/java/forge/game/combat/AttackConstraints.java b/forge-game/src/main/java/forge/game/combat/AttackConstraints.java index f7b59f9413f..181c27e769e 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackConstraints.java +++ b/forge-game/src/main/java/forge/game/combat/AttackConstraints.java @@ -45,7 +45,7 @@ public class AttackConstraints { "If a creature with a magnet counter on it attacks, all creatures with magnet counters on them attack if able."); } - final MapToAmount attacksIfOtherAttacks = new LinkedHashMapToAmount(); + final MapToAmount attacksIfOtherAttacks = new LinkedHashMapToAmount<>(); for (final Card possibleAttacker : possibleAttackers) { attacksIfOtherAttacks.add(possibleAttacker, possibleAttacker.getAmountOfKeyword("If a creature you control attacks, CARDNAME also attacks if able.")); } @@ -53,7 +53,7 @@ public class AttackConstraints { for (final Card possibleAttacker : possibleAttackers) { restrictions.put(possibleAttacker, new AttackRestriction(possibleAttacker, possibleDefenders)); - final MapToAmount causesToAttack = new LinkedHashMapToAmount(); + final MapToAmount causesToAttack = new LinkedHashMapToAmount<>(); for (final Entry entry : attacksIfOtherAttacks.entrySet()) { if (entry.getKey() != possibleAttacker) { causesToAttack.add(entry.getKey(), entry.getValue().intValue()); @@ -97,7 +97,7 @@ public class AttackConstraints { return Pair.of(Collections.emptyMap(), Integer.valueOf(0)); } - final MapToAmount> possible = new LinkedHashMapToAmount>(); + final MapToAmount> possible = new LinkedHashMapToAmount<>(); final List reqs = getSortedFilteredRequirements(); final CardCollection myPossibleAttackers = new CardCollection(possibleAttackers); @@ -172,8 +172,8 @@ public class AttackConstraints { } private final FCollection> collectLegalAttackers(final List reqs, final int maximum) { - return new FCollection> - (collectLegalAttackers(Collections.emptyMap(), deepClone(reqs), new CardCollection(), maximum)); + return new FCollection<> + (collectLegalAttackers(Collections.emptyMap(), deepClone(reqs), new CardCollection(), maximum)); } private final List> collectLegalAttackers(final Map attackers, final List reqs, final CardCollection reserved, final int maximum) { @@ -182,7 +182,7 @@ public class AttackConstraints { int localMaximum = maximum; final boolean isLimited = globalRestrictions.getMax() != -1; final Map myAttackers = Maps.newHashMap(attackers); - final MapToAmount toDefender = new LinkedHashMapToAmount(); + final MapToAmount toDefender = new LinkedHashMapToAmount<>(); int attackersNeeded = 0; outer: while(!reqs.isEmpty()) { diff --git a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java index 8c40d44d7e6..2841352d515 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java +++ b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java @@ -29,9 +29,9 @@ public class AttackRequirement { private final MapToAmount causesToAttack; public AttackRequirement(final Card attacker, final MapToAmount causesToAttack, final FCollectionView possibleDefenders) { - this.defenderSpecific = new LinkedHashMapToAmount(); - this.defenderOrPWSpecific = new LinkedHashMapToAmount(); - this.defenderSpecificAlternatives = new HashMap>(); + this.defenderSpecific = new LinkedHashMapToAmount<>(); + this.defenderOrPWSpecific = new LinkedHashMapToAmount<>(); + this.defenderSpecificAlternatives = new HashMap<>(); this.causesToAttack = causesToAttack; diff --git a/forge-game/src/main/java/forge/game/combat/AttackRestriction.java b/forge-game/src/main/java/forge/game/combat/AttackRestriction.java index 2f47ffd92e2..6535808a622 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackRestriction.java +++ b/forge-game/src/main/java/forge/game/combat/AttackRestriction.java @@ -26,7 +26,7 @@ public class AttackRestriction { this.attacker = attacker; setRestrictions(); - final FCollection cantAttackDefender = new FCollection(); + final FCollection cantAttackDefender = new FCollection<>(); for (final GameEntity defender : possibleDefenders) { if (!CombatUtil.canAttack(attacker, defender)) { cantAttackDefender.add(defender); diff --git a/forge-game/src/main/java/forge/game/combat/AttackingBand.java b/forge-game/src/main/java/forge/game/combat/AttackingBand.java index 3158cbcea73..3e9f861600f 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackingBand.java +++ b/forge-game/src/main/java/forge/game/combat/AttackingBand.java @@ -65,7 +65,7 @@ public class AttackingBand { public boolean canJoinBand(Card card) { // Trying to join an existing band, attackers should be non-empty and card should exist - List newBand = new ArrayList(attackers); + List newBand = new ArrayList<>(attackers); if (card != null) { newBand.add(card); } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 4299ce1eede..94aff5f0de3 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -51,7 +51,7 @@ public class Combat { private final Player playerWhoAttacks; private final AttackConstraints attackConstraints; // Defenders, as they are attacked by hostile forces - private final FCollection attackableEntries = new FCollection(); + private final FCollection attackableEntries = new FCollection<>(); // Keyed by attackable defender (player or planeswalker) private final Multimap attackedByBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); @@ -87,7 +87,7 @@ public class Combat { HashMap bandsMap = new HashMap<>(); for (Entry entry : combat.attackedByBands.entries()) { AttackingBand origBand = entry.getValue(); - ArrayList attackers = new ArrayList(); + ArrayList attackers = new ArrayList<>(); for (Card c : origBand.getAttackers()) { attackers.add(map.map(c)); } @@ -187,7 +187,7 @@ public class Combat { } public final FCollection getDefendersControlledBy(Player who) { - FCollection res = new FCollection(); + FCollection res = new FCollection<>(); for (GameEntity ge : attackableEntries) { // if defender is the player himself or his cards if (ge == who || ge instanceof Card && ((Card) ge).getController() == who) { @@ -198,7 +198,7 @@ public class Combat { } public final FCollectionView getDefendingPlayers() { - return new FCollection(Iterables.filter(attackableEntries, Player.class)); + return new FCollection<>(Iterables.filter(attackableEntries, Player.class)); } public final CardCollection getDefendingPlaneswalkers() { @@ -414,7 +414,7 @@ public class Combat { } public final FCollectionView getAttackingBandsBlockedBy(Card blocker) { - FCollection bands = new FCollection(); + FCollection bands = new FCollection<>(); for (Entry kv : blockedBands.entries()) { if (kv.getValue().equals(blocker)) { bands.add(kv.getKey()); @@ -902,7 +902,7 @@ public class Combat { return; // card was not even in combat } } - final FCollectionView relatedBands = isAttacker ? new FCollection(attackingBand) : attackersBlocked; + final FCollectionView relatedBands = isAttacker ? new FCollection<>(attackingBand) : attackersBlocked; lkiCache.put(lastKnownInfo, new CombatLki(isAttacker, relatedBands)); } } diff --git a/forge-game/src/main/java/forge/game/combat/CombatLki.java b/forge-game/src/main/java/forge/game/combat/CombatLki.java index 682265f0a18..9e1d60b5bfb 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatLki.java +++ b/forge-game/src/main/java/forge/game/combat/CombatLki.java @@ -14,7 +14,7 @@ public class CombatLki { public CombatLki(boolean isAttacker, FCollectionView relatedBands) { this.isAttacker = isAttacker; - this.relatedBands = new FCollection(relatedBands); + this.relatedBands = new FCollection<>(relatedBands); } public AttackingBand getFirstBand() { diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 5f020665993..50d7c7aae98 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -59,7 +59,7 @@ import java.util.Map; public class CombatUtil { public static FCollectionView getAllPossibleDefenders(final Player playerWhoAttacks) { - final FCollection defenders = new FCollection(); + final FCollection defenders = new FCollection<>(); for (final Player defender : playerWhoAttacks.getOpponents()) { defenders.add(defender); final CardCollection planeswalkers = CardLists.filter(defender.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.PLANESWALKERS); diff --git a/forge-game/src/main/java/forge/game/combat/CombatView.java b/forge-game/src/main/java/forge/game/combat/CombatView.java index 3d7ef74db64..94863af1395 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatView.java +++ b/forge-game/src/main/java/forge/game/combat/CombatView.java @@ -59,7 +59,7 @@ public class CombatView extends TrackableObject { public Iterable getAttackers() { final HashSet allAttackers; synchronized (this) { - allAttackers = new HashSet(getAttackersWithDefenders().keySet()); + allAttackers = new HashSet<>(getAttackersWithDefenders().keySet()); } return allAttackers; } @@ -67,7 +67,7 @@ public class CombatView extends TrackableObject { public Iterable getDefenders() { final HashSet allDefenders; synchronized (this) { - allDefenders = new HashSet(getAttackersWithDefenders().values()); + allDefenders = new HashSet<>(getAttackersWithDefenders().values()); } return allDefenders; } @@ -139,7 +139,7 @@ public class CombatView extends TrackableObject { synchronized (this) { attackersWithDefenders = Lists.newArrayList(getAttackersWithDefenders().entrySet()); } - final FCollection views = new FCollection(); + final FCollection views = new FCollection<>(); for (final Entry entry : attackersWithDefenders) { if (defender != null && defender.equals(entry.getValue())) { views.add(entry.getKey()); @@ -152,7 +152,7 @@ public class CombatView extends TrackableObject { synchronized (this) { bandsWithDefenders = Lists.newArrayList(getBandsWithDefenders().entrySet()); } - final List> views = new ArrayList>(); + final List> views = new ArrayList<>(); for (final Entry, GameEntityView> entry : bandsWithDefenders) { if (defender != null && defender.equals(entry.getValue())) { views.add(entry.getKey()); @@ -164,9 +164,9 @@ public class CombatView extends TrackableObject { public void addAttackingBand(final Iterable attackingBand, final GameEntityView defender, final Iterable blockers, final Iterable plannedBlockers) { if (defender == null) { return; } - final FCollection attackingBandCopy = new FCollection(); - final FCollection blockersCopy = new FCollection(); - final FCollection plannedBlockersCopy = new FCollection(); + final FCollection attackingBandCopy = new FCollection<>(); + final FCollection blockersCopy = new FCollection<>(); + final FCollection plannedBlockersCopy = new FCollection<>(); attackingBandCopy.addAll(attackingBand); if (blockers != null) { diff --git a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java index 9c5f3b810bf..dc8eabe113f 100644 --- a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java +++ b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java @@ -48,7 +48,7 @@ public class GlobalAttackRestrictions { return new GlobalAttackRestrictionViolations(nTooMany, MapToAmountUtil.emptyMap(), MapToAmountUtil.emptyMap()); } - final MapToAmount defenderTooMany = new LinkedHashMapToAmount(defenderMax.size()); + final MapToAmount defenderTooMany = new LinkedHashMapToAmount<>(defenderMax.size()); outer: for (final GameEntity defender : attackers.values()) { final Integer max = defenderMax.get(defender); if (max == null) { @@ -76,7 +76,7 @@ public class GlobalAttackRestrictions { } } - final MapToAmount defenderTooFew = new LinkedHashMapToAmount(defenderMax.size()); + final MapToAmount defenderTooFew = new LinkedHashMapToAmount<>(defenderMax.size()); for (final GameEntity mandatoryDef : mustBeAttackedByEachOpp) { // check to ensure that this defender can even legally be attacked in the first place boolean canAttackThisDef = false; @@ -145,7 +145,7 @@ public class GlobalAttackRestrictions { */ public static GlobalAttackRestrictions getGlobalRestrictions(final Player attackingPlayer, final FCollectionView possibleDefenders) { int max = -1; - final MapToAmount defenderMax = new LinkedHashMapToAmount(possibleDefenders.size()); + final MapToAmount defenderMax = new LinkedHashMapToAmount<>(possibleDefenders.size()); final PlayerCollection mustBeAttacked = new PlayerCollection(); final Game game = attackingPlayer.getGame(); diff --git a/forge-game/src/main/java/forge/game/cost/CostAddMana.java b/forge-game/src/main/java/forge/game/cost/CostAddMana.java index 5213f4f6ae6..81ea129bce2 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAddMana.java +++ b/forge-game/src/main/java/forge/game/cost/CostAddMana.java @@ -76,7 +76,7 @@ public class CostAddMana extends CostPart { public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility sa) { Card source = sa.getHostCard(); - List manaProduced = new ArrayList(); + List manaProduced = new ArrayList<>(); final String type = this.getType(); for (int n = 0; n < decision.c; n++) { if (StringUtils.isNumeric(type)) { diff --git a/forge-game/src/main/java/forge/game/cost/CostDraw.java b/forge-game/src/main/java/forge/game/cost/CostDraw.java index 4cd621773ab..b33630f7808 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDraw.java +++ b/forge-game/src/main/java/forge/game/cost/CostDraw.java @@ -64,7 +64,7 @@ public class CostDraw extends CostPart { * @param source */ private List getPotentialPlayers(final Player payer, final Card source) { - List res = new ArrayList(); + List res = new ArrayList<>(); String type = this.getType(); for (Player p : payer.getGame().getPlayers()) { if (p.isValid(type, payer, source, null) && p.canDraw()) { diff --git a/forge-game/src/main/java/forge/game/cost/CostGainLife.java b/forge-game/src/main/java/forge/game/cost/CostGainLife.java index bd04dd670e9..75e97f0c5f9 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainLife.java @@ -66,7 +66,7 @@ public class CostGainLife extends CostPart { public List getPotentialTargets(final Player payer, final Card source) { - List res = new ArrayList(); + List res = new ArrayList<>(); for(Player p : payer.getGame().getPlayers()) { if(p.isValid(getType(), payer, source, null)) diff --git a/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java b/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java index 2043b0e0895..26b1bcaae18 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java +++ b/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java @@ -37,7 +37,7 @@ public class GameEventBlockersDeclared extends GameEvent { */ @Override public String toString() { - List blockerCards = new ArrayList(); + List blockerCards = new ArrayList<>(); for (MapOfLists vv : blockers.values()) { for (Collection cc : vv.values()) { blockerCards.addAll(cc); diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 101dc0a4a90..805b00f6f92 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -245,20 +245,20 @@ public enum Keyword { public static List getAllKeywords() { Keyword[] values = values(); - List keywords = new ArrayList(); + List keywords = new ArrayList<>(); for (int i = 1; i < values.length; i++) { //skip UNDEFINED keywords.add(values[i]); } return keywords; } - private static final Map> cardKeywordSetLookup = new HashMap>(); + private static final Map> cardKeywordSetLookup = new HashMap<>(); public static Set getKeywordSet(PaperCard card) { String key = card.getName(); Set keywordSet = cardKeywordSetLookup.get(key); if (keywordSet == null) { - keywordSet = new HashSet(); + keywordSet = new HashSet<>(); for (KeywordInterface inst : Card.getCardForUi(card).getKeywords()) { final Keyword keyword = inst.getKeyword(); if (keyword != Keyword.UNDEFINED) { diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java index d652b3c40a9..3208205f582 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -109,7 +109,7 @@ public class ManaCostBeingPaid { // holds Mana_Part objects // ManaPartColor is stored before ManaPartGeneric - private final Map unpaidShards = new HashMap(); + private final Map unpaidShards = new HashMap<>(); private Map xManaCostPaidByColor; private final String sourceRestriction; private byte sunburstMap = 0; @@ -124,7 +124,7 @@ public class ManaCostBeingPaid { unpaidShards.put(m.getKey(), new ShardCount(m.getValue())); } if (manaCostBeingPaid.xManaCostPaidByColor != null) { - xManaCostPaidByColor = new HashMap(manaCostBeingPaid.xManaCostPaidByColor); + xManaCostPaidByColor = new HashMap<>(manaCostBeingPaid.xManaCostPaidByColor); } sourceRestriction = manaCostBeingPaid.sourceRestriction; sunburstMap = manaCostBeingPaid.sunburstMap; @@ -503,7 +503,7 @@ public class ManaCostBeingPaid { sc.xCount--; String color = MagicColor.toShortString(colorMask); if (xManaCostPaidByColor == null) { - xManaCostPaidByColor = new HashMap(); + xManaCostPaidByColor = new HashMap<>(); } Integer xColor = xManaCostPaidByColor.get(color); if (xColor == null) { @@ -594,7 +594,7 @@ public class ManaCostBeingPaid { } int nGeneric = getGenericManaAmount(); - List shards = new ArrayList(unpaidShards.keySet()); + List shards = new ArrayList<>(unpaidShards.keySet()); // TODO Fix this. Should we really be changing Shards here? if (false && pool != null) { //replace shards with generic mana if they can be paid with any color mana @@ -668,7 +668,7 @@ public class ManaCostBeingPaid { } public final List getUnpaidShards() { - List result = new ArrayList(); + List result = new ArrayList<>(); for (Entry kv : unpaidShards.entrySet()) { for (int i = kv.getValue().totalCount; i > 0; i--) { result.add(kv.getKey()); diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index bf68649ae12..9fb66880820 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -100,7 +100,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { public final List clearPool(boolean isEndOfPhase) { // isEndOfPhase parameter: true = end of phase, false = mana drain effect - List cleared = new ArrayList(); + List cleared = new ArrayList<>(); if (floatingMana.isEmpty()) { return cleared; } if (isEndOfPhase && owner.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.manapoolsDontEmpty)) { @@ -125,7 +125,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { for (Byte b : keys) { Collection cm = floatingMana.get(b); if (isEndOfPhase && !owner.getGame().getPhaseHandler().is(PhaseType.CLEANUP)) { - final List pMana = new ArrayList(); + final List pMana = new ArrayList<>(); for (final Mana mana : cm) { if (mana.getManaAbility()!= null && mana.getManaAbility().isPersistentMana()) { pMana.add(mana); @@ -159,7 +159,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } private void convertManaColor(final byte originalColor, final byte toColor) { - List convert = new ArrayList(); + List convert = new ArrayList<>(); Collection cm = floatingMana.get(originalColor); for (Mana m : cm) { convert.add(new Mana(toColor, m.getSourceCard(), m.getManaAbility())); @@ -287,7 +287,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { return false; } - final List removeFloating = new ArrayList(); + final List removeFloating = new ArrayList<>(); boolean manaNotAccountedFor = false; // loop over mana produced by mana ability diff --git a/forge-game/src/main/java/forge/game/phase/ExtraTurn.java b/forge-game/src/main/java/forge/game/phase/ExtraTurn.java index 156e788cf1d..5d7a0d29c17 100644 --- a/forge-game/src/main/java/forge/game/phase/ExtraTurn.java +++ b/forge-game/src/main/java/forge/game/phase/ExtraTurn.java @@ -36,7 +36,7 @@ import forge.game.trigger.Trigger; public class ExtraTurn { private Player player = null; - private List delTrig = Collections.synchronizedList(new ArrayList()); + private List delTrig = Collections.synchronizedList(new ArrayList<>()); private boolean skipUntap = false; private boolean cantSetSchemesInMotion = false; /** diff --git a/forge-game/src/main/java/forge/game/phase/Phase.java b/forge-game/src/main/java/forge/game/phase/Phase.java index 9b31c09900a..3a84791af1c 100644 --- a/forge-game/src/main/java/forge/game/phase/Phase.java +++ b/forge-game/src/main/java/forge/game/phase/Phase.java @@ -45,11 +45,11 @@ public class Phase implements java.io.Serializable { this.type = type; } - protected final List at = new ArrayList(); - private final List until = new ArrayList(); - private final HashMap> untilMap = new HashMap>(); - private final HashMap> untilEndMap = new HashMap>(); - private final HashMap> registerMap = new HashMap>(); + protected final List at = new ArrayList<>(); + private final List until = new ArrayList<>(); + private final HashMap> untilMap = new HashMap<>(); + private final HashMap> untilEndMap = new HashMap<>(); + private final HashMap> registerMap = new HashMap<>(); /** *

diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 00ca310ff9e..9aa823316e2 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -70,7 +70,7 @@ public class PhaseHandler implements java.io.Serializable { private PhaseType phase = null; private int turn = 0; - private final transient Stack extraTurns = new Stack(); + private final transient Stack extraTurns = new Stack<>(); private final transient Map> extraPhases = Maps.newEnumMap(PhaseType.class); private int nUpkeepsThisTurn = 0; @@ -663,7 +663,7 @@ public class PhaseHandler implements java.io.Serializable { // map: defender => (many) attacker => (many) blocker Map> blockers = Maps.newHashMap(); for (GameEntity ge : combat.getDefendersControlledBy(p)) { - MapOfLists protectThisDefender = new HashMapOfLists(CollectionSuppliers.arrayLists()); + MapOfLists protectThisDefender = new HashMapOfLists<>(CollectionSuppliers.arrayLists()); for (Card att : combat.getAttackersOf(ge)) { protectThisDefender.addAll(att, combat.getBlockers(att)); } @@ -916,7 +916,7 @@ public class PhaseHandler implements java.io.Serializable { // 500.8. Some effects can add phases to a turn. They do this by adding the phases directly after the specified phase. // If multiple extra phases are created after the same phase, the most recently created phase will occur first. if (!extraPhases.containsKey(afterPhase)) { - extraPhases.put(afterPhase, new Stack()); + extraPhases.put(afterPhase, new Stack<>()); } extraPhases.get(afterPhase).push(extraPhase); } @@ -1077,7 +1077,7 @@ public class PhaseHandler implements java.io.Serializable { } private boolean checkStateBasedEffects() { - final Set allAffectedCards = new HashSet(); + final Set allAffectedCards = new HashSet<>(); do { // Rule 704.3 Whenever a player would get priority, the game checks ... for state-based actions, game.getAction().checkStateEffects(false, allAffectedCards); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseType.java b/forge-game/src/main/java/forge/game/phase/PhaseType.java index eda13a747f7..15fda8e63d1 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseType.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseType.java @@ -74,7 +74,7 @@ public enum PhaseType { } public static List listValueOf(final String values) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final String s : values.split("[, ]+")) { result.add(PhaseType.smartValueOf(s)); } @@ -87,7 +87,7 @@ public enum PhaseType { * @return */ public static List parseRange(String values) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final String s : values.split(",")) { int idxArrow = s.indexOf("->"); if (idxArrow >= 0) { diff --git a/forge-game/src/main/java/forge/game/player/AchievementTracker.java b/forge-game/src/main/java/forge/game/player/AchievementTracker.java index 58ff288510e..4987a380b4b 100644 --- a/forge-game/src/main/java/forge/game/player/AchievementTracker.java +++ b/forge-game/src/main/java/forge/game/player/AchievementTracker.java @@ -10,8 +10,8 @@ import forge.game.spellability.SpellAbility; //class for storing information during a game that is used at the end of the game to determine achievements public class AchievementTracker { - public final Set activatedUltimates = new HashSet(); - public final Set challengesCompleted = new HashSet(); + public final Set activatedUltimates = new HashSet<>(); + public final Set challengesCompleted = new HashSet<>(); public int mulliganTo = 7; public int spellsCast = 0; public int maxStormCount = 0; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 4489f06814b..aa6d211b49f 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -119,7 +119,7 @@ public class Player extends GameEntity implements Comparable { private Map staticAbilities = Maps.newHashMap(); - private Map changedKeywords = new ConcurrentSkipListMap(); + private Map changedKeywords = new ConcurrentSkipListMap<>(); private ManaPool manaPool = new ManaPool(this); private GameEntity mustAttackEntity = null; private GameEntity mustAttackEntityThisTurn = null; @@ -768,8 +768,8 @@ public class Player extends GameEntity implements Comparable { CardCollection preventionEffectSources = new CardCollection(shieldMap.keySet()); Card shieldSource = preventionEffectSources.get(0); if (preventionEffectSources.size() > 1) { - Map choiceMap = new TreeMap(); - List choices = new ArrayList(); + Map choiceMap = new TreeMap<>(); + List choices = new ArrayList<>(); for (final Card key : preventionEffectSources) { String effDesc = shieldMap.get(key).get("EffectString"); int descIndex = effDesc.indexOf("SpellDescription"); @@ -1148,7 +1148,7 @@ public class Player extends GameEntity implements Comparable { } public final FCollectionView getStaticAbilities() { - FCollection result = new FCollection(); + FCollection result = new FCollection<>(); for (DetachedCardEffect eff : staticAbilities.values()) { result.addAll(eff.getStaticAbilities()); } @@ -1711,7 +1711,7 @@ public class Player extends GameEntity implements Comparable { if (land.isFaceDown()) { land.turnFaceUp(); } - game.getAction().moveTo(getZone(ZoneType.Battlefield), land, null, new HashMap()); + game.getAction().moveTo(getZone(ZoneType.Battlefield), land, null, new HashMap<>()); // play a sound game.fireEvent(new GameEventLandPlayed(this, land)); diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index f1c17abdf59..88038cad515 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -274,7 +274,7 @@ public class PlayerProperty { } else if (kind.equals("PermanentInPlay")) { int typeNum = 0; - List controlmost = new ArrayList(); + List controlmost = new ArrayList<>(); for (final Player p : game.getPlayers()) { final int num = p.getCardsIn(ZoneType.Battlefield).size(); if (num > typeNum) { @@ -311,7 +311,7 @@ public class PlayerProperty { type = TextUtil.fastReplace(type, "Only", ""); } int typeNum = 0; - List controlmost = new ArrayList(); + List controlmost = new ArrayList<>(); for (final Player p : game.getPlayers()) { final int num = CardLists.getType(p.getCardsIn(ZoneType.Battlefield), type).size(); if (num > typeNum) { @@ -332,7 +332,7 @@ public class PlayerProperty { } else if (property.startsWith("withLowest")) { if (property.substring(10).equals("Life")) { int lowestLife = player.getLife(); - List lowestlifep = new ArrayList(); + List lowestlifep = new ArrayList<>(); for (final Player p : game.getPlayers()) { if (p.getLife() == lowestLife) { lowestlifep.add(p); diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 989d70ecf38..ec65996b87c 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -41,7 +41,7 @@ public class PlayerView extends GameEntityView { if (players == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (Player p : players) { collection.add(p.getView()); } @@ -91,7 +91,7 @@ public class PlayerView extends GameEntityView { } public FCollectionView getOpponents() { - return MoreObjects.firstNonNull(this.>get(TrackableProperty.Opponents), new FCollection()); + return MoreObjects.firstNonNull(this.>get(TrackableProperty.Opponents), new FCollection<>()); } void updateOpponents(Player p) { set(TrackableProperty.Opponents, PlayerView.getCollection(p.getOpponents())); @@ -262,7 +262,7 @@ public class PlayerView extends GameEntityView { return damage == null ? 0 : damage.intValue(); } void updateCommanderDamage(Player p) { - Map map = new HashMap(); + Map map = new HashMap<>(); for (Entry entry : p.getCommanderDamage()) { map.put(entry.getKey().getId(), entry.getValue()); } @@ -415,7 +415,7 @@ public class PlayerView extends GameEntityView { return get(TrackableProperty.Mana); } void updateMana(Player p) { - Map mana = new HashMap(); + Map mana = new HashMap<>(); for (byte b : ManaAtom.MANATYPES) { mana.put(b, p.getManaPool().getAmountOfColor(b)); } diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index aedf99e5774..094b94ad796 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -19,7 +19,7 @@ public class RegisteredPlayer { private final Deck originalDeck; // never return or modify this instance (it's a reference to game resources) private Deck currentDeck; - private static final Iterable EmptyList = Collections.unmodifiableList(new ArrayList()); + private static final Iterable EmptyList = Collections.unmodifiableList(new ArrayList<>()); private LobbyPlayer player = null; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index c53c34bd3ce..0c3f01508a6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -363,7 +363,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } if (this.getPlayerContains() != null) { - List list = new ArrayList(); + List list = new ArrayList<>(); if (this.getPlayerDefined() != null) { list.addAll(AbilityUtils.getDefinedPlayers(sa.getHostCard(), this.getPlayerDefined(), sa)); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java index 3c0bb190692..20e3d91e522 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java @@ -17,7 +17,7 @@ public class SpellAbilityView extends TrackableObject implements IHasCardView { if (spabs == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (SpellAbility spab : spabs) { collection.add(spab.getView()); } diff --git a/forge-game/src/main/java/forge/game/spellability/StackItemView.java b/forge-game/src/main/java/forge/game/spellability/StackItemView.java index 22ab4d46cad..efe19f0786e 100644 --- a/forge-game/src/main/java/forge/game/spellability/StackItemView.java +++ b/forge-game/src/main/java/forge/game/spellability/StackItemView.java @@ -19,7 +19,7 @@ public class StackItemView extends TrackableObject implements IHasCardView { if (instances == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (SpellAbilityStackInstance si : instances) { collection.add(si.getView()); } diff --git a/forge-game/src/main/java/forge/game/spellability/TargetChoices.java b/forge-game/src/main/java/forge/game/spellability/TargetChoices.java index 6391ab5b509..4d1c812d141 100644 --- a/forge-game/src/main/java/forge/game/spellability/TargetChoices.java +++ b/forge-game/src/main/java/forge/game/spellability/TargetChoices.java @@ -41,8 +41,8 @@ public class TargetChoices implements Cloneable { // Card or Player are legal targets. private final CardCollection targetCards = new CardCollection(); - private final List targetPlayers = new ArrayList(); - private final List targetSpells = new ArrayList(); + private final List targetPlayers = new ArrayList<>(); + private final List targetSpells = new ArrayList<>(); public final int getNumTargeted() { return numTargeted; @@ -117,7 +117,7 @@ public class TargetChoices implements Cloneable { } public final List getTargets() { - final List tgts = new ArrayList(); + final List tgts = new ArrayList<>(); tgts.addAll(targetPlayers); tgts.addAll(targetCards); tgts.addAll(targetSpells); diff --git a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java index 270e57585b2..84cf024fd13 100644 --- a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java +++ b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java @@ -77,7 +77,7 @@ public class TargetRestrictions { // For "Divided" cards. Is this better in TargetChoices? private boolean dividedAsYouChoose = false; - private HashMap dividedMap = new HashMap(); + private HashMap dividedMap = new HashMap<>(); private int stillToDivide = 0; // Not sure what's up with Mandatory? Why wouldn't targeting be mandatory? diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 3e6b6e3fb86..0f66693ebba 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -750,7 +750,7 @@ public final class StaticAbilityContinuous { } private static void buildIgnorEffectAbility(final StaticAbility stAb, final String costString, final List players, final CardCollectionView cards) { - final List validActivator = new ArrayList(players); + final List validActivator = new ArrayList<>(players); for (final Card c : cards) { validActivator.add(c.getController()); } @@ -793,7 +793,7 @@ public final class StaticAbilityContinuous { final Card hostCard = stAb.getHostCard(); final Player controller = hostCard.getController(); - final List players = new ArrayList(); + final List players = new ArrayList<>(); if (!params.containsKey("Affected")) { return players; diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index e901efcb665..09972042775 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -122,7 +122,7 @@ public abstract class Trigger extends TriggerReplacementBase { this.id = nextId(); this.intrinsic = intrinsic; - this.setRunParams(new HashMap()); // TODO: Consider whether this can be null instead, for performance reasons. + this.setRunParams(new HashMap<>()); // TODO: Consider whether this can be null instead, for performance reasons. this.originalMapParams.putAll(params); this.mapParams.putAll(params); this.setHostCard(host); @@ -303,7 +303,7 @@ public abstract class Trigger extends TriggerReplacementBase { if (this.mapParams.containsKey("APlayerHasMoreLifeThanEachOther")) { int highestLife = Integer.MIN_VALUE; // Negative base just in case a few Lich's or Platinum Angels are running around - final List healthiest = new ArrayList(); + final List healthiest = new ArrayList<>(); for (final Player p : game.getPlayers()) { if (p.getLife() > highestLife) { healthiest.clear(); @@ -323,7 +323,7 @@ public abstract class Trigger extends TriggerReplacementBase { if (this.mapParams.containsKey("APlayerHasMostCardsInHand")) { int largestHand = 0; - final List withLargestHand = new ArrayList(); + final List withLargestHand = new ArrayList<>(); for (final Player p : game.getPlayers()) { if (p.getCardsIn(ZoneType.Hand).size() > largestHand) { withLargestHand.clear(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 85a7d8a1d6c..d44cc2af616 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -52,13 +52,13 @@ import com.google.common.collect.Maps; import com.google.common.collect.Multimaps; public class TriggerHandler { - private final List suppressedModes = Collections.synchronizedList(new ArrayList()); - private final List activeTriggers = Collections.synchronizedList(new ArrayList()); + private final List suppressedModes = Collections.synchronizedList(new ArrayList<>()); + private final List activeTriggers = Collections.synchronizedList(new ArrayList<>()); - private final List delayedTriggers = Collections.synchronizedList(new ArrayList()); - private final List thisTurnDelayedTriggers = Collections.synchronizedList(new ArrayList()); + private final List delayedTriggers = Collections.synchronizedList(new ArrayList<>()); + private final List thisTurnDelayedTriggers = Collections.synchronizedList(new ArrayList<>()); private final ListMultimap playerDefinedDelayedTriggers = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); - private final List waitingTriggers = Collections.synchronizedList(new ArrayList()); + private final List waitingTriggers = Collections.synchronizedList(new ArrayList<>()); private final Game game; public TriggerHandler(final Game gameState) { @@ -127,7 +127,7 @@ public class TriggerHandler { } public final void clearDelayedTrigger(final Card card) { - final List deltrigs = new ArrayList(delayedTriggers); + final List deltrigs = new ArrayList<>(delayedTriggers); for (final Trigger trigger : deltrigs) { if (trigger.getHostCard().equals(card)) { @@ -282,7 +282,7 @@ public class TriggerHandler { public final void clearInstrinsicActiveTriggers(final Card c, Zone zoneFrom) { final Iterator itr = activeTriggers.iterator(); Trigger t; - final List toBeRemoved = new ArrayList(); + final List toBeRemoved = new ArrayList<>(); while(itr.hasNext()) { t = itr.next(); @@ -348,7 +348,7 @@ public class TriggerHandler { } public final boolean runWaitingTriggers() { - final List waiting = new ArrayList(waitingTriggers); + final List waiting = new ArrayList<>(waitingTriggers); waitingTriggers.clear(); if (waiting.isEmpty()) { return false; @@ -373,7 +373,7 @@ public class TriggerHandler { } // Copy triggers here, so things can be modified just in case - final List delayedTriggersWorkingCopy = new ArrayList(delayedTriggers); + final List delayedTriggersWorkingCopy = new ArrayList<>(delayedTriggers); boolean checkStatics = false; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java index 5b3aef0197b..4ed2b85ad2d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java @@ -79,7 +79,7 @@ public class TriggerVote extends Trigger { private static FCollection getVoters(final Player player, final ListMultimap votes, final boolean isOpponent, final boolean votedOtherchoice) { - final FCollection voters = new FCollection(); + final FCollection voters = new FCollection<>(); for (final Object voteType : votes.keySet()) { final List players = votes.get(voteType); if (votedOtherchoice ^ players.contains(player)) { diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 827f5ff62b5..e48396c53a6 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -463,7 +463,7 @@ public class WrappedAbility extends Ability { if (triggerParams.containsKey("ResolvingCheck")) { // rare cases: Hidden Predators (state trigger, but have "Intervening If" to check IsPresent2) etc. - Map recheck = new HashMap(); + Map recheck = new HashMap<>(); String key = triggerParams.get("ResolvingCheck"); String value = regtrig.getMapParams().get(key); recheck.put(key, value); @@ -532,7 +532,7 @@ public class WrappedAbility extends Ability { } } } - final Map triggerMap = new HashMap(sa.getTriggeringObjects()); + final Map triggerMap = new HashMap<>(sa.getTriggeringObjects()); for (Entry ev : triggerMap.entrySet()) { if (ev.getValue() instanceof Card) { Card card = (Card) ev.getValue(); diff --git a/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java b/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java index f5717f517d6..f8c59d4983c 100644 --- a/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java +++ b/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java @@ -15,7 +15,7 @@ public class CostPaymentStack implements Iterable private Stack stack; public CostPaymentStack() { - stack = new Stack(); + stack = new Stack<>(); } public IndividualCostPaymentInstance push(final CostPart cost, final CostPayment payment) { diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index bdaf3207197..fd40f536a70 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -72,9 +72,9 @@ public class MagicStack /* extends MyObservable */ implements Iterable simultaneousStackEntryList = Lists.newArrayList(); // They don't provide a LIFO queue, so had to use a deque - private final Deque stack = new LinkedBlockingDeque(); - private final Stack frozenStack = new Stack(); - private final Stack undoStack = new Stack(); + private final Deque stack = new LinkedBlockingDeque<>(); + private final Stack frozenStack = new Stack<>(); + private final Stack undoStack = new Stack<>(); private Player undoStackOwner; private boolean frozen = false; diff --git a/forge-game/src/main/java/forge/game/zone/ZoneType.java b/forge-game/src/main/java/forge/game/zone/ZoneType.java index 9f358f902de..3383a83cb14 100644 --- a/forge-game/src/main/java/forge/game/zone/ZoneType.java +++ b/forge-game/src/main/java/forge/game/zone/ZoneType.java @@ -46,7 +46,7 @@ public enum ZoneType { } public static List listValueOf(final String values) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final String s : values.split("[, ]+")) { ZoneType zt = ZoneType.smartValueOf(s); if (zt != null) { diff --git a/forge-game/src/main/java/forge/trackable/TrackableObject.java b/forge-game/src/main/java/forge/trackable/TrackableObject.java index a4318b4a829..280fe24d3d0 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableObject.java +++ b/forge-game/src/main/java/forge/trackable/TrackableObject.java @@ -22,7 +22,7 @@ public abstract class TrackableObject implements IIdentifiable, Serializable { protected TrackableObject(final int id0, final Tracker tracker) { id = id0; this.tracker = tracker; - props = new EnumMap(TrackableProperty.class); + props = new EnumMap<>(TrackableProperty.class); changedProps = EnumSet.noneOf(TrackableProperty.class); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableTypes.java b/forge-game/src/main/java/forge/trackable/TrackableTypes.java index d54c0f1bef3..6214563f8f7 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableTypes.java +++ b/forge-game/src/main/java/forge/trackable/TrackableTypes.java @@ -376,7 +376,7 @@ public class TrackableTypes { public static final TrackableCollectionType StackItemViewListType = new TrackableCollectionType(StackItemViewType) { @Override protected TrackableCollection getDefaultValue() { - return new TrackableCollection(); + return new TrackableCollection<>(); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index 7cc24a3df86..0bd9e3a87c9 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -61,7 +61,7 @@ import java.util.concurrent.TimeUnit; public class ImageCache { // short prefixes to save memory - private static final Set _missingIconKeys = new HashSet(); + private static final Set _missingIconKeys = new HashSet<>(); private static final LoadingCache _CACHE = CacheBuilder.newBuilder() .maximumSize(FModel.getPreferences().getPrefInt((FPref.UI_IMAGE_CACHE_MAXIMUM))) .expireAfterAccess(15, TimeUnit.MINUTES) diff --git a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java index 72ecf54fb83..25e76e0169e 100644 --- a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java +++ b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java @@ -52,7 +52,7 @@ public class KeyboardShortcuts { final InputMap im = c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); final ActionMap am = c.getActionMap(); - final List list = new ArrayList(); + final List list = new ArrayList<>(); //========== Match Shortcuts /** Show stack. */ @@ -345,9 +345,9 @@ public class KeyboardShortcuts { List existingCodes; if (codestring != null) { - existingCodes = new ArrayList(Arrays.asList(codestring.split(" "))); + existingCodes = new ArrayList<>(Arrays.asList(codestring.split(" "))); } else { - existingCodes = new ArrayList(); + existingCodes = new ArrayList<>(); } // Backspace (8) will remove last code from list. diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java b/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java index 1f59867d680..d792948e01c 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java @@ -27,9 +27,9 @@ public class DecksComboBox extends FComboBoxWrapper { public void refresh(final DeckType deckType, final boolean isForCommander) { if(isForCommander){ - setModel(new DefaultComboBoxModel(DeckType.CommanderOptions)); + setModel(new DefaultComboBoxModel<>(DeckType.CommanderOptions)); }else { - setModel(new DefaultComboBoxModel(DeckType.ConstructedOptions)); + setModel(new DefaultComboBoxModel<>(DeckType.ConstructedOptions)); } setSelectedItem(deckType); } diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index 3d218ce0fd8..c25f55b5d78 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -506,13 +506,13 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private List getSelectedDecksFromSavedState(final String savedState) { try { if (StringUtils.isBlank(savedState)) { - return new ArrayList(); + return new ArrayList<>(); } else { return Arrays.asList(savedState.split(";")[1].split(SELECTED_DECK_DELIMITER)); } } catch (final Exception ex) { System.err.println(ex + " [savedState=" + savedState + "]"); - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java index a28f4a94202..7ee3252e5a1 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java @@ -36,7 +36,7 @@ import java.util.TreeMap; @SuppressWarnings("serial") public class FDeckViewer extends FDialog { private final Deck deck; - private final List sections = new ArrayList(); + private final List sections = new ArrayList<>(); private final CardManager cardManager; private DeckSection currentSection; diff --git a/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java b/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java index 3b9eaa6d65d..1f06e198b63 100644 --- a/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java +++ b/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java @@ -67,7 +67,7 @@ public class BugReportDialog { // Button is not modified, String gets the automatic listener to hide // the dialog - List options = new ArrayList(); + List options = new ArrayList<>(); options.add(new JButton(new _Report())); // option to enable automatic Sentry submission options.add(new JCheckBox(new _ActivateSentry())); diff --git a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java index 98343afae07..d62d8bd0f62 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java @@ -100,7 +100,7 @@ public class BoxedProductCardListViewer extends FDialog { */ public BoxedProductCardListViewer(final String title, final String message, final List list, final Icon dialogIcon) { this.list = Collections.unmodifiableList(list); - this.jList = new JList(new ChooserListModel()); + this.jList = new JList<>(new ChooserListModel()); this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.picture.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java index 620b0b2ce3d..8a9a98c6530 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java @@ -98,7 +98,7 @@ public class CardListViewer extends FDialog { */ public CardListViewer(final String title, final String message, final List list, final Icon dialogIcon) { this.list = Collections.unmodifiableList(list); - this.jList = new JList(new ChooserListModel()); + this.jList = new JList<>(new ChooserListModel()); this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.picture.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java index 7943e5fb22c..02f7034d946 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java +++ b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java @@ -79,10 +79,10 @@ public class DualListBox extends FDialog { targetRemainingSourcesMin = remainingSourcesMin; targetRemainingSourcesMax = remainingSourcesMax; - sourceListModel = new UnsortedListModel(); - sourceList = new FList(sourceListModel); - destListModel = new UnsortedListModel(); - destList = new FList(destListModel); + sourceListModel = new UnsortedListModel<>(); + sourceList = new FList<>(sourceListModel); + destListModel = new UnsortedListModel<>(); + destList = new FList<>(destListModel); final Runnable onAdd = new Runnable() { @SuppressWarnings("unchecked") @@ -90,7 +90,7 @@ public class DualListBox extends FDialog { public void run() { if (!addButton.isEnabled()) { return; } - List selected = new ArrayList(); + List selected = new ArrayList<>(); for (Object item : sourceList.getSelectedValuesList()) { selected.add((T)item); } @@ -107,7 +107,7 @@ public class DualListBox extends FDialog { public void run() { if (!removeButton.isEnabled()) { return; } - List selected = new ArrayList(); + List selected = new ArrayList<>(); for (Object item : destList.getSelectedValuesList()) { selected.add((T)item); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index a5db47f9733..b47791c4b84 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -89,7 +89,7 @@ public class GuiChoose { return getInteger(message, min, max); } - final List choices = new ArrayList(); + final List choices = new ArrayList<>(); for (int i = min; i <= cutoff; i++) { choices.add(Integer.valueOf(i)); } @@ -143,7 +143,7 @@ public class GuiChoose { public static List getChoices(final String message, final int min, final int max, final Collection choices, final T selected, final Function display, final CMatchUI matchUI) { if (choices == null || choices.isEmpty()) { if (min == 0) { - return new ArrayList(); + return new ArrayList<>(); } throw new RuntimeException("choice required from empty list"); } @@ -151,7 +151,7 @@ public class GuiChoose { final Callable> showChoice = new Callable>() { @Override public List call() { - final ListChooser c = new ListChooser(message, min, max, choices, display); + final ListChooser c = new ListChooser<>(message, min, max, choices, display); final JList list = c.getLstChoices(); if (matchUI != null) { list.addListSelectionListener(new ListSelectionListener() { @@ -224,7 +224,7 @@ public class GuiChoose { } }; - final FutureTask> future = new FutureTask>(showChoice); + final FutureTask> future = new FutureTask<>(showChoice); FThreads.invokeInEdtAndWait(future); try { return future.get(); @@ -251,7 +251,7 @@ public class GuiChoose { final Callable> callable = new Callable>() { @Override public List call() { - final DualListBox dual = new DualListBox(remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, matchUI); + final DualListBox dual = new DualListBox<>(remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, matchUI); dual.setSecondColumnLabelText(top); dual.setSideboardMode(sideboardingMode); @@ -275,7 +275,7 @@ public class GuiChoose { } }; - final FutureTask> ft = new FutureTask>(callable); + final FutureTask> ft = new FutureTask<>(callable); FThreads.invokeInEdtAndWait(ft); try { return ft.get(); @@ -298,7 +298,7 @@ public class GuiChoose { return cardList; } }; - final FutureTask> ft = new FutureTask>(callable); + final FutureTask> ft = new FutureTask<>(callable); FThreads.invokeInEdtAndWait(ft); gui.clearSelectables(); try { diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java index 1152cc40270..6924ba602ae 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java @@ -35,7 +35,7 @@ public class GuiDialog { return Boolean.valueOf(answer == 0); }}; - final FutureTask future = new FutureTask(confirmTask); + final FutureTask future = new FutureTask<>(confirmTask); FThreads.invokeInEdtAndWait(future); try { return future.get().booleanValue(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java b/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java index 1ff99429027..0b4880b2f3f 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java @@ -313,7 +313,7 @@ public class ImportDialog { // associates a file operation type with its enablement checkbox and the set // of file move/copy operations that enabling it would entail private final Map>> _selections = - new HashMap>>(); + new HashMap<>(); // attached to all changeable widgets to keep the UI in sync private final ChangeListener _stateChangedListener = new ChangeListener() { @@ -359,7 +359,7 @@ public class ImportDialog { _addSelectionWidget(knownDeckPanel, OpType.UNKNOWN_DECK, "Unknown decks"); final JPanel unknownDeckPanel = new JPanel(new MigLayout("insets 0, gap 5")); unknownDeckPanel.setOpaque(false); - _unknownDeckCombo = new FComboBoxWrapper<_UnknownDeckChoice>(); + _unknownDeckCombo = new FComboBoxWrapper<>(); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Constructed", ForgeConstants.DECK_CONSTRUCTED_DIR)); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Draft", ForgeConstants.DECK_DRAFT_DIR)); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Planar", ForgeConstants.DECK_PLANE_DIR)); @@ -464,14 +464,14 @@ public class ImportDialog { // use a skip list map instead of a regular hashmap so that the files are sorted // alphabetically in the logs. note that this is a concurrent data structure // since it will be modified and read simultaneously by different threads - _selections.put(type, Pair.of(cb, new ConcurrentSkipListMap())); + _selections.put(type, Pair.of(cb, new ConcurrentSkipListMap<>())); parent.add(cb, constraints); } // must be called from GUI event loop thread private void _updateUI() { // update checkbox text labels with current totals - final Set selectedOptions = new HashSet(); + final Set selectedOptions = new HashSet<>(); for (final Map.Entry>> entry : _selections.entrySet()) { final Pair> selection = entry.getValue(); final FCheckBox cb = selection.getLeft(); @@ -494,7 +494,7 @@ public class ImportDialog { Timer timer = null; try { - final Map> selections = new HashMap>(); + final Map> selections = new HashMap<>(); for (final Map.Entry>> entry : _selections.entrySet()) { selections.put(entry.getKey(), entry.getValue().getRight()); } @@ -607,7 +607,7 @@ public class ImportDialog { // user an option to fix if (_isMigration) { // assemble a list of selections that need to be selected to complete a full migration - final List unselectedButShouldBe = new ArrayList(); + final List unselectedButShouldBe = new ArrayList<>(); for (final Map.Entry>> entry : _selections.entrySet()) { if (OpType.POSSIBLE_SET_CARD_PIC == entry.getKey()) { continue; @@ -709,7 +709,7 @@ public class ImportDialog { super("OperationLogUpdater"); setDaemon(true); - _selections = new HashMap>(); + _selections = new HashMap<>(); _operationLog = operationLog; // remove references to FCheckBox when populating map -- we can't safely access it from a thread @@ -844,7 +844,7 @@ public class ImportDialog { // build local operations map that only includes data that we can access from the background thread // use a tree map to maintain alphabetical order - _operations = new TreeMap(); + _operations = new TreeMap<>(); for (final Map.Entry>> entry : selections.entrySet()) { final Pair> selection = entry.getValue(); if (selection.getLeft().isSelected()) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java b/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java index ae670d53f84..123e612e206 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java @@ -87,7 +87,7 @@ public class ListChooser { this.minChoices = minChoices; this.maxChoices = maxChoices; this.list = list.getClass().isInstance(List.class) ? (List)list : Lists.newArrayList(list); - this.lstChoices = new FList(new ChooserListModel()); + this.lstChoices = new FList<>(new ChooserListModel()); final ImmutableList options; if (minChoices == 0) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java b/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java index 74084fea249..69f585fc7fd 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java +++ b/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java @@ -517,7 +517,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener * @return a list of text lines to render */ protected List prepareLines(final JLabel l) { - final List lines = new ArrayList(MultiLineLabelUI.defaultSize); + final List lines = new ArrayList<>(MultiLineLabelUI.defaultSize); final String text = l.getText(); if (text == null) { return null; // Null guard @@ -603,7 +603,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * Reused segments. */ - private final List segments = new ArrayList(2); + private final List segments = new ArrayList<>(2); /** * Singleton instance. diff --git a/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java b/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java index 26ffe0ad346..19030dcc8cd 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java @@ -44,7 +44,7 @@ public class UnsortedListModel extends AbstractListModel { } public void addAll(final ListModel otherModel) { - final Collection elements = new ArrayList(); + final Collection elements = new ArrayList<>(); final int size = otherModel.getSize(); for (int i = 0; size > i; ++i) { elements.add(otherModel.getElementAt(i)); diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java b/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java index ded574680bb..cd127e8f352 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java @@ -50,7 +50,7 @@ public final class DragCell extends JPanel implements ILocalRepaint { private final int margin = 2 * tabPaddingPx; // Tab handling layout stuff - private final List> allDocs = new ArrayList>(); + private final List> allDocs = new ArrayList<>(); private final JLabel lblHandle = new DragHandle(); private final JLabel lblOverflow = new JLabel(); private IVDoc docSelected = null; @@ -355,7 +355,7 @@ public final class DragCell extends JPanel implements ILocalRepaint { if (allDocs.isEmpty()) { return; } // Order tabs by priority - final List priority = new ArrayList(); + final List priority = new ArrayList<>(); final DragTab selectedTab = docSelected.getTabLabel(); DragTab nextTab = selectedTab; diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java index b809f33f005..8c2f6a38f3e 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java @@ -556,7 +556,7 @@ public final class SLayoutIO { EDocID selectedId = null; double x0 = 0, y0 = 0, w0 = 0, h0 = 0; - MapOfLists model = new HashMapOfLists(CollectionSuppliers.arrayLists()); + MapOfLists model = new HashMapOfLists<>(CollectionSuppliers.arrayLists()); LayoutInfo currentKey = null; while (null != reader && reader.hasNext()) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java index 73b0e1cd4a8..83144ef6a40 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java @@ -45,7 +45,7 @@ public final class SRearrangingUtil { private static DragCell cellSrc = null; private static DragCell cellNew = null; private static Dropzone dropzone = Dropzone.NONE; - private static List> docsToMove = new ArrayList>(); + private static List> docsToMove = new ArrayList<>(); private static IVDoc srcSelectedDoc = null; private static final SkinCursor CUR_L = FSkin.getCursor(FSkinProp.IMG_CUR_L, 16, 16, "CUR_L"); @@ -312,7 +312,7 @@ public final class SRearrangingUtil { * from any side which shares corners with the gap. */ private static void fillGap() { // Variables to help with matching the borders - final List cellsToResize = new ArrayList(); + final List cellsToResize = new ArrayList<>(); final int srcX = cellSrc.getAbsX(); final int srcX2 = cellSrc.getAbsX2(); final int srcY = cellSrc.getAbsY(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java index dfc7c4c3fcd..5c6902bd3cc 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java @@ -22,10 +22,10 @@ import java.util.List; *

(S at beginning of class name denotes a static factory.) */ public final class SResizingUtil { - private static final List LEFT_PANELS = new ArrayList(); - private static final List RIGHT_PANELS = new ArrayList(); - private static final List TOP_PANELS = new ArrayList(); - private static final List BOTTOM_PANELS = new ArrayList(); + private static final List LEFT_PANELS = new ArrayList<>(); + private static final List RIGHT_PANELS = new ArrayList<>(); + private static final List TOP_PANELS = new ArrayList<>(); + private static final List BOTTOM_PANELS = new ArrayList<>(); private static int dX; private static int evtX; @@ -135,7 +135,7 @@ public final class SResizingUtil { double roughVal = 0; int smoothVal = 0; - Set existingComponents = new HashSet(); + Set existingComponents = new HashSet<>(); for (Component c : pnlContent.getComponents()) { existingComponents.add(c); } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index 3ebaff3221a..caf187048ea 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -49,7 +49,7 @@ public class CardManager extends ItemManager { @Override protected Iterable> getUnique(Iterable> items) { //use special technique for getting unique cards so that cards without art aren't shown - HashMap> map = new HashMap>(); + HashMap> map = new HashMap<>(); for (Entry item : items) { final String key = item.getKey().getName(); final Entry oldValue = map.get(key); @@ -218,7 +218,7 @@ public class CardManager extends ItemManager { filter.edit(); } else { - filter = new AdvancedSearchFilter(itemManager); + filter = new AdvancedSearchFilter<>(itemManager); itemManager.lockFiltering = true; //ensure filter not applied until added boolean result = filter.edit(); itemManager.lockFiltering = false; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java index b5d1755ebc0..10ff32736d7 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java @@ -108,7 +108,7 @@ public final class DeckManager extends ItemManager implements IHasGam if (config0.getCols().containsKey(ColumnDef.DECK_ACTIONS)) { final ItemTableColumn column = new ItemTableColumn(new ItemColumn(config0.getCols().get(ColumnDef.DECK_ACTIONS))); column.setCellRenderer(new DeckActionsRenderer()); - colOverrides = new HashMap(); + colOverrides = new HashMap<>(); colOverrides.put(ColumnDef.DECK_ACTIONS, column); } super.setup(config0, colOverrides); @@ -307,7 +307,7 @@ public final class DeckManager extends ItemManager implements IHasGam filter.edit(); } else { - filter = new AdvancedSearchFilter(DeckManager.this); + filter = new AdvancedSearchFilter<>(DeckManager.this); lockFiltering = true; //ensure filter not applied until added boolean result = filter.edit(); lockFiltering = false; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index 887196a8970..11ee664dc7c 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -77,8 +77,8 @@ public abstract class ItemManager extends JPanel implem private final ItemManagerModel model; private Predicate filterPredicate = null; private final Map>, List>> filters = - new HashMap>, List>>(); - private final List> orderedFilters = new ArrayList>(); + new HashMap<>(); + private final List> orderedFilters = new ArrayList<>(); private boolean wantUnique = false; private boolean alwaysNonUnique = false; private boolean allowMultipleSelections = false; @@ -88,7 +88,7 @@ public abstract class ItemManager extends JPanel implem private final Class genericType; private final CDetailPicture cDetailPicture; private ItemManagerConfig config; - private final List selectionListeners = new ArrayList(); + private final List selectionListeners = new ArrayList<>(); private final ItemFilter mainSearchFilter; private final SkinnedPanel pnlButtons = new SkinnedPanel(new MigLayout("insets 0, gap 0, ax center, hidemode 3")); @@ -125,7 +125,7 @@ public abstract class ItemManager extends JPanel implem .tooltip("Toggle to show/hide options for current view") .build(); - private final List> views = new ArrayList>(); + private final List> views = new ArrayList<>(); private final ItemListView listView; private final ImageView imageView; private ItemView currentView; @@ -143,12 +143,12 @@ public abstract class ItemManager extends JPanel implem this.cDetailPicture = cDetailPicture; this.genericType = genericType0; this.wantUnique = wantUnique0; - this.model = new ItemManagerModel(genericType0); + this.model = new ItemManagerModel<>(genericType0); this.mainSearchFilter = createSearchFilter(); this.mainSearchFilter.setAllowRemove(false); - this.listView = new ItemListView(this, this.model); + this.listView = new ItemListView<>(this, this.model); this.imageView = createImageView(this.model); this.views.add(this.listView); @@ -157,7 +157,7 @@ public abstract class ItemManager extends JPanel implem } protected ImageView createImageView(final ItemManagerModel model0) { - return new ImageView(this, model0); + return new ImageView<>(this, model0); } public final CDetailPicture getCDetailPicture() { @@ -562,7 +562,7 @@ public abstract class ItemManager extends JPanel implem */ @Override public ItemPool getSelectedItemPool() { - final ItemPool selectedItemPool = new ItemPool(this.genericType); + final ItemPool selectedItemPool = new ItemPool<>(this.genericType); for (final T item : getSelectedItems()) { selectedItemPool.add(item, getItemCount(item)); } @@ -634,7 +634,7 @@ public abstract class ItemManager extends JPanel implem */ @Override public boolean setSelectedStrings(final Iterable strings) { - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final String str : strings) { final T item = stringToItem(str); if (item != null) { @@ -652,7 +652,7 @@ public abstract class ItemManager extends JPanel implem */ @Override public boolean selectItemEntrys(final Iterable> itemEntrys) { - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final Entry itemEntry : itemEntrys) { items.add(itemEntry.getKey()); } @@ -734,7 +734,7 @@ public abstract class ItemManager extends JPanel implem if (this.isUnfiltered()) { this.model.addItem(item, qty); } - final List items = new ArrayList(); + final List items = new ArrayList<>(); items.add(item); this.updateView(false, items); } @@ -755,7 +755,7 @@ public abstract class ItemManager extends JPanel implem this.model.addItems(itemsToAdd); } - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final Map.Entry item : itemsToAdd) { items.add(item.getKey()); } @@ -857,7 +857,7 @@ public abstract class ItemManager extends JPanel implem @SuppressWarnings("unchecked") public void addFilter(final ItemFilter filter) { final Class> filterClass = (Class>) filter.getClass(); - List> classFilters = this.filters.computeIfAbsent(filterClass, k -> new ArrayList>()); + List> classFilters = this.filters.computeIfAbsent(filterClass, k -> new ArrayList<>()); if (classFilters.size() > 0) { //if filter with the same class already exists, try to merge if allowed //NOTE: can always use first filter for these checks since if @@ -932,7 +932,7 @@ public abstract class ItemManager extends JPanel implem public boolean applyFilters() { if (this.lockFiltering || !this.initialized) { return false; } - final List> predicates = new ArrayList>(); + final List> predicates = new ArrayList<>(); for (final ItemFilter filter : this.orderedFilters) { //TODO: Support custom filter logic if (filter.isEnabled() && !filter.isEmpty()) { predicates.add(filter.buildPredicate(this.genericType)); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java index 30f671c7957..2c6ff484f2a 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -38,7 +38,7 @@ public class AdvancedSearchFilter extends ItemFilter public AdvancedSearchFilter(ItemManager itemManager0) { super(itemManager0); - model = new AdvancedSearch.Model(); + model = new AdvancedSearch.Model<>(); } @Override @@ -54,7 +54,7 @@ public class AdvancedSearchFilter extends ItemFilter @Override public ItemFilter createCopy() { - return new AdvancedSearchFilter(itemManager); + return new AdvancedSearchFilter<>(itemManager); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java index 6a040c82653..8b66faa6d9d 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java @@ -44,7 +44,7 @@ public class CardCMCFilter extends StatTypeFilter { @Override protected final Predicate buildPredicate() { - final List> cmcs = new ArrayList>(); + final List> cmcs = new ArrayList<>(); for (StatTypes s : buttonMap.keySet()) { if (s.predicate != null && buttonMap.get(s).isSelected()) { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java index 2d94f90ef61..0970b593e07 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java @@ -11,7 +11,7 @@ import forge.quest.QuestWorld; public class CardQuestWorldFilter extends CardFormatFilter { - private final Set questWorlds = new HashSet(); + private final Set questWorlds = new HashSet<>(); public CardQuestWorldFilter(final ItemManager itemManager0) { super(itemManager0); @@ -72,7 +72,7 @@ public class CardQuestWorldFilter extends CardFormatFilter { @Override protected Iterable getList() { - final Set strings = new HashSet(); + final Set strings = new HashSet<>(); for (final QuestWorld w : this.questWorlds) { strings.add(w.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java index 4f87e5fd468..03e5c7b9621 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java @@ -53,7 +53,7 @@ public class CardSearchFilter extends TextSearchFilter { protected final void buildWidget(JPanel widget) { super.buildWidget(widget); - cbSearchMode = new FComboBoxWrapper(); + cbSearchMode = new FComboBoxWrapper<>(); cbSearchMode.addItem("in"); cbSearchMode.addItem("not in"); cbSearchMode.addTo(widget); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java index 62ae54615cb..03404c13a46 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java @@ -14,7 +14,7 @@ import java.util.Set; * */ public class CardSetFilter extends CardFormatFilter { - private final Set sets = new HashSet(); + private final Set sets = new HashSet<>(); public CardSetFilter(ItemManager itemManager0, Collection sets0, boolean allowReprints0) { super(itemManager0); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java index ebc9ecef2ba..9f032ab3163 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java @@ -41,7 +41,7 @@ public class CardTypeFilter extends StatTypeFilter { @Override protected final Predicate buildPredicate() { - final List> types = new ArrayList>(); + final List> types = new ArrayList<>(); for (StatTypes s : buttonMap.keySet()) { if (s.predicate != null && buttonMap.get(s).isSelected()) { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java index 5fc0deb7b86..82936633767 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java @@ -13,7 +13,7 @@ import java.util.Set; * */ public class DeckFolderFilter extends ListLabelFilter { - protected final Set folders = new HashSet(); + protected final Set folders = new HashSet<>(); public DeckFolderFilter(ItemManager itemManager0) { super(itemManager0); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java index f17dc05b42b..366f6058452 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java @@ -11,7 +11,7 @@ import forge.quest.QuestWorld; public class DeckQuestWorldFilter extends DeckFormatFilter { - private final Set questWorlds = new HashSet(); + private final Set questWorlds = new HashSet<>(); public DeckQuestWorldFilter(final ItemManager itemManager0) { super(itemManager0); @@ -72,7 +72,7 @@ public class DeckQuestWorldFilter extends DeckFormatFilter { @Override protected Iterable getList() { - final Set strings = new HashSet(); + final Set strings = new HashSet<>(); for (final QuestWorld w : this.questWorlds) { strings.add(w.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java index 801516e79e1..b3c62397f23 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java @@ -11,7 +11,7 @@ import java.util.Set; public class DeckSetFilter extends DeckFormatFilter { - private final Set sets = new HashSet(); + private final Set sets = new HashSet<>(); public DeckSetFilter(ItemManager itemManager0, Collection sets0, boolean allowReprints0) { super(itemManager0); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java index 114437e9d3c..e6899c98b31 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java @@ -13,7 +13,7 @@ import java.util.Set; public abstract class FormatFilter extends ListLabelFilter { protected boolean allowReprints = true; - protected final Set formats = new HashSet(); + protected final Set formats = new HashSet<>(); public FormatFilter(ItemManager itemManager0) { super(itemManager0); @@ -25,8 +25,8 @@ public abstract class FormatFilter extends ListLabelFil @Override protected String getTooltip() { - Set sets = new HashSet(); - Set bannedCards = new HashSet(); + Set sets = new HashSet<>(); + Set bannedCards = new HashSet<>(); Set additionalCards = new HashSet<>(); for (GameFormat format : this.formats) { @@ -158,7 +158,7 @@ public abstract class FormatFilter extends ListLabelFil @Override protected Iterable getList() { - Set strings = new HashSet(); + Set strings = new HashSet<>(); for (GameFormat f : this.formats) { strings.add(f.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java index 15d0fbcee87..0c84dea03da 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java @@ -24,7 +24,7 @@ public abstract class StatTypeFilter extends ToggleButt public StatTypeFilter(ItemManager itemManager0) { super(itemManager0); - buttonMap = new HashMap(); + buttonMap = new HashMap<>(); } @SuppressWarnings("serial") diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java index dc9ad7af8f4..1bee48d047e 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java @@ -27,7 +27,7 @@ public class TextSearchFilter extends ItemFilter { @Override public ItemFilter createCopy() { - TextSearchFilter copy = new TextSearchFilter(itemManager); + TextSearchFilter copy = new TextSearchFilter<>(itemManager); copy.getWidget(); //initialize widget copy.txtSearch.setText(this.txtSearch.getText()); return copy; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java index aa33152ff6c..735cb0e459b 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java @@ -23,7 +23,7 @@ import forge.toolbox.LayoutHelper; @SuppressWarnings("serial") public abstract class ToggleButtonsFilter extends ItemFilter { protected boolean lockFiltering; - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); protected ToggleButtonsFilter(ItemManager itemManager0) { super(itemManager0); 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 index d7f0b14170d..e1fd9d7c54e 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java @@ -51,7 +51,7 @@ public class TokenSearchFilter extends TextSearchFilter { protected final void buildWidget(JPanel widget) { super.buildWidget(widget); - cbSearchMode = new FComboBoxWrapper(); + cbSearchMode = new FComboBoxWrapper<>(); cbSearchMode.addItem("in"); cbSearchMode.addItem("not in"); cbSearchMode.addTo(widget); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index d7bfcd1bba6..c4ab75b5ff9 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -71,7 +71,7 @@ public class ImageView extends ItemView { private static final int MAX_COLUMN_COUNT = 10; private final CardViewDisplay display; - private final List selectedIndices = new ArrayList(); + private final List selectedIndices = new ArrayList<>(); private int columnCount = 4; private boolean allowMultipleSelections; private ColumnDef pileBy = null; @@ -82,8 +82,8 @@ public class ImageView extends ItemView { private Point hoverScrollPos; private ItemInfo hoveredItem; private ItemInfo focalItem; - private final List orderedItems = new ArrayList(); - private final List groups = new ArrayList(); + private final List orderedItems = new ArrayList<>(); + private final List groups = new ArrayList<>(); final Localizer localizer = Localizer.getInstance(); private static boolean isPreferenceEnabled(final ForgePreferences.FPref preferenceName) { @@ -162,9 +162,9 @@ public class ImageView extends ItemView { } private final ExpandCollapseButton btnExpandCollapseAll = new ExpandCollapseButton(); - private final FComboBoxWrapper cbGroupByOptions = new FComboBoxWrapper(); - private final FComboBoxWrapper cbPileByOptions = new FComboBoxWrapper(); - private final FComboBoxWrapper cbColumnCount = new FComboBoxWrapper(); + private final FComboBoxWrapper cbGroupByOptions = new FComboBoxWrapper<>(); + private final FComboBoxWrapper cbPileByOptions = new FComboBoxWrapper<>(); + private final FComboBoxWrapper cbColumnCount = new FComboBoxWrapper<>(); public ImageView(final ItemManager itemManager0, final ItemManagerModel model0) { super(itemManager0, model0); @@ -588,7 +588,7 @@ public class ImageView extends ItemView { if (forRefresh && pileBy != null) { //refresh piles if needed //use TreeMap to build pile set so iterating below sorts on key ColumnDef groupPileBy = groupBy == null ? pileBy : groupBy.getGroupPileBy(i, pileBy); - Map, Pile> piles = new TreeMap, Pile>(); + Map, Pile> piles = new TreeMap<>(); for (ItemInfo itemInfo : group.items) { Comparable key = groupPileBy.fnSort.apply(itemInfo); if (!piles.containsKey(key)) { @@ -927,8 +927,8 @@ public class ImageView extends ItemView { } } private class Group extends DisplayArea { - private final List items = new ArrayList(); - private final List piles = new ArrayList(); + private final List items = new ArrayList<>(); + private final List piles = new ArrayList<>(); private final String name; private boolean isCollapsed; @@ -946,7 +946,7 @@ public class ImageView extends ItemView { } } private class Pile extends DisplayArea { - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); } private class ItemInfo extends DisplayArea implements Entry { private final T item; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java index bfa7320e7ef..23dc2860af2 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java @@ -155,7 +155,7 @@ public final class ItemListView extends ItemView { final DefaultTableColumnModel colmodel = new DefaultTableColumnModel(); //ensure columns ordered properly - final List columns = new LinkedList(); + final List columns = new LinkedList<>(); for (final ItemColumnConfig colConfig : config.getCols().values()) { if (colOverrides == null || !colOverrides.containsKey(colConfig.getDef())) { columns.add(new ItemTableColumn(new ItemColumn(colConfig))); @@ -287,7 +287,7 @@ public final class ItemListView extends ItemView { @Override public Iterable getSelectedIndices() { - final List indices = new ArrayList(); + final List indices = new ArrayList<>(); final int[] selectedRows = this.table.getSelectedRows(); for (int i = 0; i < selectedRows.length; i++) { indices.add(selectedRows[i]); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java index aaff5a98c15..914af73bdbd 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java @@ -179,7 +179,7 @@ public abstract class ItemView { } public final Collection getSelectedItems() { - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final Integer i : getSelectedIndices()) { final T item = getItemAtIndex(i); if (item != null) { @@ -205,7 +205,7 @@ public abstract class ItemView { return setSelectedItems(items, true); } public final boolean setSelectedItems(final Iterable items, final boolean scrollIntoView) { - final List indices = new ArrayList(); + final List indices = new ArrayList<>(); for (final T item : items) { final int index = getIndexOfItem(item); if (index != -1) { @@ -249,7 +249,7 @@ public abstract class ItemView { final int count = getCount(); if (count == 0) { return; } - final List indexList = new ArrayList(); + final List indexList = new ArrayList<>(); for (final Integer index : indices) { if (index >= 0 && index < count) { indexList.add(index); diff --git a/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java b/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java index afa9e46045a..e788bb92d3d 100644 --- a/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java +++ b/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java @@ -24,7 +24,7 @@ public final class ForgeMenu { private JPopupMenu popupMenu; private IMenuProvider provider; - private static HashMap activeShortcuts = new HashMap(); + private static HashMap activeShortcuts = new HashMap<>(); public ForgeMenu() { refresh(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java index 7b0dbe9978b..5ee535771e8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java @@ -67,7 +67,7 @@ public class AddBasicLandsDialog { private static final int ADD_BTN_SIZE = 30; private static final int LAND_PANEL_PADDING = 3; - private final FComboBoxPanel cbLandSet = new FComboBoxPanel("Land Set:", FlowLayout.CENTER, Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands)); + private final FComboBoxPanel cbLandSet = new FComboBoxPanel<>("Land Set:", FlowLayout.CENTER, Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands)); private final MainPanel panel = new MainPanel(); private final LandPanel pnlPlains = new LandPanel("Plains"); @@ -313,7 +313,7 @@ public class AddBasicLandsDialog { cardName = cardName0; cardPanel = new LandCardPanel(); - cbLandArt = new FComboBox(); + cbLandArt = new FComboBox<>(); cbLandArt.setFont(cbLandSet.getFont()); cbLandArt.addActionListener(new ActionListener() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java index 3fd7cf4f62b..80f2ac05ea1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java @@ -69,7 +69,7 @@ public enum CDeckEditorUI implements ICDoc { private final VTinyLeadersDecks vTinyLeadersDecks; CDeckEditorUI() { - screenChildControllers = new HashMap>(); + screenChildControllers = new HashMap<>(); this.cDetailPicture = new CDetailPicture(); this.vAllDecks = VAllDecks.SINGLETON_INSTANCE; this.vAllDecks.setCDetailPicture(cDetailPicture); @@ -163,7 +163,7 @@ public enum CDeckEditorUI implements ICDoc { private void moveSelectedItems(final ItemManager itemManager, final _MoveAction moveAction, final int maxQty) { if (maxQty == 0) { return; } - final ItemPool items = new ItemPool(itemManager.getGenericType()); + final ItemPool items = new ItemPool<>(itemManager.getGenericType()); for (final T item : itemManager.getSelectedItems()) { final int qty = Math.min(maxQty, itemManager.getItemCount(item)); if (qty > 0) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java index d82b0652b1c..4484002b868 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java @@ -85,8 +85,8 @@ public class DeckImport ex private final FCheckBox dateTimeCheck = new FCheckBox("Use only sets released before:", false); private final FCheckBox onlyCoreExpCheck = new FCheckBox("Use only core and expansion sets", true); - private final FComboBox monthDropdown = new FComboBox(); //don't need wrappers since skin can't change while this dialog is open - private final FComboBox yearDropdown = new FComboBox(); + private final FComboBox monthDropdown = new FComboBox<>(); //don't need wrappers since skin can't change while this dialog is open + private final FComboBox yearDropdown = new FComboBox<>(); private final DeckImportController controller; private final ACEditorBase host; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index 4fc4420725a..1e809ae2752 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -163,7 +163,7 @@ public abstract class ACEditorBase createPoolForItem(final TItem item, final int qty) { if (item == null || qty <= 0) { return null; } - final ItemPool pool = new ItemPool((Class)item.getClass()); + final ItemPool pool = new ItemPool<>((Class) item.getClass()); pool.add(item, qty); return pool; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java index 1271ca3925c..a6aff9b7132 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java @@ -63,7 +63,7 @@ public final class CEditorCommander extends CDeckEditor { private DragCell allDecksParent = null; private DragCell deckGenParent = null; - private List allSections = new ArrayList(); + private List allSections = new ArrayList<>(); private final ItemPool commanderPool; private final ItemPool normalPool; @@ -114,16 +114,16 @@ public final class CEditorCommander extends CDeckEditor { CardCollections decks = FModel.getDecks(); switch (gameType) { case TinyLeaders: - this.controller = new DeckController(decks.getTinyLeaders(), this, newCreator); + this.controller = new DeckController<>(decks.getTinyLeaders(), this, newCreator); break; case Brawl: - this.controller = new DeckController(decks.getBrawl(), this, newCreator); + this.controller = new DeckController<>(decks.getBrawl(), this, newCreator); break; case Oathbreaker: - this.controller = new DeckController(decks.getOathbreaker(), this, newCreator); + this.controller = new DeckController<>(decks.getOathbreaker(), this, newCreator); break; default: - this.controller = new DeckController(decks.getCommander(), this, newCreator); + this.controller = new DeckController<>(decks.getCommander(), this, newCreator); break; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java index 1acfb3064d5..eec8c20c98a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java @@ -58,7 +58,7 @@ import java.util.Map.Entry; */ public final class CEditorConstructed extends CDeckEditor { private DeckController controller; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); private ItemPool normalPool, avatarPool, planePool, schemePool, conspiracyPool, commanderPool; Predicate commanderFilter; @@ -149,19 +149,19 @@ public final class CEditorConstructed extends CDeckEditor { switch (this.gameType) { case Constructed: - this.controller = new DeckController(FModel.getDecks().getConstructed(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getConstructed(), this, newCreator); break; case Commander: - this.controller = new DeckController(FModel.getDecks().getCommander(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getCommander(), this, newCreator); break; case Oathbreaker: - this.controller = new DeckController(FModel.getDecks().getOathbreaker(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getOathbreaker(), this, newCreator); break; case Brawl: - this.controller = new DeckController(FModel.getDecks().getBrawl(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getBrawl(), this, newCreator); break; case TinyLeaders: - this.controller = new DeckController(FModel.getDecks().getTinyLeaders(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getTinyLeaders(), this, newCreator); break; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java index e2c6b928827..c35e194b880 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java @@ -62,7 +62,7 @@ public final class CEditorLimited extends CDeckEditor { private DragCell brawlDecksParent = null; private DragCell tinyLeadersDecksParent = null; private DragCell deckGenParent = null; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); //========== Constructor @@ -92,7 +92,7 @@ public final class CEditorLimited extends CDeckEditor { return new DeckGroup(""); } }; - this.controller = new DeckController(deckMap0, this, newCreator); + this.controller = new DeckController<>(deckMap0, this, newCreator); getBtnAddBasicLands().setCommand(new UiCommand() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index e502263eee2..9294853a1e9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -75,7 +75,7 @@ import java.util.Map.Entry; public final class CEditorQuest extends CDeckEditor { private final QuestController questData; private final DeckController controller; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); private DragCell allDecksParent = null; private DragCell deckGenParent = null; @@ -139,7 +139,7 @@ public final class CEditorQuest extends CDeckEditor { } }; - this.controller = new DeckController(questData0.getMyDecks(), this, newCreator); + this.controller = new DeckController<>(questData0.getMyDecks(), this, newCreator); getBtnAddBasicLands().setCommand(new UiCommand() { @Override @@ -158,7 +158,7 @@ public final class CEditorQuest extends CDeckEditor { // fills number of decks using each card private Map countDecksForEachCard() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); for (final Deck deck : this.questData.getMyDecks()) { for (final Entry e : deck.getMain()) { final PaperCard card = e.getKey(); @@ -393,7 +393,7 @@ public final class CEditorQuest extends CDeckEditor { //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? if(sectionMode == null) sectionMode = DeckSection.Main; - final Map colOverridesCatalog = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in @@ -428,8 +428,8 @@ public final class CEditorQuest extends CDeckEditor { public void update() { this.decksUsingMyCards = this.countDecksForEachCard(); - final Map colOverridesCatalog = new HashMap(); - final Map colOverridesDeck = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); + final Map colOverridesDeck = new HashMap<>(); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_DECK_EDITOR, colOverridesDeck, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java index 11e1c512e83..c730d6595c9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java @@ -209,8 +209,8 @@ public final class CEditorQuestCardShop extends ACEditorBase colOverridesCatalog = new HashMap(); - final Map colOverridesDeck = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); + final Map colOverridesDeck = new HashMap<>(); // Add spell shop-specific columns ItemTableColumn.addColOverride(ItemManagerConfig.SPELL_SHOP, colOverridesCatalog, ColumnDef.PRICE, QuestSpellShop.fnPriceCompare, QuestSpellShop.fnPriceGet); @@ -251,7 +251,7 @@ public final class CEditorQuestCardShop extends ACEditorBase ownedItems = new ItemPool(InventoryItem.class); + final ItemPool ownedItems = new ItemPool<>(InventoryItem.class); ownedItems.addAllOfType(this.questData.getCards().getCardpool().getView()); this.getCatalogManager().setPool(cardsForSale); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java index 0d75829e2dd..3b34554ccf9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java @@ -62,7 +62,7 @@ import java.util.Map.Entry; public final class CEditorQuestLimited extends CDeckEditor { private final QuestController questData; private final DeckController controller; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); private DragCell allDecksParent = null; private DragCell deckGenParent = null; @@ -118,7 +118,7 @@ public final class CEditorQuestLimited extends CDeckEditor { } }; - this.controller = new DeckController(questData0.getDraftDecks(), this, newCreator); + this.controller = new DeckController<>(questData0.getDraftDecks(), this, newCreator); controller.getView().getDeckManager().setup(ItemManagerConfig.DRAFT_POOL); controller.setModel(questData0.getDraftDecks().get(QuestEventDraft.DECK_NAME)); @@ -132,7 +132,7 @@ public final class CEditorQuestLimited extends CDeckEditor { // fills number of decks using each card private Map countDecksForEachCard() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); for (final Deck deck : this.questData.getMyDecks()) { for (final Entry e : deck.getMain()) { final PaperCard card = e.getKey(); @@ -234,8 +234,8 @@ public final class CEditorQuestLimited extends CDeckEditor { this.decksUsingMyCards = this.countDecksForEachCard(); - final Map colOverridesCatalog = new HashMap(); - final Map colOverridesDeck = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); + final Map colOverridesDeck = new HashMap<>(); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_DECK_EDITOR, colOverridesDeck, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java index a032572d708..6f09ba6e073 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java @@ -85,7 +85,7 @@ public final class CEditorVariant extends CDeckEditor { return new Deck(); } }; - this.controller = new DeckController(folder, this, newCreator); + this.controller = new DeckController<>(folder, this, newCreator); getBtnAddBasicLands().setCommand(new UiCommand() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java index 25cbfc46521..7a3fd676276 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java @@ -61,17 +61,17 @@ public enum CProbabilities implements ICDoc { final ACEditorBase ed = (ACEditorBase) CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController(); - if (ed == null) { return new ArrayList(); } + if (ed == null) { return new ArrayList<>(); } final ItemPool deck = ItemPool.createFrom(ed.getDeckManager().getPool(), PaperCard.class); - final List cardProbabilities = new ArrayList(); + final List cardProbabilities = new ArrayList<>(); final List shuffled = deck.toFlatList(); Collections.shuffle(shuffled, MyRandom.getRandom()); // Log totals of each card for decrementing - final Map cardTotals = new HashMap(); + final Map cardTotals = new HashMap<>(); for (final PaperCard c : shuffled) { if (cardTotals.containsKey(c)) { cardTotals.put(c, cardTotals.get(c) + 1); } else { cardTotals.put(c, 1); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java index 30b034a5de8..d3d2a19ae3e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java @@ -136,7 +136,7 @@ public class DeckController { } private HashMap groupByName(CardPool section) { - HashMap result = new HashMap(); + HashMap result = new HashMap<>(); for (Map.Entry entry : section) { PaperCard importedCard = entry.getKey(); @@ -190,7 +190,7 @@ public class DeckController { } private HashMap getBasicLandsByName(CardPool sourceSection) { - HashMap result = new HashMap(); + HashMap result = new HashMap<>(); for (Map.Entry entry : sourceSection) { PaperCard card = entry.getKey(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java index 21117a5c25b..1f1c8a47df4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java @@ -13,7 +13,7 @@ public class CDeckEditorUIMenus { private final boolean SHOW_ICONS = true; public List getMenus() { - List menus = new ArrayList(); + List menus = new ArrayList<>(); menus.add(DeckFileMenu.getMenu(SHOW_ICONS)); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java index fc09b9c4033..46e9d1c9748 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java @@ -27,7 +27,7 @@ public class CLobby { } private void addDecks(final Iterable commanderDecks, FList deckList, String... initialItems) { - Vector listData = new Vector(); + Vector listData = new Vector<>(); for (String item : initialItems) { listData.add(item); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java index d983a97902d..c6afcf7e625 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java @@ -75,8 +75,8 @@ public class PlayerPanel extends FPanel { private FRadioButton radioOpen; private FCheckBox chkReady; - private final FComboBoxWrapper teamComboBox = new FComboBoxWrapper(); - private final FComboBoxWrapper aeTeamComboBox = new FComboBoxWrapper(); + private final FComboBoxWrapper teamComboBox = new FComboBoxWrapper<>(); + private final FComboBoxWrapper aeTeamComboBox = new FComboBoxWrapper<>(); private final FLabel closeBtn; private final FLabel deckBtn = new FLabel.ButtonBuilder().text(localizer.getMessage("lblSelectaDeck")).build(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java index 3fe77120d36..99a38f3f046 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java @@ -85,9 +85,9 @@ public enum VHomeUI implements IVTopLevelUI { private final SkinColor clrTheme = FSkin.getColor(FSkin.Colors.CLR_THEME); private final SkinColor l00 = clrTheme.stepColor(0); - private final List> allSubmenus = new ArrayList>(); - private final Map allSubmenuLabels = new HashMap(); - private final Map allGroupLabels = new HashMap(); + private final List> allSubmenus = new ArrayList<>(); + private final Map allSubmenuLabels = new HashMap<>(); + private final Map allGroupLabels = new HashMap<>(); private final PnlMenu pnlMenu = new PnlMenu(); private final PnlDisplay pnlDisplay = new PnlDisplay(); @@ -144,7 +144,7 @@ public enum VHomeUI implements IVTopLevelUI { allSubmenus.add(VSubmenuReleaseNotes.SINGLETON_INSTANCE); // For each group: init its panel - final SortedMap allGroupPanels = new TreeMap(); + final SortedMap allGroupPanels = new TreeMap<>(); for (final EMenuGroup e : EMenuGroup.values()) { allGroupPanels.put(e, new PnlGroup()); allGroupPanels.get(e).setVisible(false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index 4fafd123966..7c0c978b0be 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -82,7 +82,7 @@ public class VLobby implements ILobbyView { // Player frame elements private final JPanel playersFrame = new JPanel(new MigLayout("insets 0, gap 0 5, wrap, hidemode 3")); private final FScrollPanel playersScroll = new FScrollPanel(new MigLayout("insets 0, gap 0, wrap, hidemode 3"), true); - private final List playerPanels = new ArrayList(MAX_PLAYERS); + private final List playerPanels = new ArrayList<>(MAX_PLAYERS); private final FLabel addPlayerBtn = new FLabel.ButtonBuilder().fontSize(14).text(localizer.getMessage("lblAddAPlayer")).build(); @@ -99,21 +99,21 @@ public class VLobby implements ILobbyView { private final List tinyLeadersDeckChoosers = Lists.newArrayListWithCapacity(MAX_PLAYERS); private final List brawlDeckChoosers = Lists.newArrayListWithCapacity(MAX_PLAYERS); - private final List> schemeDeckLists = new ArrayList>(); - private final List schemeDeckPanels = new ArrayList(MAX_PLAYERS); + private final List> schemeDeckLists = new ArrayList<>(); + private final List schemeDeckPanels = new ArrayList<>(MAX_PLAYERS); - private final List> planarDeckLists = new ArrayList>(); - private final List planarDeckPanels = new ArrayList(MAX_PLAYERS); + private final List> planarDeckLists = new ArrayList<>(); + private final List planarDeckPanels = new ArrayList<>(MAX_PLAYERS); - private final List> vgdAvatarLists = new ArrayList>(); - private final List vgdPanels = new ArrayList(MAX_PLAYERS); - private final List vgdAvatarDetails = new ArrayList(); - private final List vgdAllAvatars = new ArrayList(); - private final List vgdAllAiAvatars = new ArrayList(); - private final List nonRandomHumanAvatars = new ArrayList(); - private final List nonRandomAiAvatars = new ArrayList(); - private final Vector humanListData = new Vector(); - private final Vector aiListData = new Vector(); + private final List> vgdAvatarLists = new ArrayList<>(); + private final List vgdPanels = new ArrayList<>(MAX_PLAYERS); + private final List vgdAvatarDetails = new ArrayList<>(); + private final List vgdAllAvatars = new ArrayList<>(); + private final List vgdAllAiAvatars = new ArrayList<>(); + private final List nonRandomHumanAvatars = new ArrayList<>(); + private final List nonRandomAiAvatars = new ArrayList<>(); + private final Vector humanListData = new Vector<>(); + private final Vector aiListData = new Vector<>(); public boolean isForCommander() { return isForCommander; @@ -486,7 +486,7 @@ public class VLobby implements ILobbyView { deckPanel.add(new FLabel.Builder().text("Select " + formatName) .fontStyle(Font.BOLD).fontSize(14).fontAlign(SwingConstants.CENTER) .build(), "gaptop 10px, gapbottom 5px, growx, pushx"); - final FList deckList = new FList(); + final FList deckList = new FList<>(); deckList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); deckList.addListSelectionListener(selectionListener); @@ -902,7 +902,7 @@ public class VLobby implements ILobbyView { } List getPlayerNames() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final PlayerPanel pp : playerPanels) { names.add(pp.getPlayerName()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java index 949aa703f99..3d25bcd2d51 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java @@ -31,7 +31,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { SINGLETON_INSTANCE; private final VSubmenuGauntletBuild view = VSubmenuGauntletBuild.SINGLETON_INSTANCE; - private final List workingDecks = new ArrayList(); + private final List workingDecks = new ArrayList<>(); private final File openStartDir = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc); private final FileFilter filterDAT = new FileFilter() { @@ -169,7 +169,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { } private void dumpDecksIntoList() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : workingDecks) { names.add(d.getName()); @@ -211,7 +211,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { gd = new GauntletData(); } - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : workingDecks) { names.add(d.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java index a0bba9a7f20..e220842ad8e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java @@ -66,7 +66,7 @@ public enum CSubmenuGauntletContests implements ICDoc { private void updateData() { final File[] files = GauntletIO.getGauntletFilesLocked(); - final List data = new ArrayList(); + final List data = new ArrayList<>(); if (files != null) { for (final File f : files) { final GauntletData gd = GauntletIO.loadGauntlet(f); @@ -105,7 +105,7 @@ public enum CSubmenuGauntletContests implements ICDoc { final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java index aaf79e76226..a5ce391de90 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java @@ -92,7 +92,7 @@ public enum CSubmenuGauntletLoad implements ICDoc { private void updateData() { final File[] files = GauntletIO.getGauntletFilesUnlocked(null); - final List data = new ArrayList(); + final List data = new ArrayList<>(); for (final File f : files) { final GauntletData gd = GauntletIO.loadGauntlet(f); @@ -138,7 +138,7 @@ public enum CSubmenuGauntletLoad implements ICDoc { } }); - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java index 01d5ff3856e..237d7124593 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java @@ -68,7 +68,7 @@ public enum CSubmenuGauntletQuick implements ICDoc { }); // Find appropriate filename for new save, create and set new save file. - final List allowedDeckTypes = new ArrayList(); + final List allowedDeckTypes = new ArrayList<>(); if (view.getBoxColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.COLOR_DECK); } if (view.getBoxStandardColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.STANDARD_COLOR_DECK); } if (view.getBoxStandardGenDecks().isSelected()) { allowedDeckTypes.add(DeckType.STANDARD_CARDGEN_DECK); } @@ -83,7 +83,7 @@ public enum CSubmenuGauntletQuick implements ICDoc { final GauntletData gd = GauntletUtil.createQuickGauntlet(view.getLstDecks().getPlayer().getDeck(), view.getSliOpponents().getValue(), allowedDeckTypes, null); - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(gd.getDecks().get(gd.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java index e496a04cfcb..b02d5215ac2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java @@ -43,8 +43,8 @@ public class ContestGauntletLister extends JPanel { public void setGauntlets(final List gd0) { this.removeAll(); - final List tempRows = new ArrayList(); - final List sorted = new ArrayList(); + final List tempRows = new ArrayList<>(); + final List sorted = new ArrayList<>(); for (final GauntletData gd : gd0) { sorted.add(gd); } sorted.sort(new Comparator() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java index 3f02a3062f6..f610817ec5f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java @@ -62,8 +62,8 @@ public class QuickGauntletLister extends JPanel { public void refresh() { this.removeAll(); - final List tempRows = new ArrayList(); - final List sorted = new ArrayList(); + final List tempRows = new ArrayList<>(); + final List sorted = new ArrayList<>(); for (final GauntletData gd : gauntlets) { sorted.add(gd); } sorted.sort(new Comparator() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java index 8580dc6b133..69adbb2ae16 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java @@ -44,7 +44,7 @@ public enum VSubmenuGauntletBuild implements IVSubmenu { private final JPanel pnlDirections = new JPanel(); private final FDeckChooser lstLeft = new FDeckChooser(null, false, GameType.Constructed, false); - private final JList lstRight = new FList(); + private final JList lstRight = new FList<>(); private final FScrollPane scrRight = new FScrollPane(lstRight, true, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java index 1a843a739f7..8aa5bf49971 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java @@ -139,7 +139,7 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { */ @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(ConstructedGameMenu.getMenu()); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java index a63a0fd52f1..4544a5e040f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java @@ -48,7 +48,7 @@ public enum CSubmenuPuzzleCreate implements ICDoc, IMenuProvider { @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(PuzzleGameMenu.getMenu()); return menus; } @@ -104,7 +104,7 @@ public enum CSubmenuPuzzleCreate implements ICDoc, IMenuProvider { } }); - final List players = new ArrayList(); + final List players = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.getGuiPlayer()); human.setStartingHand(0); players.add(human); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java index e9490dffad6..29d2ea6db9c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java @@ -67,7 +67,7 @@ public enum CSubmenuPuzzleSolve implements ICDoc, IMenuProvider { @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(PuzzleGameMenu.getMenu()); return menus; } @@ -96,7 +96,7 @@ public enum CSubmenuPuzzleSolve implements ICDoc, IMenuProvider { } }); - final List players = new ArrayList(); + final List players = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.getGuiPlayer()); human.setStartingHand(0); players.add(human); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java index 5b0a3ad6750..b35b3edbe36 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java @@ -153,7 +153,7 @@ public enum CSubmenuChallenges implements ICDoc { view.getPnlChallenges().removeAll(); qCtrl.regenerateChallenges(); - final List challenges = new ArrayList(); + final List challenges = new ArrayList<>(); for(final Object id : qCtrl.getAchievements().getCurrentChallenges()) { challenges.add(qCtrl.getChallenges().get(id.toString())); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 6294c372932..01c5098a069 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -101,7 +101,7 @@ public enum CSubmenuQuestData implements ICDoc { @Override public void run() { customFormatCodes.clear(); - Set sets = new HashSet(); + Set sets = new HashSet<>(); for(GameFormat format:dialog.getSelectedFormats()){ sets.addAll(format.getAllowedSetCodes()); } @@ -133,7 +133,7 @@ public enum CSubmenuQuestData implements ICDoc { @Override public void run() { customPrizeFormatCodes.clear(); - Set sets = new HashSet(); + Set sets = new HashSet<>(); for(GameFormat format:dialog.getSelectedFormats()){ sets.addAll(format.getAllowedSetCodes()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java index 0edfa537401..bcf8dfe969d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java @@ -64,8 +64,8 @@ public class QuestFileLister extends JPanel { /** @param qd0   {@link forge.quest.data.QuestData}[] */ public void setQuests(List qd0) { this.removeAll(); - List tempRows = new ArrayList(); - List sorted = new ArrayList(); + List tempRows = new ArrayList<>(); + List sorted = new ArrayList<>(); for (QuestData qd : qd0) { sorted.add(qd); } sorted.sort(new Comparator() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java index a2ab6a55278..4c8ad44cf77 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java @@ -34,10 +34,10 @@ public enum VSubmenuChallenges implements IVSubmenu, IVQuest ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); private final StartButton btnStart = new StartButton(); - private final FComboBoxWrapper cbxPet = new FComboBoxWrapper(); + private final FComboBoxWrapper cbxPet = new FComboBoxWrapper<>(); private final FCheckBox cbPlant = new FCheckBox(localizer.getMessage("cbSummonPlant")); - private final FComboBoxWrapper cbxMatchLength = new FComboBoxWrapper(); + private final FComboBoxWrapper cbxMatchLength = new FComboBoxWrapper<>(); private final FLabel lblZep = new FLabel.Builder().text(localizer.getMessage("htmlLaunchZeppelin")) .hoverable(true).icon(FSkin.getIcon(FSkinProp.ICO_QUEST_ZEP)) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java index 0eb32eff473..f6ff91680be 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java @@ -73,7 +73,7 @@ public class ViewStall extends JPanel { this.pnlInventory = new JPanel(); this.scrInventory = new FScrollPane(this.pnlInventory, false); this.parentView = v0; - this.lstItemPanels = new ArrayList(); + this.lstItemPanels = new ArrayList<>(); // Component styling this.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java index 711dba75f69..99175befc18 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java @@ -20,7 +20,7 @@ import forge.view.FDialog; @SuppressWarnings("serial") public class AvatarSelector extends FDialog { - private final List selectables = new ArrayList(); + private final List selectables = new ArrayList<>(); private final Map avatarMap = FSkin.getAvatars(); public AvatarSelector(final String playerName, final int currentIndex, final Collection usedIndices) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java index b813ec6c381..668526600a9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java @@ -49,7 +49,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { */ @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(ConstructedGameMenu.getMenu()); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java index af71fda0b46..6b87e60fe4c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java @@ -160,7 +160,7 @@ public enum CSubmenuDraft implements ICDoc { throw new IllegalStateException("Draft: Computer deck is null!"); } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java index 52a56884ff9..22535e37f10 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java @@ -161,7 +161,7 @@ public enum CSubmenuSealed implements ICDoc { throw new IllegalStateException("Sealed: Computer deck is null!"); } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java index f247de68c7a..85cfe525d19 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java @@ -134,7 +134,7 @@ public enum CSubmenuWinston implements ICDoc { throw new IllegalStateException("Draft: Computer deck is null!"); } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java index 4111f83ba8b..da69fcadd8b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java @@ -46,7 +46,7 @@ public enum VSubmenuDraft implements IVSubmenu { private final JRadioButton radSingle = new FRadioButton(localizer.getMessage("lblPlayAnOpponent")); private final JRadioButton radAll = new FRadioButton(localizer.getMessage("lblPlayAll7opponents")); - private final JComboBox cbOpponent = new JComboBox(); + private final JComboBox cbOpponent = new JComboBox<>(); private final JLabel lblInfo = new FLabel.Builder() .fontAlign(SwingConstants.LEFT).fontSize(16).fontStyle(Font.BOLD) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java index 1aa9040fee7..dee2a078700 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java @@ -55,7 +55,7 @@ public enum VSubmenuSealed implements IVSubmenu { private final JRadioButton radSingle = new FRadioButton(localizer.getMessage("lblPlayAnOpponent")); private final JRadioButton radAll = new FRadioButton(localizer.getMessage("lblPlayAll7opponents")); - private final JComboBox cbOpponent = new JComboBox(); + private final JComboBox cbOpponent = new JComboBox<>(); private final FLabel lblInfo = new FLabel.Builder() .fontAlign(SwingConstants.LEFT).fontSize(16).fontStyle(Font.BOLD) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java index 790c98f2b62..147cfc32205 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java @@ -47,7 +47,7 @@ public enum VSubmenuWinston implements IVSubmenu { private final StartButton btnStart = new StartButton(); private final DeckManager lstDecks = new DeckManager(GameType.Winston, CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture()); - private final JList lstAI = new FList(); + private final JList lstAI = new FList<>(); private final JLabel lblInfo = new FLabel.Builder() .fontAlign(SwingConstants.LEFT).fontSize(16).fontStyle(Font.BOLD) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java index b8f40edaa71..0e075972619 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java @@ -63,7 +63,7 @@ public enum VSubmenuAchievements implements IVSubmenu { private final FLabel lblTitle = new FLabel.Builder() .text(localizer.getMessage("lblAchievements")).fontAlign(SwingConstants.CENTER) .opaque(true).fontSize(16).build(); - private final FComboBox cbCollections = new FComboBox(); + private final FComboBox cbCollections = new FComboBox<>(); private final TrophyCase trophyCase = new TrophyCase(); private final FScrollPane scroller = new FScrollPane(trophyCase, false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java index 44c3e2230b9..7a287619e01 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java @@ -239,9 +239,9 @@ public enum VSubmenuDownloaders implements IVSubmenu { String imagePath; int artIndex = 1; - ArrayList cis = new ArrayList(); + ArrayList cis = new ArrayList<>(); - HashMap cardCount = new HashMap(); + HashMap cardCount = new HashMap<>(); for (CardInSet c : e.getCards()) { if (cardCount.containsKey(c.name)) { cardCount.put(c.name, cardCount.get(c.name) + 1); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index dc80e578182..f6af4afd542 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -121,7 +121,7 @@ public final class CMatchUI private final TargetingOverlay targetingOverlay = new TargetingOverlay(this); private FCollectionView sortedPlayers; - private final Map avatarImages = new HashMap(); + private final Map avatarImages = new HashMap<>(); private boolean allHands; private boolean showOverlay = true; private JPopupMenu openAbilityMenu; @@ -140,7 +140,7 @@ public final class CMatchUI public CMatchUI() { this.view = new VMatchUI(this); this.screen = FScreen.getMatchScreen(this, view); - this.myDocs = new EnumMap>(EDocID.class); + this.myDocs = new EnumMap<>(EDocID.class); this.myDocs.put(EDocID.CARD_PICTURE, cDetailPicture.getCPicture().getView()); this.myDocs.put(EDocID.CARD_DETAIL, cDetailPicture.getCDetail().getView()); // only create an ante doc if playing for ante @@ -257,7 +257,7 @@ public final class CMatchUI final String[] indices = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(","); - final List fields = new ArrayList(); + final List fields = new ArrayList<>(); Singletons.getView().getLpnDocument().add(targetingOverlay.getPanel(), FView.TARGETING_LAYER); targetingOverlay.getPanel().setSize(Singletons.getControl().getDisplaySize()); @@ -285,7 +285,7 @@ public final class CMatchUI } private void initHandViews() { - final List hands = new ArrayList(); + final List hands = new ArrayList<>(); final Iterable localPlayers = getLocalPlayers(); int i = 0; @@ -613,7 +613,7 @@ public final class CMatchUI } } private List getVisibleCardPanels() { - final List panels = new ArrayList(); + final List panels = new ArrayList<>(); for (final VHand h : view.getHands()) { panels.addAll(h.getHandArea().getCardPanels()); } @@ -950,7 +950,7 @@ public final class CMatchUI return ImmutableMap.of(firstBlocker, damage); } - final AtomicReference> result = new AtomicReference>(); + final AtomicReference> result = new AtomicReference<>(); FThreads.invokeInEdtAndWait(new Runnable() { @Override public void run() { @@ -968,7 +968,7 @@ public final class CMatchUI // Sort players FCollectionView players = gameView.getPlayers(); if (players.size() == 2 && myPlayers != null && myPlayers.size() == 1 && myPlayers.get(0).equals(players.get(1))) { - players = new FCollection(new PlayerView[] { players.get(1), players.get(0) }); + players = new FCollection<>(new PlayerView[]{players.get(1), players.get(0)}); } initMatch(players, myPlayers); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java b/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java index 3d26d9e13a8..5400775c273 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java @@ -80,7 +80,7 @@ public class GameLogPanel extends JPanel { scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.getViewport().add(scrollablePanel); - layer = new JLayer(scrollPane, layerUI); + layer = new JLayer<>(scrollPane, layerUI); this.add(layer, "w 10:100%, h 100%"); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java index fb786da85bc..6f09994f068 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java @@ -63,7 +63,7 @@ public class QuestWinLoseCardViewer extends FPanel { */ public QuestWinLoseCardViewer(final List list) { this.list = Collections.unmodifiableList(list); - this.jList = new FList(new ChooserListModel()); + this.jList = new FList<>(new ChooserListModel()); this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.scroller = new FScrollPane(this.jList, false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index be3f8c4545b..922f4b6f5f2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -63,12 +63,12 @@ import forge.view.arcane.util.CardPanelMouseListener; public class TargetingOverlay { private final CMatchUI matchUI; private final OverlayPanel pnl = new OverlayPanel(); - private final List cardPanels = new ArrayList(); - private final List arcsFoeAtk = new ArrayList(); - private final List arcsFoeDef = new ArrayList(); - private final List arcsFriend = new ArrayList(); + private final List cardPanels = new ArrayList<>(); + private final List arcsFoeAtk = new ArrayList<>(); + private final List arcsFoeDef = new ArrayList<>(); + private final List arcsFriend = new ArrayList<>(); private final ArcAssembler assembler = new ArcAssembler(); - private final Set stackItemIDs = new HashSet(); + private final Set stackItemIDs = new HashSet<>(); private static class Arc { private final int x1, y1, x2, y2; @@ -88,7 +88,7 @@ public class TargetingOverlay { } } - private final Set cardsVisualized = new HashSet(); + private final Set cardsVisualized = new HashSet<>(); private CardPanel activePanel = null; //private long lastUpdated = System.currentTimeMillis(); // TODO: determine if timer is needed (see below) @@ -158,7 +158,7 @@ public class TargetingOverlay { //final Point docOffsets = FView.SINGLETON_INSTANCE.getLpnDocument().getLocationOnScreen(); // Locations of arc endpoint, per card, with ID as primary key. - final Map endpoints = new HashMap(); + final Map endpoints = new HashMap<>(); Point cardLocOnScreen; Point locOnScreen = this.getPanel().getLocationOnScreen(); @@ -306,7 +306,7 @@ public class TargetingOverlay { } private Map getCardEndpoints() { - final Map endpoints = new HashMap(); + final Map endpoints = new HashMap<>(); Point cardLocOnScreen; Point locOnScreen = this.getPanel().getLocationOnScreen(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java index 0a443bf09d0..ff70964091f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java @@ -34,11 +34,11 @@ public class VAutoYields extends FDialog { super(); setTitle("Auto-Yields"); - autoYields = new ArrayList(); + autoYields = new ArrayList<>(); for (final String autoYield : matchUI.getAutoYields()) { autoYields.add(autoYield); } - lstAutoYields = new FList(new AutoYieldsListModel()); + lstAutoYields = new FList<>(new AutoYieldsListModel()); int x = PADDING; int y = PADDING; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java index 5dd1062b2ce..9ff1370c329 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java @@ -29,8 +29,8 @@ import forge.view.FView; *

(V at beginning of class name denotes a view class.) */ public class VMatchUI implements IVTopLevelUI { - private List lstFields = new ArrayList(); - private List lstHands = new ArrayList(); + private List lstFields = new ArrayList<>(); + private List lstHands = new ArrayList<>(); // Other instantiations private final CMatchUI control; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java index e7aee4c1136..a8285aa86e3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java @@ -117,8 +117,8 @@ public class CHand implements ICDoc { ordering.addAll(cards); } - final List placeholders = new ArrayList(); - final List cardPanels = new ArrayList(); + final List placeholders = new ArrayList<>(); + final List cardPanels = new ArrayList<>(); for (final CardView card : ordering) { CardPanel cardPanel = p.getCardPanel(card.getId()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java index a744679411a..8fdcce87de6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java @@ -52,7 +52,7 @@ public class VAntes implements IVDoc { private final JPanel pnl = new JPanel(); private final FScrollPane scroller = new FScrollPane(pnl, false); - private final SortedSet allAntes = new TreeSet(); + private final SortedSet allAntes = new TreeSet<>(); //========== Constructor public VAntes(final CAntes controller) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java index ae85d6daf6e..a29442777f7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java @@ -181,7 +181,7 @@ public class VLog implements IVDoc { logEntries.removeAll(this.displayedLogEntries); return logEntries; } - return new ArrayList(); + return new ArrayList<>(); } private void addNewLogEntriesToJPanel(final List newLogEntries) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java b/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java index aa2a6ab9286..689a031cf28 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java +++ b/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java @@ -13,7 +13,7 @@ public class CWorkshopUIMenus { private final boolean SHOW_ICONS = true; public List getMenus() { - List menus = new ArrayList(); + List menus = new ArrayList<>(); menus.add(WorkshopFileMenu.getMenu(SHOW_ICONS)); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java index 38302668390..c0e1db5b9a2 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java @@ -11,7 +11,7 @@ import java.util.Map; * @author agetian */ class AsyncSoundRegistry { - static Map soundsPlayed = new HashMap(); + static Map soundsPlayed = new HashMap<>(); public synchronized static void registerSound(String soundName) { if (soundsPlayed.containsKey(soundName)) { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java b/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java index 103fdaa5ece..29f75a6f473 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java @@ -38,7 +38,7 @@ import java.util.StringTokenizer; */ public class CardFaceSymbols { /** Constant manaImages. */ - private static final Map MANA_IMAGES = new HashMap(); + private static final Map MANA_IMAGES = new HashMap<>(); private static final int manaImageSize = 13; diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java b/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java index d44e767be9d..3ef20e47667 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java @@ -26,7 +26,7 @@ public class FCheckBoxList extends JList { public FCheckBoxList(final boolean keepSelectionWhenFocusLost) { - setCellRenderer(new CellRenderer()); + setCellRenderer(new CellRenderer<>()); addMouseListener(new MouseAdapter() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java index 4e8f403e412..dde9c1ab5af 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java @@ -18,7 +18,7 @@ import forge.toolbox.FSkin.SkinnedLabel; @SuppressWarnings("serial") public class FComboBoxPanel extends JPanel { - private static final List> allPanels = new ArrayList>(); + private static final List> allPanels = new ArrayList<>(); public static void refreshAllSkins() { for (final FComboBoxPanel panel : allPanels) { @@ -48,7 +48,7 @@ public class FComboBoxPanel extends JPanel { this(comboBoxCaption0, flowLayout0); List list = ImmutableList.copyOf(items); - setComboBox(new FComboBox(list), list.get(0)); + setComboBox(new FComboBox<>(list), list.get(0)); } public void setComboBox(final FComboBox comboBox0, final E selectedItem) { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java index 29aa7a1528c..3f5ce9cbfb8 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java @@ -23,7 +23,7 @@ import forge.toolbox.FSkin.SkinFont; */ public class FComboBoxWrapper implements IComboBox { - private static final List> allWrappers = new ArrayList>(); + private static final List> allWrappers = new ArrayList<>(); public static void refreshAllSkins() { for (final FComboBoxWrapper wrapper : allWrappers) { @@ -37,7 +37,7 @@ public class FComboBoxWrapper implements IComboBox { public FComboBoxWrapper() { super(); - comboBox = new FComboBox(); + comboBox = new FComboBox<>(); allWrappers.add(this); } @@ -209,7 +209,7 @@ public class FComboBoxWrapper implements IComboBox { } //create copy of combo box - final FComboBox newComboBox = new FComboBox(); + final FComboBox newComboBox = new FComboBox<>(); for (int i = 0; i < comboBox.getItemCount(); i++) { newComboBox.addItem(comboBox.getItemAt(i)); } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java b/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java index 13b850f35c0..57b17e1a7f9 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java @@ -19,7 +19,7 @@ import forge.toolbox.FSkin.SkinnedLabel; public class FDigitalClock extends SkinnedLabel { private static final Calendar now = Calendar.getInstance(); private static final DateFormat timeFormatter = DateFormat.getTimeInstance(DateFormat.SHORT); - private static final List clocks = new ArrayList(); + private static final List clocks = new ArrayList<>(); private static Timer timer; private static String currentTimeDisplay; diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FList.java b/forge-gui-desktop/src/main/java/forge/toolbox/FList.java index b2f907c0828..a90d824112b 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FList.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FList.java @@ -44,7 +44,7 @@ public class FList extends SkinnedList { this.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); this.setSelectionForeground(this.getSkin().getForeground()); this.setFont(FSkin.getFont(12)); - this.setCellRenderer(new ComplexCellRenderer()); + this.setCellRenderer(new ComplexCellRenderer<>()); this.addFocusListener(new FocusListener() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java b/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java index 1dbd4a37590..01872d6b5f7 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java @@ -107,7 +107,7 @@ public class FOptionPane extends FDialog { txtInput = new FTextField.Builder().text(initialInput).build(); inputField = txtInput; } else { - cbInput = new FComboBox(inputOptions); + cbInput = new FComboBox<>(inputOptions); cbInput.setSelectedItem(initialInput); inputField = cbInput; } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java index 561ccd4897a..5d6946e78d2 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java @@ -170,7 +170,7 @@ public class FPanel extends FPanelBase implements ILocalRepaint { // More implementations can be added as necessary. // See drawForegroundScaled(). - final List implemented = new ArrayList(); + final List implemented = new ArrayList<>(); implemented.add(SwingConstants.BOTTOM); implemented.add(SwingConstants.CENTER); diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java index 79c32a486cc..bccc0c274d9 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java @@ -39,7 +39,7 @@ public class PlayerDetailsPanel extends JPanel { private final DetailLabel lblExile = new DetailLabel(FSkinProp.IMG_ZONE_EXILE, "Exile (%s)"); private final DetailLabel lblFlashback = new DetailLabel(FSkinProp.IMG_ZONE_FLASHBACK, "Flashback cards (%s)"); private final DetailLabel lblCommand = new DetailLabel(FSkinProp.IMG_PLANESWALKER, "Command zone (%s)"); - private final List> manaLabels = new ArrayList>(); + private final List> manaLabels = new ArrayList<>(); public PlayerDetailsPanel(final PlayerView player0) { player = player0; diff --git a/forge-gui-desktop/src/main/java/forge/view/FDialog.java b/forge-gui-desktop/src/main/java/forge/view/FDialog.java index f0e1d73ff35..76dfd9069af 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FDialog.java +++ b/forge-gui-desktop/src/main/java/forge/view/FDialog.java @@ -527,7 +527,7 @@ public class FDialog extends SkinnedDialog implements ITitleBarOwner, KeyEventDi return getIconImages().isEmpty() ? null : getIconImages().get(0); } - private static final Stack openModals = new Stack(); + private static final Stack openModals = new Stack<>(); private static final BackdropPanel backdropPanel = new BackdropPanel(); public static boolean isModalOpen() { diff --git a/forge-gui-desktop/src/main/java/forge/view/FView.java b/forge-gui-desktop/src/main/java/forge/view/FView.java index 7dedd44ee6d..8e94854947f 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FView.java +++ b/forge-gui-desktop/src/main/java/forge/view/FView.java @@ -46,7 +46,7 @@ public enum FView { public static final Integer OVERLAY_LAYER = NAVIGATION_BAR_REVEAL_LAYER - 1; public static final Integer TARGETING_LAYER = OVERLAY_LAYER - 1; - private final List allCells = new ArrayList(); + private final List allCells = new ArrayList<>(); private SplashFrame frmSplash; // Top-level UI components; all have getters. @@ -139,17 +139,17 @@ public enum FView { { // get profile directories -- if one of them is actually under the res directory, don't // count is as data to migrate - final Set profileDirs = new HashSet(); + final Set profileDirs = new HashSet<>(); for (final String dname : ForgeConstants.PROFILE_DIRS) { profileDirs.add(new File(dname)); } - final List resDirs = new ArrayList(); + final List resDirs = new ArrayList<>(); for (final String resDir : Lists.newArrayList("decks", "gauntlet", "layouts", "pics", "preferences", "quest/data")) { resDirs.add(new File("res", resDir)); } - final Set doNotDeleteDirs = new HashSet(); + final Set doNotDeleteDirs = new HashSet<>(); for (final String dir : Lists.newArrayList("decks", "decks/constructed", "decks/draft", "decks/plane", "decks/scheme", "decks/sealed", "gauntlet", "layouts", "pics", "preferences", "quest/data")) { doNotDeleteDirs.add(new File("res", dir)); } @@ -165,7 +165,7 @@ public enum FView { } // assemble a list of remaining files. - final List remainingFiles = new LinkedList(); + final List remainingFiles = new LinkedList<>(); _addRemainingFiles(remainingFiles, resDirs, profileDirs, doNotDeleteDirs); // if any files remain, display them and make clear that they should be moved or @@ -356,8 +356,8 @@ public enum FView { // directories listed in profileDirs will not be searched // removes empty directories to reduce tree conflicts private static boolean _addRemainingFiles(final List remainingFiles, final List dirRoots, final Set profileDirs, final Set doNotDeleteDirs) { - final Deque stack = new LinkedList(dirRoots); - final Set seenDirs = new HashSet(); + final Deque stack = new LinkedList<>(dirRoots); + final Set seenDirs = new HashSet<>(); boolean ret = false; while (!stack.isEmpty()) { File cur = stack.peek(); @@ -459,7 +459,7 @@ public enum FView { * @return {@link java.util.List}<{@link forge.gui.framework.DragCell}> */ public List getDragCells() { - final List clone = new ArrayList(); + final List clone = new ArrayList<>(); clone.addAll(allCells); return clone; } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index e3d2270d7dd..f46f022fccb 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -79,7 +79,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl private final CMatchUI matchUI; private CardView card; private CardPanel attachedToPanel; - private List attachedPanels = new ArrayList(); + private List attachedPanels = new ArrayList<>(); private List stack; private boolean tapped; private double tappedAngle = 0; diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java index 9662888a354..7547f2d1878 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -48,7 +48,7 @@ public abstract class CardPanelContainer extends SkinnedPanel { private static final long serialVersionUID = -6400018234895548306L; private static final int DRAG_SMUDGE = 10; - private final List cardPanels = new ArrayList(); + private final List cardPanels = new ArrayList<>(); private final CMatchUI matchUI; private final FScrollPane scrollPane; @@ -59,7 +59,7 @@ public abstract class CardPanelContainer extends SkinnedPanel { private CardPanel mouseDownPanel; private CardPanel mouseDragPanel; - private final List listeners = new ArrayList(2); + private final List listeners = new ArrayList<>(2); private int mouseDragOffsetX, mouseDragOffsetY; private int intialMouseDragX = -1, intialMouseDragY; private boolean dragEnabled; diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java index bacbcd9d0c3..d686c6bb341 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java @@ -177,7 +177,7 @@ public abstract class FloatingCardArea extends CardArea { } protected void doRefresh() { - List cardPanels = new ArrayList(); + List cardPanels = new ArrayList<>(); Iterable cards = getCards(); if (cards != null) { for (final CardView card : cards) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index ff866a62f17..74e6e2e5a5d 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -40,7 +40,7 @@ import forge.util.collect.FCollection; public class FloatingZone extends FloatingCardArea { private static final long serialVersionUID = 1927906492186378596L; - private static final Map floatingAreas = new HashMap(); + private static final Map floatingAreas = new HashMap<>(); private static int getKey(final PlayerView player, final ZoneType zone) { return 40 * player.getId() + zone.hashCode(); @@ -124,7 +124,7 @@ public class FloatingZone extends FloatingCardArea { protected Iterable getCards() { Iterable zoneCards = player.getCards(zone); if ( zoneCards != null ) { - cardList = new FCollection(zoneCards); + cardList = new FCollection<>(zoneCards); if ( sortedByName ) { cardList.sort(comp); } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index acb07c234c3..212fd9032e1 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -62,9 +62,9 @@ public class ListCardArea extends FloatingCardArea { if (storedArea==null) { storedArea = new ListCardArea(matchUI); } - cardList = new ArrayList(); + cardList = new ArrayList<>(); for ( CardView cv : cardList0 ) { cardList.add(cv) ; } - moveableCards = new ArrayList(); // make sure moveable cards are in cardlist + moveableCards = new ArrayList<>(); // make sure moveable cards are in cardlist for ( CardView card : moveableCards0 ) { if ( cardList.contains(card) ) { moveableCards.add(card); @@ -90,8 +90,8 @@ public class ListCardArea extends FloatingCardArea { @Override public void actionPerformed(ActionEvent e) { window.setVisible(false); } }); window.add(doneButton,BorderLayout.SOUTH); - cardList = new ArrayList(cardList0); // this is modified - pfps - is there a better way? - moveableCards = new ArrayList(moveableCards0); + cardList = new ArrayList<>(cardList0); // this is modified - pfps - is there a better way? + moveableCards = new ArrayList<>(moveableCards0); title = title0; toTop = toTop0; toBottom = toBottom0; diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java index 070d3775bbd..291c02b1253 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java @@ -66,7 +66,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen private final boolean mirror; // Computed in layout. - private List rows = new ArrayList(); + private List rows = new ArrayList<>(); private int cardWidth, cardHeight; private int playAreaWidth, playAreaHeight; private int extraCardSpacingX, cardSpacingX, cardSpacingY; @@ -373,7 +373,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } private List tryArrangePilesOfWidth(final CardStackRow lands, final CardStackRow tokens, final CardStackRow creatures, CardStackRow others) { - List template = new ArrayList(); + List template = new ArrayList<>(); int afterFirstRow; @@ -400,7 +400,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen int cntOthers = others.size(); // Copy the template for the case 1st approach won't work - final List templateCopy = new ArrayList(template.size()); + final List templateCopy = new ArrayList<>(template.size()); for (final CardStackRow row : template) { templateCopy.add((CardStackRow) row.clone()); } @@ -554,7 +554,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen for (CardPanel p : stack) { if (p != panel && p.getCard() != null && p.getStack() == stack) { if (otherCardViewsToSelect == null) { - otherCardViewsToSelect = new ArrayList(); + otherCardViewsToSelect = new ArrayList<>(); } otherCardViewsToSelect.add(p.getCard()); } @@ -628,10 +628,10 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } } - final List toAdd = new ArrayList(modelCopy); + final List toAdd = new ArrayList<>(modelCopy); toAdd.removeAll(oldCards); - final List newPanels = new ArrayList(); + final List newPanels = new ArrayList<>(); for (final CardView card : toAdd) { final CardPanel placeholder = new CardPanel(getMatchUI(), card); placeholder.setDisplayEnabled(false); diff --git a/forge-gui-desktop/src/test/java/forge/CardRankerTest.java b/forge-gui-desktop/src/test/java/forge/CardRankerTest.java index 8083210629a..3ab71d505a0 100644 --- a/forge-gui-desktop/src/test/java/forge/CardRankerTest.java +++ b/forge-gui-desktop/src/test/java/forge/CardRankerTest.java @@ -24,7 +24,7 @@ public class CardRankerTest { @Test(timeOut = 1000, enabled = true) void testRank() { - List list = new ArrayList(); + List list = new ArrayList<>(); PaperCard c0 = readCard("makindi_patrol.txt"); list.add(c0); PaperCard c1 = readCard("hero_of_goma_fada.txt"); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index 628b9b6b160..725f114f550 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -50,7 +50,7 @@ public class GameWrapper { * Note that if you use this option, regular startup is ignored (using player deck, shuffling, drawing hand, mulligan, ...) */ public void runGame() { - List registeredPlayers = new ArrayList(); + List registeredPlayers = new ArrayList<>(); for( PlayerSpecification player : players ) { RegisteredPlayer registeredPlayer = new RegisteredPlayer(new Deck(player.getName())); LobbyPlayerForTests lobbyPlayer = new LobbyPlayerForTests( player.getName(), playerActions ); @@ -137,7 +137,7 @@ public class GameWrapper { //game.getAction().startGame( null ) determines starting player, draws starting hands, handles mulligans, and initiates the first turn //skip drawing initial hand and mulliganing game.setAge( GameStage.Play ); - final HashMap runParams = new HashMap(); + final HashMap runParams = new HashMap<>(); game.getTriggerHandler().runTrigger( TriggerType.NewGame, runParams, false ); //first player in the list starts, no coin toss etc game.getPhaseHandler().startFirstTurn( game.getPlayers().get( 0 ) ); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java index d99d5b1f11b..2c171929f5a 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java @@ -22,7 +22,7 @@ public class LobbyPlayerForTests extends LobbyPlayer implements IGameEntitiesFac public LobbyPlayerForTests(String name, PlayerActions playerActions) { super(name); - playerControllers = new HashMap(); + playerControllers = new HashMap<>(); this.playerActions = playerActions; } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index f8a0f1eff77..4e3b48f2917 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -123,7 +123,7 @@ public class PlayerControllerForTests extends PlayerController { (attacker.getName().equals("Grizzly Bears") && blockers.get(0).getName().equals("Ajani's Sunstriker")) || (attacker.getName().equals("Ajani's Sunstriker") && blockers.get(0).getName().equals("Grizzly Bears")) )) {//test_104_3b_player_with_less_than_zero_life_loses_the_game_only_when_a_player_receives_priority_variant_with_combat - Map result = new HashMap(); + Map result = new HashMap<>(); result.put(blockers.get(0), damageDealt); return result; } @@ -609,7 +609,7 @@ public class PlayerControllerForTests extends PlayerController { CardCollectionView untappedCards, boolean improvise) { // TODO: AI to choose a creature to tap would go here // Probably along with deciding how many creatures to tap - return new HashMap(); + return new HashMap<>(); } @Override diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java index 96bd43fa372..0eb86f53329 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java @@ -22,7 +22,7 @@ public abstract class SpecificationHandler findMatches(Iterable items, final SPECIFICATION specification, final IntegerConstraint expectedNumberOfResults) { - List matches = new ArrayList(); + List matches = new ArrayList<>(); for (TYPE item : items) { if (matches(item, specification)) { matches.add(item); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java index d4a1492db25..c4e2211fcab 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java @@ -12,8 +12,8 @@ public class GameStateSpecificationBuilder { private final Map playerFacts; public GameStateSpecificationBuilder() { - cards = new ArrayList(); - playerFacts = new HashMap(); + cards = new ArrayList<>(); + playerFacts = new HashMap<>(); } public GameStateSpecificationBuilder addCard( final CardSpecification cardSpecification ) { diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java index e52e001f0be..5dd9bfd73d7 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java @@ -12,8 +12,8 @@ public class DeclareAttackersAction extends BasePlayerAction { public DeclareAttackersAction( PlayerSpecification player ) { super( player ); - playerAttackAssignments = new HashMap(); - planeswalkerAttackAssignments = new HashMap(); + playerAttackAssignments = new HashMap<>(); + planeswalkerAttackAssignments = new HashMap<>(); } /** diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java index c891a034cae..acf1eb016b9 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java @@ -14,7 +14,7 @@ public class PlayerActions { private final List playerActions; public PlayerActions( List playerActions ) { - this.playerActions = new LinkedList( playerActions ); + this.playerActions = new LinkedList<>(playerActions); } public PlayerActions( BasePlayerAction... basePlayerActions ) { diff --git a/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java b/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java index 945058620db..e6518586ad4 100644 --- a/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java +++ b/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java @@ -15,7 +15,7 @@ public class ListChooserTest { */ @Test(groups = { "UnitTest", "fast" }, timeOut = 1000, enabled = false) public void listChooserTest1() { - final ListChooser c = new ListChooser("choose a or b", 0, 2, Arrays.asList("a", "b"), null); + final ListChooser c = new ListChooser<>("choose a or b", 0, 2, Arrays.asList("a", "b"), null); System.out.println(c.show()); for (final String s : c.getSelectedValues()) { System.out.println(s); diff --git a/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java b/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java index 1514efe2284..0569a0e343e 100644 --- a/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java +++ b/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java @@ -41,7 +41,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("assault_griffin.txt")); list.add(readCard("auramancer.txt")); @@ -61,7 +61,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("assault_griffin.txt")); list.add(readCard("scepter_of_empires.txt")); list.add(readCard("crown_of_empires.txt")); @@ -79,7 +79,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("acidic_slime.txt")); list.add(readCard("ajanis_sunstriker.txt")); @@ -96,7 +96,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("llanowar_elves.txt")); list.add(readCard("unsummon.txt")); @@ -125,7 +125,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("assault_griffin.txt")); list.add(readCard("breaker_of_armies.txt")); list.add(readCard("benthic_infiltrator.txt")); diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 6afce5fb824..0c1660c760b 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -47,7 +47,7 @@ public class Forge implements ApplicationListener { private static KeyInputAdapter keyInputAdapter; private static boolean exited; private static int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default - private static final Stack screens = new Stack(); + private static final Stack screens = new Stack<>(); private static boolean textureFiltering = false; private static boolean destroyThis = false; public static String extrawide = "default"; @@ -486,7 +486,7 @@ public class Forge implements ApplicationListener { } private static class MainInputProcessor extends FGestureAdapter { - private static final List potentialListeners = new ArrayList(); + private static final List potentialListeners = new ArrayList<>(); private static char lastKeyTyped; private static boolean keyTyped, shiftKeyDown; diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index 64ca50b75a7..58467efc9eb 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -27,7 +27,7 @@ public class Graphics { private final SpriteBatch batch = new SpriteBatch(); private final ShapeRenderer shapeRenderer = new ShapeRenderer(); - private final Stack transforms = new Stack(); + private final Stack transforms = new Stack<>(); private final Vector3 tmp = new Vector3(); private float regionHeight; private Rectangle bounds; diff --git a/forge-gui-mobile/src/forge/animation/ForgeAnimation.java b/forge-gui-mobile/src/forge/animation/ForgeAnimation.java index 0c285fff516..4ce7ceb42d3 100644 --- a/forge-gui-mobile/src/forge/animation/ForgeAnimation.java +++ b/forge-gui-mobile/src/forge/animation/ForgeAnimation.java @@ -8,7 +8,7 @@ import com.badlogic.gdx.Gdx; import forge.Forge; public abstract class ForgeAnimation { - private static final List activeAnimations = new ArrayList(); + private static final List activeAnimations = new ArrayList<>(); // A guard against inspecting activeAnimations while it's in the process of being edited private static boolean changingActiveAnimations = false; diff --git a/forge-gui-mobile/src/forge/animation/ForgeTransition.java b/forge-gui-mobile/src/forge/animation/ForgeTransition.java index 89fe4e7fd11..4e2fb125394 100644 --- a/forge-gui-mobile/src/forge/animation/ForgeTransition.java +++ b/forge-gui-mobile/src/forge/animation/ForgeTransition.java @@ -15,7 +15,7 @@ public class ForgeTransition extends ForgeAnimation { @Override protected void doLayout(final float width, final float height) { } }; - private static final Map transitionLookup = new LinkedHashMap(); + private static final Map transitionLookup = new LinkedHashMap<>(); public static void queue(final FDisplayObject obj, final Rectangle destBounds, final float duration, final Runnable onFinished) { queue(obj, destBounds, duration, 0, false, onFinished); @@ -87,7 +87,7 @@ public class ForgeTransition extends ForgeAnimation { private static class TransitionObject extends FDisplayObject { private final FDisplayObject originalObj; - private final LinkedList transitions = new LinkedList(); + private final LinkedList transitions = new LinkedList<>(); private TransitionObject(final FDisplayObject originalObj0) { originalObj = originalObj0; diff --git a/forge-gui-mobile/src/forge/animation/GifDecoder.java b/forge-gui-mobile/src/forge/animation/GifDecoder.java index 301bec02894..675d0018ed1 100644 --- a/forge-gui-mobile/src/forge/animation/GifDecoder.java +++ b/forge-gui-mobile/src/forge/animation/GifDecoder.java @@ -405,7 +405,7 @@ public class GifDecoder { protected void init() { status = STATUS_OK; frameCount = 0; - frames = new Vector(); + frames = new Vector<>(); gct = null; lct = null; } @@ -712,7 +712,7 @@ public class GifDecoder { } Texture texture = new Texture(target); - Array texReg = new Array(); + Array texReg = new Array<>(); for(h = 0; h < hzones; h++) { for(v = 0; v < vzones; v++) { diff --git a/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java b/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java index 768eb1e4efe..05234d5b1d6 100644 --- a/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java +++ b/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java @@ -237,7 +237,7 @@ import com.badlogic.gdx.utils.Array; buf.append("\t\n"); //CHARS - Array glyphs = new Array(256); + Array glyphs = new Array<>(256); for (int i=0; i getAllLanguages() { - final List allLanguages = new ArrayList(); + final List allLanguages = new ArrayList<>(); final FileHandle dir = Gdx.files.absolute(ForgeConstants.LANG_DIR); for (FileHandle languageFile : dir.list()) { diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index e39d143d014..4b1e202785a 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -28,8 +28,8 @@ import forge.screens.SplashScreen; import forge.toolbox.FProgressBar; public class FSkin { - private static final Map images = new HashMap(); - private static final Map avatars = new HashMap(); + private static final Map images = new HashMap<>(); + private static final Map avatars = new HashMap<>(); private static List allSkins; private static FileHandle preferredDir; @@ -98,7 +98,7 @@ public class FSkin { else { if (splashScreen != null) { if (allSkins == null) { //initialize - allSkins = new ArrayList(); + allSkins = new ArrayList<>(); final List skinDirectoryNames = getSkinDirectoryNames(); for (final String skinDirectoryName : skinDirectoryNames) { allSkins.add(WordUtils.capitalize(skinDirectoryName.replace('_', ' '))); @@ -173,7 +173,7 @@ public class FSkin { avatars.clear(); - final Map textures = new HashMap(); + final Map textures = new HashMap<>(); // Grab and test various sprite files. final FileHandle f1 = getDefaultSkinFile(SourceFile.ICONS.getFilename()); @@ -309,7 +309,7 @@ public class FSkin { * @return the skins */ public static List getSkinDirectoryNames() { - final List mySkins = new ArrayList(); + final List mySkins = new ArrayList<>(); final FileHandle dir = Gdx.files.absolute(ForgeConstants.SKINS_DIR); for (FileHandle skinFile : dir.list()) { diff --git a/forge-gui-mobile/src/forge/assets/FSkinColor.java b/forge-gui-mobile/src/forge/assets/FSkinColor.java index a5464aa8613..883088687f3 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinColor.java +++ b/forge-gui-mobile/src/forge/assets/FSkinColor.java @@ -69,8 +69,8 @@ public class FSkinColor { return new FSkinColor(c0, NO_BRIGHTNESS_DELTA, NO_STEP, NO_STEP, NO_ALPHA); } - private static final HashMap baseColors = new HashMap(); - private static final HashMap derivedColors = new HashMap(); + private static final HashMap baseColors = new HashMap<>(); + private static final HashMap derivedColors = new HashMap<>(); private static final int NO_BRIGHTNESS_DELTA = 0; private static final int NO_STEP = -999; //needs to be large negative since small negative values are valid private static final int NO_ALPHA = -1; diff --git a/forge-gui-mobile/src/forge/assets/FSkinFont.java b/forge-gui-mobile/src/forge/assets/FSkinFont.java index 5da5896c204..646a6df6920 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinFont.java +++ b/forge-gui-mobile/src/forge/assets/FSkinFont.java @@ -25,7 +25,7 @@ public class FSkinFont { private static final int MAX_FONT_SIZE = 72; private static final String TTF_FILE = "font1.ttf"; - private static final Map fonts = new HashMap(); + private static final Map fonts = new HashMap<>(); private static final GlyphLayout layout = new GlyphLayout(); static { diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 681e1dec9b3..6245e4ef2a4 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -51,7 +51,7 @@ import java.util.concurrent.TimeUnit; public class ImageCache { // short prefixes to save memory - private static final Set missingIconKeys = new HashSet(); + private static final Set missingIconKeys = new HashSet<>(); private static final LoadingCache cache = CacheBuilder.newBuilder() .maximumSize(400) .expireAfterAccess(15,TimeUnit.MINUTES) diff --git a/forge-gui-mobile/src/forge/assets/TextRenderer.java b/forge-gui-mobile/src/forge/assets/TextRenderer.java index 0b77c8341a5..d73a5b966fd 100644 --- a/forge-gui-mobile/src/forge/assets/TextRenderer.java +++ b/forge-gui-mobile/src/forge/assets/TextRenderer.java @@ -16,7 +16,7 @@ import forge.util.TextBounds; //Encodes text for drawing with symbols and reminder text public class TextRenderer { - private static final Map symbolLookup = new HashMap(); + private static final Map symbolLookup = new HashMap<>(); static { symbolLookup.put("C", FSkinImage.MANA_COLORLESS); symbolLookup.put("W", FSkinImage.MANA_W); @@ -77,8 +77,8 @@ public class TextRenderer { private float width, height, totalHeight; private FSkinFont baseFont, font; private boolean wrap, needClip; - private List pieces = new ArrayList(); - private List lineWidths = new ArrayList(); + private List pieces = new ArrayList<>(); + private List lineWidths = new ArrayList<>(); public TextRenderer() { this(false); diff --git a/forge-gui-mobile/src/forge/card/CardFaceSymbols.java b/forge-gui-mobile/src/forge/card/CardFaceSymbols.java index d48c69d4253..7a86a49966f 100644 --- a/forge-gui-mobile/src/forge/card/CardFaceSymbols.java +++ b/forge-gui-mobile/src/forge/card/CardFaceSymbols.java @@ -29,7 +29,7 @@ import java.util.StringTokenizer; public class CardFaceSymbols { public static final float FONT_SIZE_FACTOR = 0.85f; - private static final Map MANA_IMAGES = new HashMap(); + private static final Map MANA_IMAGES = new HashMap<>(); public static void loadImages() { for (int i = 0; i <= 20; i++) { diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index f9d3a2e40ef..88d6f1b28b2 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -273,7 +273,7 @@ public class CardImageRenderer { } private static void drawPtBox(Graphics g, CardView card, CardStateView state, Color[] colors, float x, float y, float w, float h) { - List pieces = new ArrayList(); + List pieces = new ArrayList<>(); if (state.isCreature()) { pieces.add(String.valueOf(state.getPower())); pieces.add("/"); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index e60b1faf7c7..aa898eb012f 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -133,7 +133,7 @@ public class CardRenderer { return Math.round(MANA_SYMBOL_SIZE + FSkinFont.get(12).getLineHeight() + 3 * FList.PADDING + 1); } - private static final Map cardArtCache = new HashMap(); + private static final Map cardArtCache = new HashMap<>(); public static final float CARD_ART_RATIO = 1.302f; public static final float CARD_ART_HEIGHT_PERCENTAGE = 0.43f; @@ -651,7 +651,7 @@ public class CardRenderer { private static void drawPtBox(Graphics g, CardView card, CardStateView details, Color color, float x, float y, float w, float h) { //use array of strings to render separately with a tiny amount of space in between //instead of using actual spaces which are too wide - List pieces = new ArrayList(); + List pieces = new ArrayList<>(); if (details.isCreature()) { pieces.add(String.valueOf(details.getPower())); pieces.add("/"); @@ -678,7 +678,7 @@ public class CardRenderer { FSkinFont font = FSkinFont.forHeight(h * 0.15f); float padding = Math.round(font.getCapHeight() / 4); float boxWidth = padding; - List pieceWidths = new ArrayList(); + List pieceWidths = new ArrayList<>(); for (String piece : pieces) { float pieceWidth = font.getBounds(piece).width + padding; pieceWidths.add(pieceWidth); diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index 72536fe686b..b3cdd3a599a 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -47,7 +47,7 @@ public class CardZoom extends FOverlay { private static boolean showAltState; public static void show(Object item) { - List items0 = new ArrayList(); + List items0 = new ArrayList<>(); items0.add(item); show(items0, 0, null); } diff --git a/forge-gui-mobile/src/forge/card/GameEntityPicker.java b/forge-gui-mobile/src/forge/card/GameEntityPicker.java index 6a18df6d474..d26f262d259 100644 --- a/forge-gui-mobile/src/forge/card/GameEntityPicker.java +++ b/forge-gui-mobile/src/forge/card/GameEntityPicker.java @@ -83,7 +83,7 @@ public class GameEntityPicker extends TabPageScreen { list.setListData(items); } else { - List filteredList = new ArrayList(); + List filteredList = new ArrayList<>(); for (GameEntityView option : items) { if (option.toString().toLowerCase().contains(pattern)) { filteredList.add(option); diff --git a/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java b/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java index 54d87c54410..a6a03bf06e9 100644 --- a/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java +++ b/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java @@ -61,7 +61,7 @@ public class AddBasicLandsDialog extends FDialog { private final Callback callback; private final FLabel lblLandSet = add(new FLabel.Builder().text("Land Set:").font(FSkinFont.get(12)).textColor(FLabel.INLINE_LABEL_COLOR).build()); - private final FComboBox cbLandSet = add(new FComboBox(Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands))); + private final FComboBox cbLandSet = add(new FComboBox<>(Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands))); private final FScrollPane scroller = add(new FScrollPane() { @Override @@ -312,7 +312,7 @@ public class AddBasicLandsDialog extends FDialog { private LandPanel(String cardName0) { cardName = cardName0; cardPanel = add(new LandCardPanel()); - cbLandArt = add(new FComboBox()); + cbLandArt = add(new FComboBox<>()); cbLandArt.setFont(cbLandSet.getFont()); cbLandArt.setChangedHandler(new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 0419df3c7ed..8f53bb83989 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -472,7 +472,7 @@ public class FDeckChooser extends FScreen { selectedDeckType = defaultDeckType; if (cmbDeckTypes == null) { //initialize components with delayed initialization the first time this is populated - cmbDeckTypes = new FComboBox(); + cmbDeckTypes = new FComboBox<>(); switch (lstDecks.getGameType()) { case Constructed: case Gauntlet: @@ -1015,7 +1015,7 @@ public class FDeckChooser extends FScreen { private List getSelectedDecksFromSavedState(String savedState) { try { if (StringUtils.isBlank(savedState)) { - return new ArrayList(); + return new ArrayList<>(); } else { return Arrays.asList(savedState.split(";")[1].split(SELECTED_DECK_DELIMITER)); @@ -1023,7 +1023,7 @@ public class FDeckChooser extends FScreen { } catch (Exception ex) { System.err.println(ex + " [savedState=" + savedState + "]"); - return new ArrayList(); + return new ArrayList<>(); } } @@ -1087,11 +1087,13 @@ public class FDeckChooser extends FScreen { deckTypes.remove(DeckType.VINTAGE_CARDGEN_DECK); } - ListChooser chooser = new ListChooser( + ListChooser chooser = new ListChooser<>( "Choose allowed deck types for opponents", 0, deckTypes.size(), deckTypes, null, new Callback>() { @Override public void run(final List allowedDeckTypes) { - if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { return; } + if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { + return; + } FThreads.invokeInBackgroundThread(new Runnable() { //needed for loading net decks @Override @@ -1112,7 +1114,7 @@ public class FDeckChooser extends FScreen { GauntletData gauntlet = GauntletUtil.createQuickGauntlet(userDeck, numOpponents, allowedDeckTypes, netCat); FModel.setGauntletData(gauntlet); - List players = new ArrayList(); + List players = new ArrayList<>(); RegisteredPlayer humanPlayer = new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer()); players.add(humanPlayer); players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); @@ -1140,10 +1142,10 @@ public class FDeckChooser extends FScreen { LoadingOverlay.show("Loading new game...", new Runnable() { @Override public void run() { - Set appliedVariants = new HashSet(); + Set appliedVariants = new HashSet<>(); appliedVariants.add(variant); - List players = new ArrayList(); + List players = new ArrayList<>(); RegisteredPlayer humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants, userDeck, null, false, null, null); humanPlayer.setPlayer(GamePlayerUtil.getGuiPlayer()); RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, aiDeck, null, false, null, null); @@ -1151,7 +1153,7 @@ public class FDeckChooser extends FScreen { players.add(humanPlayer); players.add(aiPlayer); - final Map guiMap = new HashMap(); + final Map guiMap = new HashMap<>(); guiMap.put(humanPlayer, MatchController.instance); final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index c3cb2a257b2..70be5c3361e 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -49,79 +49,79 @@ public class FDeckEditor extends TabPageScreen { private static final float HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f); public enum EditorType { - Constructed(new DeckController(FModel.getDecks().getConstructed(), new Supplier() { + Constructed(new DeckController<>(FModel.getDecks().getConstructed(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Draft(new DeckController(FModel.getDecks().getDraft(), new Supplier() { + Draft(new DeckController<>(FModel.getDecks().getDraft(), new Supplier() { @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - Sealed(new DeckController(FModel.getDecks().getSealed(), new Supplier() { + Sealed(new DeckController<>(FModel.getDecks().getSealed(), new Supplier() { @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - Winston(new DeckController(FModel.getDecks().getWinston(), new Supplier() { + Winston(new DeckController<>(FModel.getDecks().getWinston(), new Supplier() { @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - Commander(new DeckController(FModel.getDecks().getCommander(), new Supplier() { + Commander(new DeckController<>(FModel.getDecks().getCommander(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Oathbreaker(new DeckController(FModel.getDecks().getOathbreaker(), new Supplier() { + Oathbreaker(new DeckController<>(FModel.getDecks().getOathbreaker(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - TinyLeaders(new DeckController(FModel.getDecks().getTinyLeaders(), new Supplier() { + TinyLeaders(new DeckController<>(FModel.getDecks().getTinyLeaders(), new Supplier() { @Override public Deck get() { return new Deck(); } }), DeckFormat.TinyLeaders.isLegalCardPredicate()), - Brawl(new DeckController(FModel.getDecks().getBrawl(), new Supplier() { + Brawl(new DeckController<>(FModel.getDecks().getBrawl(), new Supplier() { @Override public Deck get() { return new Deck(); } }), DeckFormat.Brawl.isLegalCardPredicate()), - Archenemy(new DeckController(FModel.getDecks().getScheme(), new Supplier() { + Archenemy(new DeckController<>(FModel.getDecks().getScheme(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Planechase(new DeckController(FModel.getDecks().getPlane(), new Supplier() { + Planechase(new DeckController<>(FModel.getDecks().getPlane(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Quest(new DeckController(null, new Supplier() { //delay setting root folder until quest loaded + Quest(new DeckController<>(null, new Supplier() { //delay setting root folder until quest loaded @Override public Deck get() { return new Deck(); } }), null), - QuestDraft(new DeckController(null, new Supplier() { //delay setting root folder until quest loaded + QuestDraft(new DeckController<>(null, new Supplier() { //delay setting root folder until quest loaded @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - PlanarConquest(new DeckController(null, new Supplier() { //delay setting root folder until conquest loaded + PlanarConquest(new DeckController<>(null, new Supplier() { //delay setting root folder until conquest loaded @Override public Deck get() { return new Deck(); @@ -152,7 +152,7 @@ public class FDeckEditor extends TabPageScreen { filter = Predicates.and(filter, additionalFilter); } - ItemPool filteredPool = new ItemPool(PaperCard.class); + ItemPool filteredPool = new ItemPool<>(PaperCard.class); for (Entry entry : cardPool) { if (filter.apply(entry.getKey())) { filteredPool.add(entry.getKey(), entry.getValue()); @@ -733,7 +733,7 @@ public class FDeckEditor extends TabPageScreen { protected abstract void buildMenu(final FDropDownMenu menu, final PaperCard card); private ItemPool getAllowedAdditions(Iterable> itemsToAdd, boolean isAddSource) { - ItemPool additions = new ItemPool(cardManager.getGenericType()); + ItemPool additions = new ItemPool<>(cardManager.getGenericType()); CardLimit limit = parentScreen.getCardLimit(); Deck deck = parentScreen.getDeck(); @@ -1026,7 +1026,7 @@ public class FDeckEditor extends TabPageScreen { cardManager.setPool(ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard.FN_GET_RULES)), PaperCard.class), true); break; case Quest: - final ItemPool questPool = new ItemPool(PaperCard.class); + final ItemPool questPool = new ItemPool<>(PaperCard.class); questPool.addAll(FModel.getQuest().getCards().getCardpool()); // remove bottom cards that are in the deck from the card pool questPool.removeAll(parentScreen.getDeck().getMain()); @@ -1175,7 +1175,7 @@ public class FDeckEditor extends TabPageScreen { @Override public void handleEvent(FEvent e) { //sort options so current option is on top and selected by default - List sortedOptions = new ArrayList(); + List sortedOptions = new ArrayList<>(); sortedOptions.add(card); for (PaperCard option : artOptions) { if (option != card) { diff --git a/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java b/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java index e00e009a551..999d4568fe9 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java +++ b/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java @@ -49,8 +49,8 @@ public class FDeckImportDialog extends FDialog { */ private final FCheckBox onlyCoreExpCheck = add(new FCheckBox("Use only core and expansion sets", false)); - private final FComboBox monthDropdown = add(new FComboBox()); //don't need wrappers since skin can't change while this dialog is open - private final FComboBox yearDropdown = add(new FComboBox()); + private final FComboBox monthDropdown = add(new FComboBox<>()); //don't need wrappers since skin can't change while this dialog is open + private final FComboBox yearDropdown = add(new FComboBox<>()); private final boolean showOptions; private final DeckImportController controller; diff --git a/forge-gui-mobile/src/forge/itemmanager/CardManager.java b/forge-gui-mobile/src/forge/itemmanager/CardManager.java index bb0d0168cd0..6f194a42afc 100644 --- a/forge-gui-mobile/src/forge/itemmanager/CardManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/CardManager.java @@ -57,7 +57,7 @@ public class CardManager extends ItemManager { } public static AdvancedSearchFilter createAdvancedSearchFilter(final ItemManager itemManager) { - return new AdvancedSearchFilter(itemManager); + return new AdvancedSearchFilter<>(itemManager); } @Override diff --git a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java index f5f13203a10..d48e2a6e067 100644 --- a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java @@ -68,12 +68,12 @@ public final class DeckManager extends ItemManager implements IHasGam @Override protected TextSearchFilter createSearchFilter() { - return new TextSearchFilter(this); + return new TextSearchFilter<>(this); } @Override protected AdvancedSearchFilter createAdvancedSearchFilter() { - return new AdvancedSearchFilter(this); + return new AdvancedSearchFilter<>(this); } @Override diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index c8110863cb7..d2b9a769b79 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -63,7 +63,7 @@ public abstract class ItemManager extends FContainer im protected final ItemManagerModel model; private Predicate filterPredicate = null; private AdvancedSearchFilter advancedSearchFilter; - private final List> filters = new ArrayList>(); + private final List> filters = new ArrayList<>(); private boolean hideFilters = false; private boolean wantUnique = false; private boolean multiSelectMode = false; @@ -74,7 +74,7 @@ public abstract class ItemManager extends FContainer im private ItemManagerConfig config; private Function, Object> fnNewGet; private boolean viewUpdating, needSecondUpdate; - private List sortCols = new ArrayList(); + private List sortCols = new ArrayList<>(); private final TextSearchFilter searchFilter; @@ -89,7 +89,7 @@ public abstract class ItemManager extends FContainer im private final FComboBox cbxSortOptions; - private final List> views = new ArrayList>(); + private final List> views = new ArrayList<>(); private final ItemListView listView; private final ImageView imageView; private ItemView currentView; @@ -106,11 +106,11 @@ public abstract class ItemManager extends FContainer im protected ItemManager(final Class genericType0, final boolean wantUnique0) { genericType = genericType0; wantUnique = wantUnique0; - model = new ItemManagerModel(genericType0); + model = new ItemManagerModel<>(genericType0); searchFilter = createSearchFilter(); - listView = new ItemListView(this, model); + listView = new ItemListView<>(this, model); imageView = createImageView(model); views.add(listView); @@ -125,7 +125,7 @@ public abstract class ItemManager extends FContainer im add(btnAdvancedSearchOptions); btnAdvancedSearchOptions.setSelected(!hideFilters); if (allowSortChange()) { - cbxSortOptions = add(new FComboBox("Sort: ")); + cbxSortOptions = add(new FComboBox<>("Sort: ")); cbxSortOptions.setFont(FSkinFont.get(12)); } else { @@ -205,7 +205,7 @@ public abstract class ItemManager extends FContainer im } protected ImageView createImageView(final ItemManagerModel model0) { - return new ImageView(this, model0); + return new ImageView<>(this, model0); } public ItemManagerConfig getConfig() { @@ -220,7 +220,7 @@ public abstract class ItemManager extends FContainer im setWantUnique(config0.getUniqueCardsOnly()); //ensure sort cols ordered properly - final List cols = new LinkedList(); + final List cols = new LinkedList<>(); for (ItemColumnConfig colConfig : config.getCols().values()) { if (colOverrides == null || !colOverrides.containsKey(colConfig.getDef())) { cols.add(new ItemColumn(colConfig)); @@ -437,7 +437,7 @@ public abstract class ItemManager extends FContainer im } public ItemPool getSelectedItemPool() { - ItemPool selectedItemPool = new ItemPool(genericType); + ItemPool selectedItemPool = new ItemPool<>(genericType); if (currentView == listView) { for (T item : getSelectedItems()) { selectedItemPool.add(item, getItemCount(item)); @@ -475,7 +475,7 @@ public abstract class ItemManager extends FContainer im } public boolean setSelectedStrings(Iterable strings) { - List items = new ArrayList(); + List items = new ArrayList<>(); for (String str : strings) { T item = stringToItem(str); if (item != null) { @@ -486,7 +486,7 @@ public abstract class ItemManager extends FContainer im } public boolean selectItemEntrys(Iterable> itemEntrys) { - List items = new ArrayList(); + List items = new ArrayList<>(); for (Entry itemEntry : itemEntrys) { items.add(itemEntry.getKey()); } @@ -521,7 +521,7 @@ public abstract class ItemManager extends FContainer im if (isUnfiltered()) { model.addItem(item, qty); } - List items = new ArrayList(); + List items = new ArrayList<>(); items.add(item); updateView(false, items); } @@ -532,7 +532,7 @@ public abstract class ItemManager extends FContainer im model.addItems(itemsToAdd); } - List items = new ArrayList(); + List items = new ArrayList<>(); for (Map.Entry item : itemsToAdd) { items.add(item.getKey()); } @@ -695,7 +695,7 @@ public abstract class ItemManager extends FContainer im public boolean applyFilters() { if (lockFiltering || !initialized) { return false; } - List> predicates = new ArrayList>(); + List> predicates = new ArrayList<>(); for (ItemFilter filter : filters) { if (!filter.isEmpty()) { predicates.add(filter.buildPredicate(genericType)); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java index b01dfcc9a9a..58327e7245c 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -35,12 +35,12 @@ public class AdvancedSearchFilter extends ItemFilter public AdvancedSearchFilter(ItemManager itemManager0) { super(itemManager0); - model = new AdvancedSearch.Model(); + model = new AdvancedSearch.Model<>(); } @Override public ItemFilter createCopy() { - AdvancedSearchFilter copy = new AdvancedSearchFilter(itemManager); + AdvancedSearchFilter copy = new AdvancedSearchFilter<>(itemManager); return copy; } diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java index c4e657e1ca0..7fac6999178 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java @@ -38,7 +38,7 @@ public class CardTypeFilter extends StatTypeFilter { @Override protected final Predicate buildPredicate() { - final List> types = new ArrayList>(); + final List> types = new ArrayList<>(); for (StatTypes s : buttonMap.keySet()) { if (s.predicate != null && buttonMap.get(s).isSelected()) { diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java index d83ff7dd814..3d4001e3818 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java @@ -10,7 +10,7 @@ import java.util.Set; public class DeckFolderFilter extends ListLabelFilter { - protected final Set folders = new HashSet(); + protected final Set folders = new HashSet<>(); public DeckFolderFilter(ItemManager itemManager0) { super(itemManager0); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java index fbd78453c3b..b1e89e6c20d 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java @@ -31,7 +31,7 @@ public abstract class FormatFilter extends ItemFilter cbxFormats = new FComboBox(); + private FComboBox cbxFormats = new FComboBox<>(); public FormatFilter(ItemManager itemManager0) { super(itemManager0); @@ -122,8 +122,8 @@ public abstract class FormatFilter extends ItemFilter selectedSets = new HashSet(); - private final FGroupList lstSets = add(new FGroupList()); + private final Set selectedSets = new HashSet<>(); + private final FGroupList lstSets = add(new FGroupList<>()); private MultiSetSelect() { super("Choose Sets"); @@ -177,8 +177,8 @@ public abstract class FormatFilter extends ItemFilter canCloseCallback) { if (selectedSets.size() > 0) { - List setCodes = new ArrayList(); - List sortedSets = new ArrayList(selectedSets); + List setCodes = new ArrayList<>(); + List sortedSets = new ArrayList<>(selectedSets); Collections.sort(sortedSets); for (CardEdition set : sortedSets) { setCodes.add(set.getCode()); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java b/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java index 10e27b27a48..ad7831603fa 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java @@ -24,7 +24,7 @@ import java.util.Set; public class HistoricFormatSelect extends FScreen { private GameFormat selectedFormat; - private final FGroupList lstFormats = add(new FGroupList()); + private final FGroupList lstFormats = add(new FGroupList<>()); private final Set historicSubTypes = new HashSet<>(Arrays.asList(GameFormat.FormatSubType.Block, GameFormat.FormatSubType.Standard,GameFormat.FormatSubType.Extended,GameFormat.FormatSubType.Modern, GameFormat.FormatSubType.Legacy, GameFormat.FormatSubType.Vintage)); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java index c93f419b0b5..b2d4ac67f60 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java @@ -18,7 +18,7 @@ public abstract class StatTypeFilter extends ToggleButt public StatTypeFilter(ItemManager itemManager0) { super(itemManager0); - buttonMap = new HashMap(); + buttonMap = new HashMap<>(); } protected void addToggleButton(Widget widget, final StatTypes st) { diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java index f1237a7ca37..c2cac6fdcdf 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java @@ -25,7 +25,7 @@ public class TextSearchFilter extends ItemFilter { @Override public ItemFilter createCopy() { - TextSearchFilter copy = new TextSearchFilter(itemManager); + TextSearchFilter copy = new TextSearchFilter<>(itemManager); copy.getWidget(); //initialize widget copy.txtSearch.setText(this.txtSearch.getText()); return copy; diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java index dc78154a668..61f986c9c38 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java @@ -16,7 +16,7 @@ import forge.toolbox.FLabel; public abstract class ToggleButtonsFilter extends ItemFilter { protected boolean lockFiltering; - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); protected ToggleButtonsFilter(ItemManager itemManager0) { super(itemManager0); diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index 9c5d81b57c4..199d7bc3280 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -55,7 +55,7 @@ public class ImageView extends ItemView { private static final int MIN_COLUMN_COUNT = 1; private static final int MAX_COLUMN_COUNT = 10; - private final List selectedIndices = new ArrayList(); + private final List selectedIndices = new ArrayList<>(); private int columnCount = 4; private float scrollHeight = 0; private ColumnDef pileBy = null; @@ -63,8 +63,8 @@ public class ImageView extends ItemView { private ItemInfo focalItem; private boolean updatingLayout; private float totalZoomAmount; - private final List orderedItems = new ArrayList(); - private final List groups = new ArrayList(); + private final List orderedItems = new ArrayList<>(); + private final List groups = new ArrayList<>(); private class ExpandCollapseButton extends FLabel { private boolean isAllCollapsed; @@ -135,8 +135,8 @@ public class ImageView extends ItemView { } } private final ExpandCollapseButton btnExpandCollapseAll = new ExpandCollapseButton(); - private final FComboBox cbGroupByOptions = new FComboBox("Groups: "); - private final FComboBox cbPileByOptions = new FComboBox("Piles: "); + private final FComboBox cbGroupByOptions = new FComboBox<>("Groups: "); + private final FComboBox cbPileByOptions = new FComboBox<>("Piles: "); public ImageView(ItemManager itemManager0, ItemManagerModel model0) { super(itemManager0, model0); @@ -424,7 +424,7 @@ public class ImageView extends ItemView { if (forRefresh && pileBy != null) { //refresh piles if needed //use TreeMap to build pile set so iterating below sorts on key ColumnDef groupPileBy = groupBy == null ? pileBy : groupBy.getGroupPileBy(i, pileBy); - Map, Pile> piles = new TreeMap, Pile>(); + Map, Pile> piles = new TreeMap<>(); for (ItemInfo itemInfo : group.items) { Comparable key = groupPileBy.fnSort.apply(itemInfo); if (!piles.containsKey(key)) { @@ -761,8 +761,8 @@ public class ImageView extends ItemView { } private class Group extends FScrollPane { - private final List items = new ArrayList(); - private final List piles = new ArrayList(); + private final List items = new ArrayList<>(); + private final List piles = new ArrayList<>(); private final String name; private boolean isCollapsed; private float scrollWidth; @@ -879,7 +879,7 @@ public class ImageView extends ItemView { } } private class Pile extends FDisplayObject { - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); @Override public void draw(Graphics g) { diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java index 6caade0e233..0b7b2f5d076 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java @@ -46,7 +46,7 @@ public final class ItemListView extends ItemView { private final ItemList list = new ItemList(); private final ItemListModel listModel; - private List selectedIndices = new ArrayList(); + private List selectedIndices = new ArrayList<>(); public ItemListModel getListModel() { return listModel; diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java index dd8ce179d02..ed20f675273 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java @@ -144,7 +144,7 @@ public abstract class ItemView { } public final Collection getSelectedItems() { - List items = new ArrayList(); + List items = new ArrayList<>(); for (Integer i : getSelectedIndices()) { T item = getItemAtIndex(i); if (item != null) { @@ -170,7 +170,7 @@ public abstract class ItemView { return setSelectedItems(items, true); } public final boolean setSelectedItems(Iterable items, boolean scrollIntoView) { - List indices = new ArrayList(); + List indices = new ArrayList<>(); for (T item : items) { int index = getIndexOfItem(item); if (index != -1) { @@ -199,7 +199,7 @@ public abstract class ItemView { if (index < 0) { if (index == -1 && minSelections == 0) { //allow passing -1 to clear selection if no selection allowed if (getSelectionCount() > 0) { - onSetSelectedIndices(new ArrayList()); + onSetSelectedIndices(new ArrayList<>()); onSelectionChange(); } return; @@ -225,7 +225,7 @@ public abstract class ItemView { int count = getCount(); if (count == 0) { return; } - List indexList = new ArrayList(); + List indexList = new ArrayList<>(); for (Integer index : indices) { if (index >= 0 && index < count) { indexList.add(index); diff --git a/forge-gui-mobile/src/forge/menu/FDropDownMenu.java b/forge-gui-mobile/src/forge/menu/FDropDownMenu.java index 7385252fb5d..62a9946557a 100644 --- a/forge-gui-mobile/src/forge/menu/FDropDownMenu.java +++ b/forge-gui-mobile/src/forge/menu/FDropDownMenu.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; public abstract class FDropDownMenu extends FDropDown { - protected final List items = new ArrayList(); + protected final List items = new ArrayList<>(); public FDropDownMenu() { } diff --git a/forge-gui-mobile/src/forge/menu/FMenuBar.java b/forge-gui-mobile/src/forge/menu/FMenuBar.java index bafe533c0ef..7b9f8f05b58 100644 --- a/forge-gui-mobile/src/forge/menu/FMenuBar.java +++ b/forge-gui-mobile/src/forge/menu/FMenuBar.java @@ -7,7 +7,7 @@ import forge.Graphics; import forge.screens.FScreen.Header; public class FMenuBar extends Header { - private final List tabs = new ArrayList(); + private final List tabs = new ArrayList<>(); public void addTab(String text0, FDropDown dropDown0) { FMenuTab tab = new FMenuTab(text0, this, dropDown0, tabs.size()); diff --git a/forge-gui-mobile/src/forge/screens/TabPageScreen.java b/forge-gui-mobile/src/forge/screens/TabPageScreen.java index dfc82512daf..64ab47cdb69 100644 --- a/forge-gui-mobile/src/forge/screens/TabPageScreen.java +++ b/forge-gui-mobile/src/forge/screens/TabPageScreen.java @@ -32,7 +32,7 @@ public class TabPageScreen> extends FScreen { } public TabPageScreen(TabPage[] tabPages0, boolean showBackButton) { - this(new TabHeader(tabPages0, showBackButton)); + this(new TabHeader<>(tabPages0, showBackButton)); } public TabPageScreen(TabHeader tabHeader0) { @@ -44,7 +44,7 @@ public class TabPageScreen> extends FScreen { public TabPageScreen(String headerCaption, FPopupMenu menu, TabPage[] tabPages0) { super(headerCaption, menu); - tabHeader = add(new TabHeader(tabPages0, false)); + tabHeader = add(new TabHeader<>(tabPages0, false)); tabHeader.showBottomBorder = false; tabPages = tabHeader.tabPages; initialize(); @@ -52,7 +52,7 @@ public class TabPageScreen> extends FScreen { public TabPageScreen(String headerCaption, FPopupMenu menu, TabPage[] tabPages0, boolean alwaysRenderHorizontal) { super(headerCaption, menu); - tabHeader = add(new TabHeader(tabPages0, false)); + tabHeader = add(new TabHeader<>(tabPages0, false)); tabHeader.showBottomBorder = false; tabHeader.alwaysRenderHorizontal = alwaysRenderHorizontal; tabPages = tabHeader.tabPages; diff --git a/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java b/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java index 990090d343d..509bb367179 100644 --- a/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java +++ b/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java @@ -45,7 +45,7 @@ public class AchievementsScreen extends FScreen { Forge.openScreen(achievementsScreen); } - private final FComboBox cbCollections = add(new FComboBox()); + private final FComboBox cbCollections = add(new FComboBox<>()); private final TrophyCase trophyCase = add(new TrophyCase()); private AchievementsScreen() { diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index c985b091fa4..79109f1343d 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -55,9 +55,9 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { // Variants frame and variables private final FLabel lblVariants = new FLabel.Builder().text("Variants:").font(VARIANTS_FONT).build(); - private final FComboBox cbVariants = new FComboBox(); + private final FComboBox cbVariants = new FComboBox<>(); - private final List playerPanels = new ArrayList(MAX_PLAYERS); + private final List playerPanels = new ArrayList<>(MAX_PLAYERS); private final FScrollPane playersScroll = new FScrollPane() { @Override protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { @@ -87,7 +87,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { btnStart.setEnabled(false); //disable start button until decks loaded add(lblPlayers); - cbPlayerCount = add(new FComboBox()); + cbPlayerCount = add(new FComboBox<>()); cbPlayerCount.setFont(VARIANTS_FONT); for (int i = 2; i <= MAX_PLAYERS; i++) { cbPlayerCount.addItem(i); @@ -322,7 +322,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { } List getPlayerNames() { - List names = new ArrayList(); + List names = new ArrayList<>(); for (PlayerPanel pp : playerPanels) { names.add(pp.getPlayerName()); } @@ -341,7 +341,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { //========== Various listeners in build order private class MultiVariantSelect extends FScreen { - private final FList lstVariants = add(new FList()); + private final FList lstVariants = add(new FList<>()); private MultiVariantSelect() { super("Select Variants"); diff --git a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java index b1f2c67e1e9..22a48093b2e 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java @@ -64,8 +64,8 @@ public class PlayerPanel extends FContainer { private final FToggleSwitch humanAiSwitch; private final FToggleSwitch devModeSwitch; - private FComboBox cbTeam = new FComboBox(); - private FComboBox cbArchenemyTeam = new FComboBox(); + private FComboBox cbTeam = new FComboBox<>(); + private FComboBox cbArchenemyTeam = new FComboBox<>(); private final FLabel btnDeck = new FLabel.ButtonBuilder().text("Loading Deck...").build(); private final FLabel btnSchemeDeck = new FLabel.ButtonBuilder().text("Scheme Deck: Random Generated Deck").build(); diff --git a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java index 5df4b89ef06..59cc9a377f5 100644 --- a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java +++ b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java @@ -74,7 +74,7 @@ public class LoadGauntletScreen extends LaunchScreen { public void onActivate() { final File[] files = GauntletIO.getGauntletFilesUnlocked(null); - final List data = new ArrayList(); + final List data = new ArrayList<>(); for (final File f : files) { GauntletData gd = GauntletIO.loadGauntlet(f); @@ -137,7 +137,7 @@ public class LoadGauntletScreen extends LaunchScreen { @Override public void run() { final GauntletData gauntlet = FModel.getGauntletData(); - List players = new ArrayList(); + List players = new ArrayList<>(); RegisteredPlayer humanPlayer = new RegisteredPlayer(gauntlet.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); players.add(humanPlayer); players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); @@ -294,7 +294,7 @@ public class LoadGauntletScreen extends LaunchScreen { } public void refresh() { - List sorted = new ArrayList(); + List sorted = new ArrayList<>(); for (GauntletData gauntlet : gauntlets) { sorted.add(gauntlet); } diff --git a/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java b/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java index 58b5b19c993..ad7b5de1967 100644 --- a/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java +++ b/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java @@ -81,7 +81,7 @@ public class NewGauntletScreen extends LaunchScreen { public void run(final Integer numOpponents) { if (numOpponents == null) { return; } - ListChooser chooser = new ListChooser( + ListChooser chooser = new ListChooser<>( "Choose allowed deck types for opponents", 0, 11, Arrays.asList(DeckType.CUSTOM_DECK, DeckType.PRECONSTRUCTED_DECK, DeckType.QUEST_OPPONENT_DECK, @@ -95,12 +95,16 @@ public class NewGauntletScreen extends LaunchScreen { DeckType.THEME_DECK), null, new Callback>() { @Override public void run(final List allowedDeckTypes) { - if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { return; } + if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { + return; + } FDeckChooser.promptForDeck("Select Your Deck", GameType.Gauntlet, false, new Callback() { @Override public void run(Deck userDeck) { - if (userDeck == null) { return; } + if (userDeck == null) { + return; + } GauntletData gauntlet = GauntletUtil.createQuickGauntlet(userDeck, numOpponents, allowedDeckTypes, null); launchGauntlet(gauntlet); @@ -120,7 +124,7 @@ public class NewGauntletScreen extends LaunchScreen { if (numOpponents == null) { return; } GauntletData gauntlet = new GauntletData(); - gauntlet.setDecks(new ArrayList()); + gauntlet.setDecks(new ArrayList<>()); promptForAiDeck(gauntlet, numOpponents); } }); @@ -158,7 +162,7 @@ public class NewGauntletScreen extends LaunchScreen { private void createGauntletContest() { final File[] files = GauntletIO.getGauntletFilesLocked(); - final List contests = new ArrayList(); + final List contests = new ArrayList<>(); for (final File f : files) { GauntletData gd = GauntletIO.loadGauntlet(f); if (gd != null) { @@ -178,8 +182,8 @@ public class NewGauntletScreen extends LaunchScreen { //create copy of contest to use as gauntlet GauntletData gauntlet = new GauntletData(); - gauntlet.setDecks(new ArrayList(contest.getDecks())); - gauntlet.setEventNames(new ArrayList(contest.getEventNames())); + gauntlet.setDecks(new ArrayList<>(contest.getDecks())); + gauntlet.setEventNames(new ArrayList<>(contest.getEventNames())); gauntlet.setUserDeck(userDeck); GauntletUtil.setDefaultGauntletName(gauntlet, contest.getDisplayName() + "_"); launchGauntlet(gauntlet); @@ -195,7 +199,7 @@ public class NewGauntletScreen extends LaunchScreen { gauntlet.reset(); RegisteredPlayer humanPlayer = new RegisteredPlayer(gauntlet.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); - List players = new ArrayList(); + List players = new ArrayList<>(); players.add(humanPlayer); players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); gauntlet.startRound(players, humanPlayer); diff --git a/forge-gui-mobile/src/forge/screens/home/HomeScreen.java b/forge-gui-mobile/src/forge/screens/home/HomeScreen.java index 2c415509921..6c124ff90a7 100644 --- a/forge-gui-mobile/src/forge/screens/home/HomeScreen.java +++ b/forge-gui-mobile/src/forge/screens/home/HomeScreen.java @@ -34,7 +34,7 @@ public class HomeScreen extends FScreen { private final FLabel lblLogo = add(new FLabel.Builder().icon(FSkinImage.LOGO).iconInBackground().iconScaleFactor(1).build()); private final ButtonScroller buttonScroller = add(new ButtonScroller()); - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); private int activeButtonIndex, baseButtonCount; private FDeckChooser deckManager; diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java index a028396bcba..b3ee50cfb08 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java @@ -43,7 +43,7 @@ public class LoadDraftScreen extends LaunchScreen { private final FSkinFont GAME_MODE_FONT= FSkinFont.get(12); private final FLabel lblMode = add(new FLabel.Builder().text("Mode:").font(GAME_MODE_FONT).build()); - private final FComboBox cbMode = add(new FComboBox()); + private final FComboBox cbMode = add(new FComboBox<>()); public LoadDraftScreen() { super(null, LoadGameMenu.getMenu()); @@ -153,7 +153,7 @@ public class LoadDraftScreen extends LaunchScreen { return; } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java index c954b90a6f8..421bffd268e 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java @@ -43,7 +43,7 @@ public class LoadSealedScreen extends LaunchScreen { private final FSkinFont GAME_MODE_FONT= FSkinFont.get(12); private final FLabel lblMode = add(new FLabel.Builder().text("Mode:").font(GAME_MODE_FONT).build()); - private final FComboBox cbMode = add(new FComboBox()); + private final FComboBox cbMode = add(new FComboBox<>()); public LoadSealedScreen() { super(null, LoadGameMenu.getMenu()); @@ -146,7 +146,7 @@ public class LoadSealedScreen extends LaunchScreen { LoadingOverlay.show("Loading new game...", new Runnable() { @Override public void run() { - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 83a9c1d5a65..8e3727a03e4 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -65,7 +65,7 @@ public class MatchController extends AbstractGuiGame { private MatchController() { } public static final MatchController instance = new MatchController(); - private static final Map avatarImages = new HashMap(); + private static final Map avatarImages = new HashMap<>(); private static HostedMatch hostedMatch; private static MatchScreen view; @@ -116,7 +116,7 @@ public class MatchController extends AbstractGuiGame { final boolean noHumans = !hasLocalPlayers(); final FCollectionView allPlayers = getGameView().getPlayers(); - final List playerPanels = new ArrayList(); + final List playerPanels = new ArrayList<>(); for (final PlayerView p : allPlayers) { final boolean isLocal = isLocalPlayer(p); final VPlayerPanel playerPanel = new VPlayerPanel(p, isLocal || noHumans, allPlayers.size()); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index c0fdfdc67ec..3a07b5d0aca 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -330,7 +330,7 @@ public class MatchScreen extends FScreen { if (game == null) { return; } //draw arrows for paired cards - Set pairedCards = new HashSet(); + Set pairedCards = new HashSet<>(); for (VPlayerPanel playerPanel : playerPanels.values()) { for (CardView card : playerPanel.getField().getRow1().getOrderedCards()) { if (pairedCards.contains(card)) { continue; } //prevent arrows going both ways @@ -616,7 +616,7 @@ public class MatchScreen extends FScreen { y += oldScrollTop - VAvatar.HEIGHT; //build map of all horizontal scroll panes and their current scrollWidths and adjusted X values - Map> horzScrollPanes = new HashMap>(); + Map> horzScrollPanes = new HashMap<>(); backupHorzScrollPanes(topPlayerPanel, x, horzScrollPanes); backupHorzScrollPanes(bottomPlayerPanel, x, horzScrollPanes); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java index 9e7a089d1cb..7ea91363826 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java @@ -71,8 +71,8 @@ public class VAssignDamage extends FDialog { private final DefendersPanel pnlDefenders; // Indexes of defenders correspond to their indexes in the damage list and labels. - private final List defenders = new ArrayList(); // NULL in this map means defender - private final Map damage = new HashMap(); // NULL in this map means defender + private final List defenders = new ArrayList<>(); // NULL in this map means defender + private final Map damage = new HashMap<>(); // NULL in this map means defender private boolean canAssignTo(CardView card) { for (DamageTarget dt : defenders) { @@ -456,7 +456,7 @@ public class VAssignDamage extends FDialog { } public Map getDamageMap() { - Map result = new HashMap(); + Map result = new HashMap<>(); for (DamageTarget dt : defenders) { result.put(dt.card, dt.damage); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java b/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java index 4c82e4e0698..5ce1d4adddf 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java @@ -18,7 +18,7 @@ public class VAutoYields extends FDialog { public VAutoYields() { super("Auto-Yields", 2); - List autoYields = new ArrayList(); + List autoYields = new ArrayList<>(); for (String autoYield : MatchController.instance.getAutoYields()) { autoYields.add(autoYield); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 9978aec28c2..87ef2206087 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -22,8 +22,8 @@ import forge.util.ThreadUtil; public abstract class VCardDisplayArea extends VDisplayArea implements ActivateHandler { private static final float CARD_STACK_OFFSET = 0.2f; - protected final List orderedCards = new ArrayList(); - protected final List cardPanels = new ArrayList(); + protected final List orderedCards = new ArrayList<>(); + protected final List cardPanels = new ArrayList<>(); private boolean rotateCards180; public Iterable getOrderedCards() { @@ -206,7 +206,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH } public static class CardAreaPanel extends FCardPanel { - private static final Map allCardPanels = new HashMap(); + private static final Map allCardPanels = new HashMap<>(); public static CardAreaPanel get(CardView card0) { CardAreaPanel cardPanel = allCardPanels.get(card0.getId()); @@ -230,7 +230,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH private VCardDisplayArea displayArea; private CardAreaPanel attachedToPanel; - private final List attachedPanels = new ArrayList(); + private final List attachedPanels = new ArrayList<>(); private CardAreaPanel nextPanelInStack, prevPanelInStack; //use static get(card) function instead @@ -404,7 +404,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH //on double-tap select all other cards in stack if any if (prevPanelInStack == null && nextPanelInStack == null) { return null; } - List cards = new ArrayList(); + List cards = new ArrayList<>(); CardAreaPanel panel = nextPanelInStack; while (panel != null) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index b4aabc6c657..583fecb2710 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -30,7 +30,7 @@ public class VField extends FContainer { } public Iterable getCardPanels() { - List cardPanels = new ArrayList(); + List cardPanels = new ArrayList<>(); for (CardAreaPanel cardPanel : row1.getCardPanels()) { cardPanels.add(cardPanel); } @@ -60,9 +60,9 @@ public class VField extends FContainer { cardPanel.setPrevPanelInStack(null); } - List creatures = new ArrayList(); - List lands = new ArrayList(); - List otherPermanents = new ArrayList(); + List creatures = new ArrayList<>(); + List lands = new ArrayList<>(); + List otherPermanents = new ArrayList<>(); for (CardView card : model) { CardAreaPanel cardPanel = CardAreaPanel.get(card); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java index 438aa86b37b..8cd0246b6fa 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java @@ -23,7 +23,7 @@ public class VManaPool extends VDisplayArea { private static final FSkinFont FONT = FSkinFont.get(16); private final PlayerView player; - private final List manaLabels = new ArrayList(); + private final List manaLabels = new ArrayList<>(); private int totalMana; public VManaPool(PlayerView player0) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java b/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java index 0194566606d..cf2724d538b 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java @@ -21,7 +21,7 @@ public class VPhaseIndicator extends FContainer { public static final float PADDING_X = Utils.scale(1); public static final float PADDING_Y = Utils.scale(2); - private final Map phaseLabels = new HashMap(); + private final Map phaseLabels = new HashMap<>(); private FSkinFont font; public VPhaseIndicator() { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index 24deacce607..870e99ffdb0 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -42,8 +42,8 @@ public class VPlayerPanel extends FContainer { private final VZoneDisplay commandZone; private final LifeLabel lblLife; private final InfoTab tabManaPool; - private final Map zoneTabs = new HashMap(); - private final List tabs = new ArrayList(); + private final Map zoneTabs = new HashMap<>(); + private final List tabs = new ArrayList<>(); private InfoTab selectedTab; private float avatarHeight = VAvatar.HEIGHT; private float displayAreaHeightFactor = 1.0f; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index 563d8d3c765..100b9cc46b2 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -69,8 +69,8 @@ public class VStack extends FDropDown { private void revealTargetZones() { if (activeStackInstance == null) { return; } - final Set zones = new HashSet(); - playersWithValidTargets = new HashMap(); + final Set zones = new HashSet<>(); + playersWithValidTargets = new HashMap<>(); for (final CardView c : activeStackInstance.getTargetCards()) { if (c.getZone() != null) { zones.add(c.getZone()); diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java index 034b9b10131..d314ed0bf99 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java @@ -166,12 +166,12 @@ public class ConquestCommandersScreen extends FScreen { @Override protected TextSearchFilter createSearchFilter() { - return new TextSearchFilter(this); + return new TextSearchFilter<>(this); } @Override protected AdvancedSearchFilter createAdvancedSearchFilter() { - return new AdvancedSearchFilter(this); + return new AdvancedSearchFilter<>(this); } @Override diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java index da194996ee3..892c37c9131 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java @@ -29,7 +29,7 @@ public class ConquestRewardDialog extends FScrollPane { private static final float PADDING = Utils.scale(5); public static void show(String title, PaperCard card, Runnable callback0) { - List rewards = new ArrayList(1); + List rewards = new ArrayList<>(1); rewards.add(new ConquestReward(card, 0)); show(title, rewards, callback0); } @@ -39,7 +39,7 @@ public class ConquestRewardDialog extends FScrollPane { } private final RevealDialog dialog; - private final List cardRevealers = new ArrayList(); + private final List cardRevealers = new ArrayList<>(); private final CardRevealAnimation animation; private final Runnable callback; @@ -303,7 +303,7 @@ public class ConquestRewardDialog extends FScrollPane { private boolean showCardZoom() { int index = -1; - List cards = new ArrayList(); + List cards = new ArrayList<>(); for (int i = 0; i < animation.currentIndex; i++) { CardRevealer revealer = cardRevealers.get(i); if (revealer == this) { diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java index abd6a461c70..6075299a5f6 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java @@ -22,7 +22,7 @@ import forge.util.Utils; public class ConquestStatsScreen extends FScreen implements IVConquestStats { private static final float PADDING = Utils.scale(5f); - private final FComboBox cbPlanes = add(new FComboBox()); + private final FComboBox cbPlanes = add(new FComboBox<>()); private final FScrollPane scroller = add(new FScrollPane() { @Override protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java index 39cc1d31d07..893f5754347 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java @@ -92,7 +92,7 @@ public class LoadConquestScreen extends LaunchScreen { final File dirConquests = new File(ForgeConstants.CONQUEST_SAVE_DIR); final ConquestController qc = FModel.getConquest(); - Map arrConquests = new HashMap(); + Map arrConquests = new HashMap<>(); if (dirConquests.listFiles() != null) { for (File f : dirConquests.listFiles()) { if (f.isDirectory()) { @@ -103,7 +103,7 @@ public class LoadConquestScreen extends LaunchScreen { } // Populate list with available conquest data. - lstConquests.setConquests(new ArrayList(arrConquests.values())); + lstConquests.setConquests(new ArrayList<>(arrConquests.values())); // If there are quests available, force select. if (arrConquests.size() > 0) { @@ -332,7 +332,7 @@ public class LoadConquestScreen extends LaunchScreen { } public void setConquests(List qd0) { - List sorted = new ArrayList(); + List sorted = new ArrayList<>(); for (ConquestData qd : qd0) { sorted.add(qd); } diff --git a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java index c80e1787702..cb9daf1b4ef 100644 --- a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java @@ -101,7 +101,7 @@ public class LoadQuestScreen extends LaunchScreen { } }; File[] arrFiles = dirQuests.listFiles(takeDatFiles); - Map arrQuests = new HashMap(); + Map arrQuests = new HashMap<>(); for (File f : arrFiles) { try { arrQuests.put(f.getName(), QuestDataIO.loadData(f)); @@ -113,7 +113,7 @@ public class LoadQuestScreen extends LaunchScreen { } // Populate list with available quest data. - lstQuests.setQuests(new ArrayList(arrQuests.values())); + lstQuests.setQuests(new ArrayList<>(arrQuests.values())); // If there are quests available, force select. if (arrQuests.size() > 0) { @@ -334,7 +334,7 @@ public class LoadQuestScreen extends LaunchScreen { } public void setQuests(List qd0) { - List sorted = new ArrayList(); + List sorted = new ArrayList<>(); for (QuestData qd : qd0) { sorted.add(qd); } diff --git a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java index a93827e7edf..83293de0bb7 100644 --- a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java @@ -111,7 +111,7 @@ public class NewQuestScreen extends FScreen { @SuppressWarnings("unused") private final FLabel lblStartingWorld = scroller.add(new FLabel.Builder().text("Starting world:").build()); - private final FComboBox cbxStartingWorld = scroller.add(new FComboBox()); + private final FComboBox cbxStartingWorld = scroller.add(new FComboBox<>()); @SuppressWarnings("unused") private final FLabel lblDifficulty = scroller.add(new FLabel.Builder().text("Difficulty:").build()); @@ -119,18 +119,18 @@ public class NewQuestScreen extends FScreen { @SuppressWarnings("unused") private final FLabel lblStartingPool = scroller.add(new FLabel.Builder().text("Starting pool:").build()); - private final FComboBox cbxStartingPool = scroller.add(new FComboBox()); + private final FComboBox cbxStartingPool = scroller.add(new FComboBox<>()); private final FLabel lblUnrestricted = scroller.add(new FLabel.Builder().align(Align.right).font(FSkinFont.get(12)).text("All cards will be available to play.").build()); private final FLabel lblPreconDeck = scroller.add(new FLabel.Builder().text("Starter/Event deck:").build()); - private final FComboBox cbxPreconDeck = scroller.add(new FComboBox()); + private final FComboBox cbxPreconDeck = scroller.add(new FComboBox<>()); private final FLabel lblFormat = scroller.add(new FLabel.Builder().text("Select format:").build()); - private final FComboBox cbxFormat = scroller.add(new FComboBox()); + private final FComboBox cbxFormat = scroller.add(new FComboBox<>()); private final FLabel lblCustomDeck = scroller.add(new FLabel.Builder().text("Custom deck:").build()); - private final FComboBox cbxCustomDeck = scroller.add(new FComboBox()); + private final FComboBox cbxCustomDeck = scroller.add(new FComboBox<>()); private final FLabel btnSelectFormat = scroller.add(new FLabel.ButtonBuilder().text("Choose format").build()); @@ -159,7 +159,7 @@ public class NewQuestScreen extends FScreen { private final FComboBox cbxPrizedCards = scroller.add(new FComboBox<>()); private final FLabel lblPrizeFormat = scroller.add(new FLabel.Builder().text("Defined format:").build()); - private final FComboBox cbxPrizeFormat = scroller.add(new FComboBox()); + private final FComboBox cbxPrizeFormat = scroller.add(new FComboBox<>()); private final FLabel lblPrizeUnrestricted = scroller.add(new FLabel.Builder().align(Align.right).font(FSkinFont.get(12)).text("All cards will be available to win.").build()); private final FLabel lblPrizeSameAsStarting = scroller.add(new FLabel.Builder().align(Align.right).font(FSkinFont.get(12)).text("Only sets found in starting pool will be available.").build()); diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java b/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java index 6e1bad5d4e8..81fa5b1035a 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java @@ -27,7 +27,7 @@ public class QuestDeckEditor extends FDeckEditor { @Override protected Map getColOverrides(ItemManagerConfig config) { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); switch (config) { case QUEST_EDITOR_POOL: ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java index dab3d7d1892..95e14a8d26d 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java @@ -235,7 +235,7 @@ public class QuestSpellShopScreen extends TabPageScreen { FThreads.invokeInBackgroundThread(new Runnable() { @Override public void run() { - ItemPool items = new ItemPool(InventoryItem.class); + ItemPool items = new ItemPool<>(InventoryItem.class); items.add(item, result); activateItems(items); FThreads.invokeInEdtLater(new Runnable() { @@ -284,7 +284,7 @@ public class QuestSpellShopScreen extends TabPageScreen { @Override protected void refresh() { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); ItemColumn.addColOverride(ItemManagerConfig.SPELL_SHOP, colOverrides, ColumnDef.PRICE, QuestSpellShop.fnPriceCompare, QuestSpellShop.fnPriceGet); ItemColumn.addColOverride(ItemManagerConfig.SPELL_SHOP, colOverrides, ColumnDef.OWNED, FModel.getQuest().getCards().getFnOwnedCompare(), FModel.getQuest().getCards().getFnOwnedGet()); itemManager.setup(ItemManagerConfig.SPELL_SHOP, colOverrides); @@ -341,13 +341,13 @@ public class QuestSpellShopScreen extends TabPageScreen { @Override protected void refresh() { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); ItemColumn.addColOverride(ItemManagerConfig.QUEST_INVENTORY, colOverrides, ColumnDef.PRICE, QuestSpellShop.fnPriceCompare, QuestSpellShop.fnPriceSellGet); ItemColumn.addColOverride(ItemManagerConfig.QUEST_INVENTORY, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); ItemColumn.addColOverride(ItemManagerConfig.QUEST_INVENTORY, colOverrides, ColumnDef.DECKS, QuestSpellShop.fnDeckCompare, QuestSpellShop.fnDeckGet); itemManager.setup(ItemManagerConfig.QUEST_INVENTORY, colOverrides); - final ItemPool ownedItems = new ItemPool(InventoryItem.class); + final ItemPool ownedItems = new ItemPool<>(InventoryItem.class); ownedItems.addAllOfType(FModel.getQuest().getCards().getCardpool().getView()); itemManager.setPool(ownedItems); } diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java index 7840e135436..5538964468f 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java @@ -48,8 +48,8 @@ public class QuestStatsScreen extends FScreen { private final FLabel lblWinStreak = scroller.add(new StatLabel(FSkinImage.QUEST_PLUSPLUS)); private final FLabel lblLife = scroller.add(new StatLabel(FSkinImage.QUEST_LIFE)); private final FLabel lblWorld = scroller.add(new StatLabel(FSkinImage.QUEST_MAP)); - private final FComboBox cbxPet = scroller.add(new FComboBox()); - private final FComboBox cbxMatchLength = scroller.add(new FComboBox()); + private final FComboBox cbxPet = scroller.add(new FComboBox<>()); + private final FComboBox cbxMatchLength = scroller.add(new FComboBox<>()); private final FCheckBox cbPlant = scroller.add(new FCheckBox("Summon Plant")); private final FLabel lblZep = scroller.add(new FLabel.Builder().text("Launch Zeppelin").icon(FSkinImage.QUEST_ZEP).font(FSkinFont.get(16)).opaque().build()); diff --git a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java index 2120288df18..4f4367b646f 100644 --- a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java @@ -19,7 +19,7 @@ import forge.toolbox.FOptionPane; import forge.util.Callback; public class FilesPage extends TabPage { - private final FGroupList lstItems = add(new FGroupList()); + private final FGroupList lstItems = add(new FGroupList<>()); protected FilesPage() { super("Files", FSkinImage.OPEN); diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index c558505413f..a8b95b99340 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -32,7 +32,7 @@ import java.util.ArrayList; import java.util.List; public class SettingsPage extends TabPage { - private final FGroupList lstSettings = add(new FGroupList()); + private final FGroupList lstSettings = add(new FGroupList<>()); public SettingsPage() { super("Settings", FSkinImage.SETTINGS); @@ -397,7 +397,7 @@ public class SettingsPage extends TabPage { } private class CustomSelectSetting extends Setting { - private final List options = new ArrayList(); + private final List options = new ArrayList<>(); public CustomSelectSetting(FPref pref0, String label0, String description0, String[] options0) { super(pref0, label0 + ":", description0); @@ -437,7 +437,7 @@ public class SettingsPage extends TabPage { private CustomSelectScreen() { super("Select " + label.substring(0, label.length() - 1)); - lstOptions = add(new FList(options)); + lstOptions = add(new FList<>(options)); lstOptions.setListItemRenderer(new FList.DefaultListItemRenderer() { @Override public boolean tap(Integer index, String value, float x, float y, int count) { diff --git a/forge-gui-mobile/src/forge/toolbox/DualListBox.java b/forge-gui-mobile/src/forge/toolbox/DualListBox.java index 65891c3eb47..452ae654533 100644 --- a/forge-gui-mobile/src/forge/toolbox/DualListBox.java +++ b/forge-gui-mobile/src/forge/toolbox/DualListBox.java @@ -206,7 +206,7 @@ public class DualListBox extends FDialog { private final FEventHandler onActivate; private ChoiceList(Collection items, final T typeItem, final FEventHandler onActivate0) { - super(items != null ? items : new ArrayList(), typeItem); //handle null without crashing + super(items != null ? items : new ArrayList<>(), typeItem); //handle null without crashing onActivate = onActivate0; } diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index a512d0ce567..770736b177e 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -40,7 +40,7 @@ public class FChoiceList extends FList implements ActivateHandler { protected final int minChoices, maxChoices; private final CompactModeHandler compactModeHandler = new CompactModeHandler(); - private final List selectedIndices = new ArrayList(); + private final List selectedIndices = new ArrayList<>(); public FChoiceList(Iterable items) { this(items, null); @@ -172,7 +172,7 @@ public class FChoiceList extends FList implements ActivateHandler { } public List getSelectedItems() { - List choices = new ArrayList(); + List choices = new ArrayList<>(); for (int i : selectedIndices) { choices.add(getItemAt(i)); } diff --git a/forge-gui-mobile/src/forge/toolbox/FComboBox.java b/forge-gui-mobile/src/forge/toolbox/FComboBox.java index 019af582c63..8e22a40b9d2 100644 --- a/forge-gui-mobile/src/forge/toolbox/FComboBox.java +++ b/forge-gui-mobile/src/forge/toolbox/FComboBox.java @@ -12,7 +12,7 @@ import forge.menu.FMenuItem; import forge.toolbox.FEvent.*; public class FComboBox extends FTextField implements IComboBox { - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); private T selectedItem; private String label = ""; private final DropDown dropDown = new DropDown(); diff --git a/forge-gui-mobile/src/forge/toolbox/FContainer.java b/forge-gui-mobile/src/forge/toolbox/FContainer.java index 9aa5c7511d8..32fcf2ea0ab 100644 --- a/forge-gui-mobile/src/forge/toolbox/FContainer.java +++ b/forge-gui-mobile/src/forge/toolbox/FContainer.java @@ -10,7 +10,7 @@ import forge.Graphics; import forge.error.BugReporter; public abstract class FContainer extends FDisplayObject { - private final List children = new ArrayList(); + private final List children = new ArrayList<>(); public T add(T child) { children.add(child); diff --git a/forge-gui-mobile/src/forge/toolbox/FGroupList.java b/forge-gui-mobile/src/forge/toolbox/FGroupList.java index 918413b5f82..7646c858d38 100644 --- a/forge-gui-mobile/src/forge/toolbox/FGroupList.java +++ b/forge-gui-mobile/src/forge/toolbox/FGroupList.java @@ -16,7 +16,7 @@ import forge.util.Utils; public class FGroupList extends FScrollPane { private static final float GROUP_HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.6f); - private final List groups = new ArrayList(); + private final List groups = new ArrayList<>(); private FSkinFont font; private ListItemRenderer renderer; @@ -38,7 +38,7 @@ public class FGroupList extends FScrollPane { private void initialize() { font = FSkinFont.get(14); - renderer = new DefaultListItemRenderer(); + renderer = new DefaultListItemRenderer<>(); } public void addGroup(String groupName) { @@ -166,7 +166,7 @@ public class FGroupList extends FScrollPane { private class ListGroup extends FContainer { private final FLabel header; - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); private boolean isCollapsed; diff --git a/forge-gui-mobile/src/forge/toolbox/FList.java b/forge-gui-mobile/src/forge/toolbox/FList.java index 4fcb3929d3f..c6c3f80cc74 100644 --- a/forge-gui-mobile/src/forge/toolbox/FList.java +++ b/forge-gui-mobile/src/forge/toolbox/FList.java @@ -24,7 +24,7 @@ public class FList extends FScrollPane implements Iterable { public static final FSkinColor LINE_COLOR = FORE_COLOR.alphaColor(0.5f); public static final float LINE_THICKNESS = Utils.scale(1); - protected final List items = new ArrayList(); + protected final List items = new ArrayList<>(); private FSkinFont font; private ListItemRenderer renderer; private int pressedIndex = -1; @@ -47,7 +47,7 @@ public class FList extends FScrollPane implements Iterable { private void initialize() { font = FSkinFont.get(14); - renderer = new DefaultListItemRenderer(); + renderer = new DefaultListItemRenderer<>(); } public synchronized void addItem(T item) { @@ -65,7 +65,7 @@ public class FList extends FScrollPane implements Iterable { } public List extractListData() { - return new ArrayList(items); //create copy to avoid modifying items + return new ArrayList<>(items); //create copy to avoid modifying items } public synchronized void setListData(Iterable items0) { clear(); diff --git a/forge-gui-mobile/src/forge/toolbox/FOptionPane.java b/forge-gui-mobile/src/forge/toolbox/FOptionPane.java index 9db441307c1..b93a8b04731 100644 --- a/forge-gui-mobile/src/forge/toolbox/FOptionPane.java +++ b/forge-gui-mobile/src/forge/toolbox/FOptionPane.java @@ -173,7 +173,7 @@ public class FOptionPane extends FDialog { } else { txtInput = null; - cbInput = new FComboBox(inputOptions); + cbInput = new FComboBox<>(inputOptions); cbInput.setSelectedItem(initialInput); inputField = cbInput; } diff --git a/forge-gui-mobile/src/forge/toolbox/FOverlay.java b/forge-gui-mobile/src/forge/toolbox/FOverlay.java index 3905b488c9e..dca477d87a8 100644 --- a/forge-gui-mobile/src/forge/toolbox/FOverlay.java +++ b/forge-gui-mobile/src/forge/toolbox/FOverlay.java @@ -18,7 +18,7 @@ import forge.screens.match.MatchController; public abstract class FOverlay extends FContainer { public static final float ALPHA_COMPOSITE = 0.5f; - private static final Stack overlays = new Stack(); + private static final Stack overlays = new Stack<>(); private static boolean hidingAll = false; private static FOverlay tempOverlay; @@ -49,7 +49,7 @@ public abstract class FOverlay extends FContainer { if (overlays.size() < 2) { return overlays; //don't need to create new list if one or fewer overlay } - List reversedList = new ArrayList(); + List reversedList = new ArrayList<>(); for (int i = overlays.size() - 1; i >= 0; i--) { reversedList.add(overlays.get(i)); } diff --git a/forge-gui-mobile/src/forge/toolbox/FProgressBar.java b/forge-gui-mobile/src/forge/toolbox/FProgressBar.java index 06eb7233d45..160cf0bcd89 100644 --- a/forge-gui-mobile/src/forge/toolbox/FProgressBar.java +++ b/forge-gui-mobile/src/forge/toolbox/FProgressBar.java @@ -119,7 +119,7 @@ public class FProgressBar extends FDisplayObject implements IProgressBar { float h = getHeight(); //draw background and progress - List> selTextRegions = new ArrayList>(); + List> selTextRegions = new ArrayList<>(); if (showProgressTrail) { long now = new Date().getTime(); if (progressTrailStart == -1) { diff --git a/forge-gui-mobile/src/forge/toolbox/FRadioButton.java b/forge-gui-mobile/src/forge/toolbox/FRadioButton.java index ed8d94490b1..7488045e387 100644 --- a/forge-gui-mobile/src/forge/toolbox/FRadioButton.java +++ b/forge-gui-mobile/src/forge/toolbox/FRadioButton.java @@ -94,6 +94,6 @@ public class FRadioButton extends FLabel { } public static class RadioButtonGroup { - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); } } diff --git a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java index 0e6b5a0667d..e8f19f00ad1 100644 --- a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java +++ b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java @@ -110,7 +110,7 @@ public class GuiChoose { // Nothing to choose here. Code uses this to just reveal one or more items public static void reveal(final String message, final T item) { - List items = new ArrayList(); + List items = new ArrayList<>(); items.add(item); reveal(message, items); } @@ -162,7 +162,7 @@ public class GuiChoose { return; } - List choices = new ArrayList(); + List choices = new ArrayList<>(); for (int i = min; i <= cutoff; i++) { choices.add(Integer.valueOf(i)); } @@ -229,13 +229,13 @@ public class GuiChoose { public static void getChoices(final String message, final int min, final int max, final Collection choices, final T selected, final Function display, final Callback> callback) { if (choices == null || choices.isEmpty()) { if (min == 0) { - callback.run(new ArrayList()); + callback.run(new ArrayList<>()); return; } throw new RuntimeException("choice required from empty list"); } - ListChooser c = new ListChooser(message, min, max, choices, display, callback); + ListChooser c = new ListChooser<>(message, min, max, choices, display, callback); c.show(selected, false); } @@ -256,7 +256,7 @@ public class GuiChoose { public static void order(final String title, final String top, final int remainingObjectsMin, final int remainingObjectsMax, final List sourceChoices, final List destChoices, final CardView referenceCard, final Callback> callback) { // An input box for handling the order of choices. - DualListBox dual = new DualListBox(title, remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, callback); + DualListBox dual = new DualListBox<>(title, remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, callback); dual.setSecondColumnLabelText(top); dual.show(); } diff --git a/forge-gui-mobile/src/forge/toolbox/ListChooser.java b/forge-gui-mobile/src/forge/toolbox/ListChooser.java index 9fd472230ed..de20d8ab69a 100644 --- a/forge-gui-mobile/src/forge/toolbox/ListChooser.java +++ b/forge-gui-mobile/src/forge/toolbox/ListChooser.java @@ -151,7 +151,7 @@ public class ListChooser extends FContainer { show(); //show if user tries to cancel when input is mandatory } else { - callback.run(new ArrayList()); + callback.run(new ArrayList<>()); } } }) { @@ -179,7 +179,7 @@ public class ListChooser extends FContainer { public void applyFilters() { lstChoices.clearSelection(); - List> predicates = new ArrayList>(); + List> predicates = new ArrayList<>(); final String pattern = txtSearch.getText().toLowerCase(); if (!pattern.isEmpty()) { diff --git a/forge-gui/src/main/java/forge/achievement/Domain.java b/forge-gui/src/main/java/forge/achievement/Domain.java index 93b6a397889..0fba442df1c 100644 --- a/forge-gui/src/main/java/forge/achievement/Domain.java +++ b/forge-gui/src/main/java/forge/achievement/Domain.java @@ -37,7 +37,7 @@ public class Domain extends ProgressiveAchievement { return false; } if (player.getOutcome().hasWon()) { - Set basicLands = new HashSet(); + Set basicLands = new HashSet<>(); for (Card c : player.getCardsIn(ZoneType.Battlefield)) { String name = c.getName(); if (c.isBasicLand() && basicLandMap.containsKey(name)) { diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index e86d433f44e..5215450dfef 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -69,7 +69,7 @@ public class CardDetailUtil { return getBorderColors(colorSet, false, true, true); } private static List getBorderColors(final ColorSet cardColors, final boolean isLand, final boolean canShow, final boolean supportMultiple) { - final List borderColors = new ArrayList(); + final List borderColors = new ArrayList<>(); if (cardColors == null || !canShow) { borderColors.add(DetailColors.FACE_DOWN); diff --git a/forge-gui/src/main/java/forge/card/CardPreferences.java b/forge-gui/src/main/java/forge/card/CardPreferences.java index c271d55ac07..ffda9881370 100644 --- a/forge-gui/src/main/java/forge/card/CardPreferences.java +++ b/forge-gui/src/main/java/forge/card/CardPreferences.java @@ -22,7 +22,7 @@ import org.w3c.dom.NodeList; * */ public class CardPreferences { - private static Map allPrefs = new HashMap(); + private static Map allPrefs = new HashMap<>(); public static CardPreferences getPrefs(IPaperCard card) { String cardName = card.getName(); diff --git a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java index 88caacc8442..147940c7f96 100644 --- a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java +++ b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java @@ -18,12 +18,12 @@ public class CardReaderExperiments { if (args.length < 2) { return; } int totalParsedCount = 0; - final List> output = new ArrayList>(); + final List> output = new ArrayList<>(); for (int i = 1; i < args.length; i++) { - output.add(new ArrayList()); + output.add(new ArrayList<>()); } - final List allFiles = CardStorageReader.collectCardFiles(new ArrayList(), new File(ForgeConstants.CARD_DATA_DIR)); + final List allFiles = CardStorageReader.collectCardFiles(new ArrayList<>(), new File(ForgeConstants.CARD_DATA_DIR)); Charset charset = Charset.forName(CardStorageReader.DEFAULT_CHARSET_NAME); final CardRules.Reader rulesReader = new CardRules.Reader(); for (File file : allFiles) { diff --git a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java index 264724df198..799364cff24 100644 --- a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java @@ -32,10 +32,10 @@ import forge.util.maps.MapOfLists; public class FControlGameEventHandler extends IGameEventVisitor.Base { private final PlayerControllerHuman humanController; private final IGuiGame matchController; - private final Set cardsUpdate = new HashSet(); - private final Set cardsRefreshDetails = new HashSet(); - private final Set livesUpdate = new HashSet(); - private final Set manaPoolUpdate = new HashSet(); + private final Set cardsUpdate = new HashSet<>(); + private final Set cardsRefreshDetails = new HashSet<>(); + private final Set livesUpdate = new HashSet<>(); + private final Set manaPoolUpdate = new HashSet<>(); private final PlayerZoneUpdates zonesUpdate = new PlayerZoneUpdates(); private boolean processEventsQueued, needPhaseUpdate, needCombatUpdate, needStackUpdate, needPlayerControlUpdate; @@ -301,7 +301,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(final GameEventBlockersDeclared event) { - final Set cards = new HashSet(); + final Set cards = new HashSet<>(); for (final MapOfLists kv : event.blockers.values()) { for (final Collection blockers : kv.values()) { cards.addAll(blockers); diff --git a/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java b/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java index 74aefb8da64..bc2d523de60 100644 --- a/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java @@ -15,7 +15,7 @@ import java.util.List; */ public class ArchetypeDeckGenerator extends DeckProxy implements Comparable { public static List getMatrixDecks(GameFormat format, boolean isForAi){ - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for(Archetype archetype: CardArchetypeLDAGenerator.ldaArchetypes.get(format.getName())) { decks.add(new ArchetypeDeckGenerator(archetype, format, isForAi)); } diff --git a/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java b/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java index 2cbab5ab4d1..ddcc82a3e02 100644 --- a/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java @@ -69,7 +69,7 @@ public final class CardArchetypeLDAGenerator { public static Map>>> loadFormat(List lda) throws Exception{ List>> topics = new ArrayList<>(); - Set cards = new HashSet(); + Set cards = new HashSet<>(); for (int t = 0; t < lda.size(); ++t) { List> topic = new ArrayList<>(); Set topicCards = new HashSet<>(); diff --git a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java index 9227ae62637..6c9c7e74687 100644 --- a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java @@ -62,7 +62,7 @@ public final class CardRelationMatrixGenerator { } public static HashMap>> initializeFormat(GameFormat format){ - IStorage decks = new StorageImmediatelySerialized("Generator", new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR+ForgeConstants.PATH_SEPARATOR+format.getName()), + IStorage decks = new StorageImmediatelySerialized<>("Generator", new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR + ForgeConstants.PATH_SEPARATOR + format.getName()), ForgeConstants.DECK_GEN_DIR, false), true); @@ -117,7 +117,7 @@ public final class CardRelationMatrixGenerator { if(!cardToAdd.getRules().getMainPart().getType().isLand()){//need x non-land cards ++j; } - deckPool.add(new AbstractMap.SimpleEntry(cardToAdd,distances[indices[cardList.size()-1-k]])); + deckPool.add(new AbstractMap.SimpleEntry<>(cardToAdd, distances[indices[cardList.size() - 1 - k]])); } if(excludeThisCard){ continue; @@ -129,9 +129,9 @@ public final class CardRelationMatrixGenerator { } public static HashMap>> initializeCommanderFormat(DeckFormat format){ - IStorage decks = new StorageImmediatelySerialized("Generator", + IStorage decks = new StorageImmediatelySerialized<>("Generator", new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR, format.toString()), - ForgeConstants.DECK_GEN_DIR, false), + ForgeConstants.DECK_GEN_DIR, false), true); //get all cards @@ -186,7 +186,7 @@ public final class CardRelationMatrixGenerator { List> deckPool=new ArrayList<>(); for(int k=0;k0){ - deckPool.add(new AbstractMap.SimpleEntry(integerCardMap.get(k),matrix[col][k])); + deckPool.add(new AbstractMap.SimpleEntry<>(integerCardMap.get(k), matrix[col][k])); } } cardPools.put(card.getName(), deckPool); diff --git a/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java b/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java index f9cff56d778..dad5e42face 100644 --- a/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java @@ -13,7 +13,7 @@ import java.util.List; */ public class CardThemedDeckGenerator extends DeckProxy implements Comparable { public static List getMatrixDecks(GameFormat format, boolean isForAi){ - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for(String card: CardArchetypeLDAGenerator.ldaPools.get(format.getName()).keySet()) { //exclude non AI playables as keycards for AI decks if(isForAi&&FModel.getMagicDb().getCommonCards().getUniqueByName(card).getRules().getAiHints().getRemAIDecks()){ diff --git a/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java b/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java index 284542da98e..19d782305f9 100644 --- a/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java @@ -13,7 +13,7 @@ public class ColorDeckGenerator extends DeckProxy implements Comparable getColorDecks(final IItemManager lstDecks0, final Predicate formatFilter0, final boolean isAi0) { final String[] colors = new String[] { "Random 1", "Random 2", "Random 3", "White", "Blue", "Black", "Red", "Green" }; - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (int i = 0; i < colors.length; i++) { decks.add(new ColorDeckGenerator(colors[i], i, lstDecks0, formatFilter0, isAi0)); } @@ -56,7 +56,7 @@ public class ColorDeckGenerator extends DeckProxy implements Comparable selection = new ArrayList(); + final List selection = new ArrayList<>(); for (final DeckProxy deck : lstDecks.getSelectedItems()) { selection.add(deck.getName()); } diff --git a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java index 88938d11d34..12c7b84d0ff 100644 --- a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java @@ -24,7 +24,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable(PaperCard.class); + uniqueCards = new ItemPool<>(PaperCard.class); String matrixKey = (format.equals(DeckFormat.TinyLeaders) ? DeckFormat.Commander : format).toString(); //use Commander for Tiny Leaders Iterable legendNames = CardRelationMatrixGenerator.cardPools.get(matrixKey).keySet(); for (String legendName : legendNames) { @@ -44,7 +44,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable decks = new ArrayList(); + final List decks = new ArrayList<>(); for (PaperCard legend: legends) { decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); } @@ -54,7 +54,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable getBrawlDecks(final DeckFormat format, boolean isForAi, boolean isCardGen){ ItemPool uniqueCards; if (isCardGen){ - uniqueCards = new ItemPool(PaperCard.class); + uniqueCards = new ItemPool<>(PaperCard.class); //TODO: update to actual Brawl model from real Brawl decks Iterable legendNames=CardArchetypeLDAGenerator.ldaPools.get(FModel.getFormats().getStandard().getName()).keySet(); for (String legendName : legendNames) { @@ -70,7 +70,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable decks = new ArrayList(); + final List decks = new ArrayList<>(); for (PaperCard legend: legends) { decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); } diff --git a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java index 281425fd157..3f57c84a271 100644 --- a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java +++ b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java @@ -72,7 +72,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { * @return a {@link java.util.ArrayList} object. */ public static final List getThemeNames() { - final List ltNames = new ArrayList(); + final List ltNames = new ArrayList<>(); final File file = new File(ForgeConstants.THEMES_DIR); @@ -180,7 +180,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { private class Grp { /** The Cardnames. */ - private final List cardnames = new ArrayList(); + private final List cardnames = new ArrayList<>(); /** The Max cnt. */ private int maxCnt; @@ -190,7 +190,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { } private List readGroups(List lines) { - final List groups = new ArrayList(); + final List groups = new ArrayList<>(); Grp g = null; for (String s : lines) { diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index d8182d211d0..e8d19779752 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -19,7 +19,7 @@ public class DeckImportController { private final ICheckBox newEditionCheck, dateTimeCheck, onlyCoreExpCheck; private final IComboBox monthDropdown; private final IComboBox yearDropdown; - private final List tokens = new ArrayList(); + private final List tokens = new ArrayList<>(); public DeckImportController(boolean replacingDeck0, ICheckBox newEditionCheck0, ICheckBox dateTimeCheck0, ICheckBox onlyCoreExpCheck0, IComboBox monthDropdown0, IComboBox yearDropdown0) { replacingDeck = replacingDeck0; diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index 8502e9b49a5..01e46db5ecf 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -172,7 +172,7 @@ public class DeckProxy implements InventoryItem { //track phyrexian and hybrid costs separately as they won't always affect color if (shard.isPhyrexian() || shard.isOr2Generic() || !shard.isMonoColor()) { if (nonReqColors == null) { - nonReqColors = new HashSet(); + nonReqColors = new HashSet<>(); } nonReqColors.add(shard.getColorMask()); } @@ -350,7 +350,7 @@ public class DeckProxy implements InventoryItem { return getAllConstructedDecks(null); } public static Iterable getAllConstructedDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Constructed", GameType.Constructed, result, "", FModel.getDecks().getConstructed(), filter); return result; } @@ -359,7 +359,7 @@ public class DeckProxy implements InventoryItem { return getAllCommanderDecks(null); } public static Iterable getAllCommanderDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Commander", GameType.Commander, result, "", FModel.getDecks().getCommander(), filter); return result; } @@ -368,7 +368,7 @@ public class DeckProxy implements InventoryItem { return getAllOathbreakerDecks(null); } public static Iterable getAllOathbreakerDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Oathbreaker", GameType.Oathbreaker, result, "", FModel.getDecks().getOathbreaker(), filter); return result; } @@ -377,7 +377,7 @@ public class DeckProxy implements InventoryItem { return getAllTinyLeadersDecks(null); } public static Iterable getAllTinyLeadersDecks(Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); if (filter == null) { filter = DeckFormat.TinyLeaders.hasLegalCardsPredicate(); } @@ -392,7 +392,7 @@ public class DeckProxy implements InventoryItem { return getAllBrawlDecks(null); } public static Iterable getAllBrawlDecks(Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); if (filter == null) { filter = DeckFormat.Brawl.hasLegalCardsPredicate(); } @@ -407,7 +407,7 @@ public class DeckProxy implements InventoryItem { return getAllSchemeDecks(null); } public static Iterable getAllSchemeDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Scheme", GameType.Archenemy, result, "", FModel.getDecks().getScheme(), filter); return result; } @@ -416,7 +416,7 @@ public class DeckProxy implements InventoryItem { return getAllPlanarDecks(null); } public static Iterable getAllPlanarDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Plane", GameType.Planechase, result, "", FModel.getDecks().getPlane(), filter); return result; } @@ -510,7 +510,7 @@ public class DeckProxy implements InventoryItem { } public static List getAllThemeDecks() { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (final String s : DeckGeneratorTheme.getThemeNames()) { decks.add(new ThemeDeckGenerator(s)); } @@ -519,7 +519,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getAllPreconstructedDecks(final IStorage iStorage) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (final PreconDeck preconDeck : iStorage) { decks.add(new DeckProxy(preconDeck, "Precon", (Function)(Object)PreconDeck.FN_GET_DECK, null, iStorage)); } @@ -527,7 +527,7 @@ public class DeckProxy implements InventoryItem { } public static List getAllQuestEventAndChallenges() { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); final QuestController quest = FModel.getQuest(); for (final QuestEvent e : quest.getDuelsManager().getAllDuels()) { decks.add(new DeckProxy(e.getEventDeck(), "Quest Event", null, null)); @@ -540,7 +540,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getAllSealedDecks() { - final List humanDecks = new ArrayList(); + final List humanDecks = new ArrayList<>(); final IStorage sealed = FModel.getDecks().getSealed(); // Since AI decks are tied directly to the human choice, @@ -552,7 +552,7 @@ public class DeckProxy implements InventoryItem { } public static List getAllQuestDecks(final IStorage storage) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); if (storage != null) { for (final Deck deck : storage) { decks.add(new DeckProxy(deck, "Quest", GameType.Quest, storage)); @@ -563,7 +563,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getAllDraftDecks() { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); final IStorage draft = FModel.getDecks().getDraft(); for (final DeckGroup d : draft) { decks.add(new DeckProxy(d, "Draft", ((Function)(Object)DeckGroup.FN_HUMAN_DECK), GameType.Draft, draft)); @@ -573,7 +573,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getWinstonDecks(final IStorage draft) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (final DeckGroup d : draft) { decks.add(new DeckProxy(d, "Winston", ((Function)(Object)DeckGroup.FN_HUMAN_DECK), GameType.Winston, draft)); } @@ -581,7 +581,7 @@ public class DeckProxy implements InventoryItem { } public static List getNetDecks(final NetDeckCategory category) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); if (category != null) { addDecksRecursivelly("Constructed", GameType.Constructed, decks, "", category, null); } diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 0f27b16d038..a155d4e782e 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -389,7 +389,7 @@ public class DeckgenUtil { public static Deck getRandomColorDeck(Predicate formatFilter, boolean forAi) { final int[] colorCount = new int[] {1, 2, 3}; final int count = colorCount[MyRandom.getRandom().nextInt(colorCount.length)]; - final List selection = new ArrayList(); + final List selection = new ArrayList<>(); // A simulated selection of "random 1" will trigger the AI selection process. for (int i = 0; i < count; i++) { selection.add("Random"); } @@ -400,7 +400,7 @@ public class DeckgenUtil { public static Deck getRandomColorDeck(boolean forAi) { final int[] colorCount = new int[] {1, 2, 3, 5}; final int count = colorCount[MyRandom.getRandom().nextInt(colorCount.length)]; - final List selection = new ArrayList(); + final List selection = new ArrayList<>(); // A simulated selection of "random 1" will trigger the AI selection process. for (int i = 0; i < count; i++) { selection.add("Random"); } @@ -430,7 +430,7 @@ public class DeckgenUtil { } public static Deck getRandomQuestDeck() { - final List allQuestDecks = new ArrayList(); + final List allQuestDecks = new ArrayList<>(); QuestController qCtrl = FModel.getQuest(); for (final QuestEvent e : qCtrl.getDuelsManager().getAllDuels()) { @@ -512,7 +512,7 @@ public class DeckgenUtil { public static CardPool generateSchemePool() { CardPool schemes = new CardPool(); - List allSchemes = new ArrayList(); + List allSchemes = new ArrayList<>(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { if (c.getRules().getType().isScheme()) { allSchemes.add(c); @@ -544,7 +544,7 @@ public class DeckgenUtil { public static CardPool generatePlanarPool() { CardPool res = new CardPool(); - List allPlanars = new ArrayList(); + List allPlanars = new ArrayList<>(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { if (c.getRules().getType().isPlane() || c.getRules().getType().isPhenomenon()) { allPlanars.add(c); diff --git a/forge-gui/src/main/java/forge/deck/NetDeckCategory.java b/forge-gui/src/main/java/forge/deck/NetDeckCategory.java index 75fcdbec995..809d60056a1 100644 --- a/forge-gui/src/main/java/forge/deck/NetDeckCategory.java +++ b/forge-gui/src/main/java/forge/deck/NetDeckCategory.java @@ -24,7 +24,7 @@ public class NetDeckCategory extends StorageBase { private static Map constructed, commander; private static Map loadCategories(String filename) { - Map categories = new TreeMap(); + Map categories = new TreeMap<>(); if (FileUtil.doesFileExist(filename)) { List lines = FileUtil.readFile(filename); for (String line : lines) { @@ -108,7 +108,7 @@ public class NetDeckCategory extends StorageBase { private final String url; private NetDeckCategory(String name0, String url0) { - super(name0, ForgeConstants.DECK_NET_DIR + name0, new HashMap()); + super(name0, ForgeConstants.DECK_NET_DIR + name0, new HashMap<>()); url = url0; } diff --git a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java index 4c2d999abce..8837c75ad1b 100644 --- a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java @@ -20,7 +20,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable getRandomDecks(final IHasGameType lstDecks0, final boolean isAi0) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); decks.add(new RandomDeckGenerator("Random Generated Deck", RandomDeckType.Generated, lstDecks0, isAi0)); decks.add(new RandomDeckGenerator("Random User Deck", RandomDeckType.User, lstDecks0, isAi0)); @@ -96,7 +96,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable colors = new ArrayList(); + List colors = new ArrayList<>(); int count = Aggregates.randomInt(1, 3); for (int i = 1; i <= count; i++) { colors.add("Random " + i); @@ -111,14 +111,14 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable(); + colors = new ArrayList<>(); count = Aggregates.randomInt(1, 3); for (int i = 1; i <= count; i++) { colors.add("Random " + i); } return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getStandard().getFilterPrinted(), isAi); case MODERN_COLOR_DECK: - colors = new ArrayList(); + colors = new ArrayList<>(); count = Aggregates.randomInt(1, 3); for (int i = 1; i <= count; i++) { colors.add("Random " + i); diff --git a/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java b/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java index 3e2f6205b2a..cb5c58ccab5 100644 --- a/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java +++ b/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java @@ -24,7 +24,7 @@ import org.w3c.dom.NodeList; public class DeckPreferences { private static String selectedDeckType = "", currentDeck = "", draftDeck = "", sealedDeck = "", commanderDeck = "", oathbreakerDeck = "", tinyLeadersDeck = "", brawlDeck = "", planarDeck = "", schemeDeck = ""; - private static Map allPrefs = new HashMap(); + private static Map allPrefs = new HashMap<>(); public static DeckType getSelectedDeckType() { return selectedDeckType.isEmpty() ? DeckType.CONSTRUCTED_DECK : DeckType.valueOf(selectedDeckType); diff --git a/forge-gui/src/main/java/forge/deck/io/DeckRecords.java b/forge-gui/src/main/java/forge/deck/io/DeckRecords.java index 385799853cc..3588662674b 100644 --- a/forge-gui/src/main/java/forge/deck/io/DeckRecords.java +++ b/forge-gui/src/main/java/forge/deck/io/DeckRecords.java @@ -14,7 +14,7 @@ import forge.game.player.RegisteredPlayer; @SuppressWarnings("unused") public class DeckRecords { - private static final Map recordLookup = new HashMap(); + private static final Map recordLookup = new HashMap<>(); public static void recordMatchOutcome(Match match) { for (RegisteredPlayer p1 : match.getPlayers()) { @@ -25,7 +25,7 @@ public class DeckRecords { } } - private final List matches = new ArrayList(); + private final List matches = new ArrayList<>(); public void addMatch(Match match, LobbyPlayer player) { matches.add(new DeckMatch(match, player)); diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java index cd97aacc017..7783f2872de 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java @@ -38,7 +38,7 @@ public class GuiDownloadPicturesHQ extends GuiDownloadService { @Override protected final Map getNeededFiles() { File f = new File(ForgeConstants.CACHE_CARD_PICS_DIR); - existingImages = new ArrayList(Arrays.asList(f.list())); + existingImages = new ArrayList<>(Arrays.asList(f.list())); existingSets = retrieveManifestDirectory(); for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) { diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java index 6bcbee8ce0a..8faf330004f 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java @@ -39,7 +39,7 @@ public class GuiDownloadPicturesLQ extends GuiDownloadService { @Override protected final Map getNeededFiles() { File f = new File(ForgeConstants.CACHE_CARD_PICS_DIR); - existingImages = new ArrayList(Arrays.asList(f.list())); + existingImages = new ArrayList<>(Arrays.asList(f.list())); existingSets = retrieveManifestDirectory(); for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) { diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java b/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java index 8e13bdca4f3..f1d1dc9b8d4 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java @@ -48,7 +48,7 @@ public class GuiDownloadZipService extends GuiDownloadService { @Override protected final Map getNeededFiles() { - final Map files = new HashMap(); + final Map files = new HashMap<>(); files.put("_", "_"); return files; //not needed by zip service, so just return map of size 1 } diff --git a/forge-gui/src/main/java/forge/gauntlet/GauntletData.java b/forge-gui/src/main/java/forge/gauntlet/GauntletData.java index c471c546da2..e9b470cf10a 100644 --- a/forge-gui/src/main/java/forge/gauntlet/GauntletData.java +++ b/forge-gui/src/main/java/forge/gauntlet/GauntletData.java @@ -30,8 +30,8 @@ public final class GauntletData { private int completed; private String timestamp; - private List eventRecords = new ArrayList(); - private List eventNames = new ArrayList(); + private List eventRecords = new ArrayList<>(); + private List eventNames = new ArrayList<>(); private Deck userDeck; private List decks; @@ -101,7 +101,7 @@ public final class GauntletData { } public List getDeckNames() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : decks) { names.add(d.getName()); } return names; } diff --git a/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java b/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java index 46d73a1552d..65b784084a5 100644 --- a/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java +++ b/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java @@ -18,8 +18,8 @@ public class GauntletUtil { // Generate gauntlet decks Deck deck; - final List eventNames = new ArrayList(); - final List decks = new ArrayList(); + final List eventNames = new ArrayList<>(); + final List decks = new ArrayList<>(); final Object[] netDeckNames = netDecks != null ? netDecks.getItemNames().toArray() : null; @@ -86,7 +86,7 @@ public class GauntletUtil { public static void setDefaultGauntletName(GauntletData gauntlet, String prefix) { final File[] arrFiles = GauntletIO.getGauntletFilesUnlocked(prefix); - final Set setNames = new HashSet(); + final Set setNames = new HashSet<>(); for (File f : arrFiles) { setNames.add(f.getName()); } diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index d9fd40b25c5..a7a96a4837b 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -139,7 +139,7 @@ public class AdvancedSearch { @Override protected Set getItemValues(PaperCard input) { final CardType type = input.getRules().getType(); - final Set types = new HashSet(); + final Set types = new HashSet<>(); for (Supertype t : type.getSupertypes()) { types.add(t.name()); } @@ -736,7 +736,7 @@ public class AdvancedSearch { } }; } - return new Filter(option, operator, caption, predicate); + return new Filter<>(option, operator, caption, predicate); } protected abstract List getValues(FilterOption option, FilterOperator operator); @@ -754,7 +754,7 @@ public class AdvancedSearch { @Override protected List getValues(FilterOption option, FilterOperator operator) { - List values = new ArrayList(); + List values = new ArrayList<>(); values.add(operator == FilterOperator.IS_TRUE); //just always add a single boolean value so other logic works return values; } @@ -785,7 +785,7 @@ public class AdvancedSearch { Integer lowerBound = SGuiChoose.getInteger(message, min, max); if (lowerBound == null) { return null; } - final List values = new ArrayList(); + final List values = new ArrayList<>(); values.add(lowerBound); if (operator.valueCount == FilterValueCount.TWO) { //prompt for upper bound if needed @@ -825,7 +825,7 @@ public class AdvancedSearch { initialInput = value; //store value as initial input for next time - List values = new ArrayList(); + List values = new ArrayList<>(); values.add(value); return values; } @@ -934,10 +934,10 @@ public class AdvancedSearch { if (amount == null) { return null; } } - Map map = new HashMap(); + Map map = new HashMap<>(); map.put(card.getName(), amount); - List> values = new ArrayList>(); + List> values = new ArrayList<>(); values.add(map); return values; } @@ -958,7 +958,7 @@ public class AdvancedSearch { final FilterOption defaultOption = editFilter == null ? null : editFilter.option; if (defaultOption == null || reselectOption) { //build list of filter options based on ItemManager type - List options = new ArrayList(); + List options = new ArrayList<>(); if (editFilter != null) { options.add(FilterOption.NONE); //provide option to clear existing filter } @@ -1051,8 +1051,8 @@ public class AdvancedSearch { public static class Model { private static final String EMPTY_FILTER_TEXT = "Select Filter..."; - private final List expression = new ArrayList(); - private final List> controls = new ArrayList>(); + private final List expression = new ArrayList<>(); + private final List> controls = new ArrayList<>(); private IButton label; public Model() { diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index f39870fb687..2fc2578911e 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -282,7 +282,7 @@ public enum GroupDef { private static Map setGroupMap; private static String[] getSetGroups() { - setGroupMap = new HashMap(); //cache mappings to make lookup quicker later + setGroupMap = new HashMap<>(); //cache mappings to make lookup quicker later //build sorted list of sets List sortedSets = Lists.newArrayList(FModel.getMagicDb().getEditions()); diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java index b08cb5247f2..0404e78939d 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java @@ -121,13 +121,13 @@ public enum ItemManagerConfig { } showUniqueCardsOption = showUniqueCardsOption0; - uniqueCardsOnly = new Prop(uniqueCardsOnly0); - hideFilters = new Prop(hideFilters0); - compactListView = new Prop(FModel.getPreferences().getPrefBoolean(FPref.UI_COMPACT_LIST_ITEMS)); //use main setting to determine default - groupBy = new Prop(groupBy0); - pileBy = new Prop(pileBy0); - imageColumnCount = new Prop(imageColumnCount0); - viewIndex = new Prop(viewIndex0); + uniqueCardsOnly = new Prop<>(uniqueCardsOnly0); + hideFilters = new Prop<>(hideFilters0); + compactListView = new Prop<>(FModel.getPreferences().getPrefBoolean(FPref.UI_COMPACT_LIST_ITEMS)); //use main setting to determine default + groupBy = new Prop<>(groupBy0); + pileBy = new Prop<>(pileBy0); + imageColumnCount = new Prop<>(imageColumnCount0); + viewIndex = new Prop<>(viewIndex0); } private class Prop { diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java index 31c8dc92d7a..cb634c6f120 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java @@ -20,7 +20,6 @@ package forge.itemmanager; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import forge.item.InventoryItem; @@ -37,7 +36,7 @@ public final class ItemManagerModel { private final CascadeManager cascadeManager = new CascadeManager(); public ItemManagerModel(final Class genericType0) { - data = new ItemPool(genericType0); + data = new ItemPool<>(genericType0); } public void clear() { @@ -46,7 +45,7 @@ public final class ItemManagerModel { // same thing as above, it was copied to provide sorting (needed by table // views in deck editors) - private final transient List> itemsOrdered = new ArrayList>(); + private final transient List> itemsOrdered = new ArrayList<>(); protected transient boolean isListInSync = false; @@ -130,7 +129,7 @@ public final class ItemManagerModel { //Manages sorting orders for multiple depths of sorting public final class CascadeManager { - private final List colsToSort = new ArrayList(3); + private final List colsToSort = new ArrayList<>(3); private Sorter sorter = null; // Adds a column to sort cascade list. @@ -184,10 +183,10 @@ public final class ItemManagerModel { } private Sorter createSorter() { - final List> oneColSorters = new ArrayList>(maxSortDepth); + final List> oneColSorters = new ArrayList<>(maxSortDepth); for (final ItemColumn col : colsToSort) { - oneColSorters.add(new ItemPoolSorter( + oneColSorters.add(new ItemPoolSorter<>( col.getFnSort(), col.getConfig().getSortState().equals(SortState.ASC))); } diff --git a/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java b/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java index f77db9dfcec..b3c73ac443a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java @@ -34,7 +34,7 @@ import forge.itemmanager.ItemColumnConfig.SortState; public final class SColumnUtil { public static Map getColumns(Iterable colDefs) { int i = 0; - final Map columns = new HashMap(); + final Map columns = new HashMap<>(); for (ColumnDef colDef : colDefs) { ItemColumnConfig column = new ItemColumnConfig(colDef); column.setIndex(i++); @@ -44,7 +44,7 @@ public final class SColumnUtil { } public static Map getStringColumn() { - Map columns = new HashMap(); + Map columns = new HashMap<>(); ItemColumnConfig column = new ItemColumnConfig(ColumnDef.STRING); column.setSortPriority(1); columns.put(ColumnDef.STRING, column); @@ -56,7 +56,7 @@ public final class SColumnUtil { } private static Map getCardColumns(ColumnDef quantityColDef, boolean includeFavorite, boolean includeOwned, boolean includePrice, boolean includeNew, boolean includeDecks) { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); if (includeFavorite) { colDefs.add(ColumnDef.FAVORITE); } @@ -128,7 +128,7 @@ public final class SColumnUtil { } public static Map getSpecialCardPoolDefaultColumns() { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); colDefs.add(ColumnDef.FAVORITE); colDefs.add(ColumnDef.NAME); colDefs.add(ColumnDef.TYPE); @@ -195,7 +195,7 @@ public final class SColumnUtil { } public static Map getConquestCommandersDefaultColumns() { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); colDefs.add(ColumnDef.NAME); colDefs.add(ColumnDef.COLOR); @@ -206,7 +206,7 @@ public final class SColumnUtil { } public static Map getDecksDefaultColumns(boolean allowEdit, boolean includeFolder) { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); colDefs.add(ColumnDef.DECK_FAVORITE); if (allowEdit) { colDefs.add(ColumnDef.DECK_ACTIONS); diff --git a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java index 2f6a7291536..241cb827008 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java @@ -71,7 +71,7 @@ public class SFilterUtil { private static List getSplitText(String text) { boolean inQuotes = false; String entry = ""; - List splitText = new ArrayList(); + List splitText = new ArrayList<>(); for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); switch (ch) { diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index 1fb55a4f7b7..f08c8960ded 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -91,7 +91,7 @@ public final class SItemManagerUtil { } public static String getItemDisplayString(final InventoryItem item, final int qty, final boolean forTitle) { - final List items = new ArrayList(); + final List items = new ArrayList<>(); items.add(item); return getItemDisplayString(items, qty, forTitle); } @@ -142,7 +142,7 @@ public final class SItemManagerUtil { } public static String buildDisplayList(final Iterable> items) { - final List> sorted = new ArrayList>(); + final List> sorted = new ArrayList<>(); for (final Entry itemEntry : items) { sorted.add(itemEntry); } diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java b/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java index 3ac539038de..86f83429d97 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java @@ -40,8 +40,8 @@ public class BoosterDraftAI { protected static final int N_DECKS = 7; // holds all the cards for each of the computer's decks - protected final List> decks = new ArrayList>(); - protected final List playerColors = new ArrayList(); + protected final List> decks = new ArrayList<>(); + protected final List playerColors = new ArrayList<>(); /** *

@@ -95,7 +95,7 @@ public class BoosterDraftAI { public BoosterDraftAI() { // Initialize deck array and playerColors list for (int i = 0; i < N_DECKS; i++) { - this.decks.add(new ArrayList()); + this.decks.add(new ArrayList<>()); this.playerColors.add(new DeckColors()); } } // BoosterDraftAI() diff --git a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java index 1188f0e943b..a1521f88113 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java @@ -948,7 +948,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { - final Map creatureCosts = new HashMap(); + final Map creatureCosts = new HashMap<>(); for (int i = 1; i < 7; i++) { creatureCosts.put(i, 0); } diff --git a/forge-gui/src/main/java/forge/limited/CustomLimited.java b/forge-gui/src/main/java/forge/limited/CustomLimited.java index dda54f28604..b87b0b8bfbc 100644 --- a/forge-gui/src/main/java/forge/limited/CustomLimited.java +++ b/forge-gui/src/main/java/forge/limited/CustomLimited.java @@ -98,7 +98,7 @@ public class CustomLimited extends DeckBase { public static CustomLimited parse(final List dfData, final IStorage cubes) { final FileSection data = FileSection.parse(dfData, ":"); - List> slots = new ArrayList>(); + List> slots = new ArrayList<>(); String boosterData = data.get("Booster"); if (StringUtils.isNotEmpty(boosterData)) { final String[] booster = TextUtil.splitWithParenthesis(boosterData, ','); diff --git a/forge-gui/src/main/java/forge/limited/GauntletMini.java b/forge-gui/src/main/java/forge/limited/GauntletMini.java index d58b865a479..2a953e318bc 100644 --- a/forge-gui/src/main/java/forge/limited/GauntletMini.java +++ b/forge-gui/src/main/java/forge/limited/GauntletMini.java @@ -47,7 +47,7 @@ public class GauntletMini { private int losses; private boolean gauntletDraft; // Means: Draft game is in Gauntlet-mode, not a single match private GameType gauntletType; - private final List aiOpponents = new ArrayList(); + private final List aiOpponents = new ArrayList<>(); public GauntletMini() { currentRound = 1; @@ -135,7 +135,7 @@ public class GauntletMini { * Starts the tournament. */ private void startRound() { - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(aiOpponents.get(currentRound - 1).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java index 28c653301de..7f89655fb03 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java @@ -56,8 +56,8 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { protected Predicate hasColor; protected final List availableList; protected final List aiPlayables; - protected final List deckList = new ArrayList(); - protected final List setsWithBasicLands = new ArrayList(); + protected final List deckList = new ArrayList<>(); + protected final List setsWithBasicLands = new ArrayList<>(); protected List rankedColorList; protected final List draftedConspiracies; @@ -324,7 +324,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { * Find the sets that have basic lands for the available cards. */ private void findBasicLandSets() { - final Set sets = new HashSet(); + final Set sets = new HashSet<>(); for (final PaperCard cp : aiPlayables) { final CardEdition ee = FModel.getMagicDb().getEditions().get(cp.getEdition()); if( !sets.contains(cp.getEdition()) && CardEdition.Predicates.hasBasicLands.apply(ee)) { @@ -348,7 +348,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { private void addLands(final int[] clrCnts, final String landSetCode) { // basic lands that are available in the deck final Iterable basicLands = Iterables.filter(aiPlayables, Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard.FN_GET_RULES)); - final Set snowLands = new HashSet(); + final Set snowLands = new HashSet<>(); // total of all ClrCnts int totalColor = 0; @@ -598,7 +598,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { final PaperCard card = it.next(); final CardAiHints ai = card.getRules().getAiHints(); if (ai.getRemRandomDecks()) { - final List comboCards = new ArrayList(); + final List comboCards = new ArrayList<>(); if (ai.getDeckNeeds() != null && ai.getDeckNeeds().isValid()) { final DeckHints needs = ai.getDeckNeeds(); comboCards.addAll(needs.filter(deckList)); @@ -676,7 +676,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { * number to add */ private void addManaCurveCreatures(final Iterable creatures, int num) { - final Map creatureCosts = new HashMap(); + final Map creatureCosts = new HashMap<>(); for (int i = 1; i < 7; i++) { creatureCosts.put(i, 0); } diff --git a/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java b/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java index d8556fb2aaa..81b117adb39 100644 --- a/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java +++ b/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java @@ -25,12 +25,12 @@ public class ReadDraftRankings { *

*/ public ReadDraftRankings() { - this.setSizes = new HashMap(); + this.setSizes = new HashMap<>(); this.draftRankings = this.readFile(FileUtil.readFile(ForgeConstants.DRAFT_RANKINGS_FILE)); } // setup() public ReadDraftRankings(String customFile) { - this.setSizes = new HashMap(); + this.setSizes = new HashMap<>(); this.draftRankings = this.readFile(FileUtil.readFile(ForgeConstants.DRAFT_DIR + customFile)); } @@ -45,7 +45,7 @@ public class ReadDraftRankings { */ private Map> readFile(List lines) { - final Map> map = new HashMap>(); + final Map> map = new HashMap<>(); for (String line : lines) { // stop reading if end of file or blank line is read if (line == null || line.length() == 0) { @@ -64,7 +64,7 @@ public class ReadDraftRankings { try { final int rank = Integer.parseInt(rankStr); if (!map.containsKey(edition)) { - map.put(edition, new HashMap()); + map.put(edition, new HashMap<>()); } map.get(edition).put(name, rank); if (setSizes.containsKey(edition)) { diff --git a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java index d975ea30ce3..89323950028 100644 --- a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java +++ b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java @@ -60,7 +60,7 @@ import java.util.Stack; public class SealedCardPoolGenerator { public static final String FILE_EXT = ".sealed"; - private final List product = new ArrayList(); + private final List product = new ArrayList<>(); /** The Land set code. */ private String landSetCode = null; @@ -168,7 +168,7 @@ public class SealedCardPoolGenerator { case Block: case FantasyBlock: - List blocks = new ArrayList(); + List blocks = new ArrayList<>(); Iterable src = poolType == LimitedPoolType.Block ? FModel.getBlocks() : FModel.getFantasyBlocks(); for (CardBlock b : src) { blocks.add(b); @@ -178,7 +178,7 @@ public class SealedCardPoolGenerator { if (block == null) { return; } final int nPacks = block.getCntBoostersSealed(); - final Stack sets = new Stack(); + final Stack sets = new Stack<>(); for (CardEdition edition : block.getSets()) { sets.add(edition.getCode()); @@ -218,7 +218,7 @@ public class SealedCardPoolGenerator { case Custom: String[] dList; - final List customs = new ArrayList(); + final List customs = new ArrayList<>(); // get list of custom draft files final File dFolder = new File(ForgeConstants.SEALED_DIR); @@ -283,7 +283,7 @@ public class SealedCardPoolGenerator { private static List getSetCombos(final List setz, final int nPacks) { // TODO These permutations really should be completely generated String[] sets = setz.toArray(ArrayUtils.EMPTY_STRING_ARRAY); - List setCombos = new ArrayList(); + List setCombos = new ArrayList<>(); if (nPacks == 3) { if (sets.length >= 2) { diff --git a/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java index 4a87f4ed6ab..6cde57b09b4 100644 --- a/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java @@ -30,7 +30,7 @@ public class SealedDeckBuilder extends LimitedDeckBuilder { */ private ColorSet chooseColors() { // choose colors based on top 33% of cards - final List colorChooserList = new ArrayList(); + final List colorChooserList = new ArrayList<>(); // this is not exactly right, because the rankings here are taking into account deckhints // for the whole set of cards, when some of those cards could be in colors that won't // make it into the deck @@ -54,8 +54,8 @@ public class SealedDeckBuilder extends LimitedDeckBuilder { int[] countsCopy = Arrays.copyOf(colorCounts, 5); Arrays.sort(countsCopy); - List maxColors = new ArrayList(); - List secondColors = new ArrayList(); + List maxColors = new ArrayList<>(); + List secondColors = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (countsCopy[4] == colorCounts[i]) { maxColors.add(MagicColor.Constant.ONLY_COLORS.get(i)); diff --git a/forge-gui/src/main/java/forge/limited/WinstonDraft.java b/forge-gui/src/main/java/forge/limited/WinstonDraft.java index bb12c63d5b1..ff75cc5a827 100644 --- a/forge-gui/src/main/java/forge/limited/WinstonDraft.java +++ b/forge-gui/src/main/java/forge/limited/WinstonDraft.java @@ -38,7 +38,7 @@ public class WinstonDraft extends BoosterDraft { } private void initializeWinstonDraft() { - this.deck = new Stack(); + this.deck = new Stack<>(); for (int i = 0; i < this.product.size(); i++) { final Supplier> supply = this.product.get(i); for(int j = 0; j < NUM_PLAYERS; j++) { @@ -53,7 +53,7 @@ public class WinstonDraft extends BoosterDraft { // Create three Winston piles, adding the top card from the Winston deck to start each pile this.piles = new ArrayList<>(); for(int i = 0; i < NUM_PILES; i++) { - final List pile = new ArrayList(); + final List pile = new ArrayList<>(); pile.add(this.deck.pop()); this.piles.add(pile); } diff --git a/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java b/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java index 92cc5ebe276..edc6b7b2a87 100644 --- a/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java +++ b/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import forge.deck.CardPool; -import forge.item.PaperCard; import forge.util.MyRandom; public class WinstonDraftAI extends BoosterDraftAI{ @@ -25,7 +24,7 @@ public class WinstonDraftAI extends BoosterDraftAI{ this.decks.clear(); this.playerColors.clear(); for (int i = 0; i < N_DECKS; i++) { - this.decks.add(new ArrayList()); + this.decks.add(new ArrayList<>()); this.playerColors.add(new DeckColors()); } } diff --git a/forge-gui/src/main/java/forge/match/GameLobby.java b/forge-gui/src/main/java/forge/match/GameLobby.java index 797ecec2a73..6f9bfd78659 100644 --- a/forge-gui/src/main/java/forge/match/GameLobby.java +++ b/forge-gui/src/main/java/forge/match/GameLobby.java @@ -407,7 +407,7 @@ public abstract class GameLobby implements IHasGameType { } } - final List players = new ArrayList(); + final List players = new ArrayList<>(); final Map guis = Maps.newHashMap(); final Map playerToSlot = Maps.newHashMap(); boolean hasNameBeenSet = false; diff --git a/forge-gui/src/main/java/forge/match/HostedMatch.java b/forge-gui/src/main/java/forge/match/HostedMatch.java index bfcb5ad06c7..47b8c57d93c 100644 --- a/forge-gui/src/main/java/forge/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/match/HostedMatch.java @@ -160,7 +160,7 @@ public class HostedMatch { final GameView gameView = getGameView(); humanCount = 0; - final MapOfLists playersPerGui = new HashMapOfLists(CollectionSuppliers.arrayLists()); + final MapOfLists playersPerGui = new HashMapOfLists<>(CollectionSuppliers.arrayLists()); for (int iPlayer = 0; iPlayer < players.size(); iPlayer++) { final RegisteredPlayer rp = match.getPlayers().get(iPlayer); final Player p = players.get(iPlayer); @@ -197,7 +197,7 @@ public class HostedMatch { } for (final Entry> e : playersPerGui.entrySet()) { - e.getKey().openView(new TrackableCollection(e.getValue())); + e.getKey().openView(new TrackableCollection<>(e.getValue())); } if (humanCount == 0) { //watch game but do not participate diff --git a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java index d793efba100..adff270db60 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java @@ -134,7 +134,7 @@ public class InputPassPriority extends InputSyncronizedBase { final SpellAbility ability = getController().getAbilityToPlay(card, abilities, triggerEvent); if (ability != null) { - chosenSa = new ArrayList(); + chosenSa = new ArrayList<>(); chosenSa.add(ability); if (otherCardsToSelect != null && ability.isManaAbility()) { //if mana ability activated, activate same ability on other cards to select if possible @@ -172,7 +172,7 @@ public class InputPassPriority extends InputSyncronizedBase { @Override public boolean selectAbility(final SpellAbility ab) { if (ab != null) { - chosenSa = new ArrayList(); + chosenSa = new ArrayList<>(); chosenSa.add(ab); stop(); return true; diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 516fa477976..76573d288b3 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -43,7 +43,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { protected ManaCostBeingPaid manaCost; protected final SpellAbility saPaidFor; private final boolean wasFloatingMana; - private final Queue delaySelectCards = new LinkedList(); + private final Queue delaySelectCards = new LinkedList<>(); private boolean bPaid = false; protected Boolean canPayManaCost = null; @@ -141,7 +141,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { } public List getUsefulManaAbilities(Card card) { - List abilities = new ArrayList(); + List abilities = new ArrayList<>(); if (card.getController() != player) { return abilities; @@ -362,7 +362,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { final Card source = am.getHostCard(); final Player activator = am.getActivatingPlayer(); final Game g = source.getGame(); - final HashMap repParams = new HashMap(); + final HashMap repParams = new HashMap<>(); repParams.put("Event", "ProduceMana"); repParams.put("Mana", m.getOrigProduced()); repParams.put("Affected", source); diff --git a/forge-gui/src/main/java/forge/match/input/InputProxy.java b/forge-gui/src/main/java/forge/match/input/InputProxy.java index 15c9774310a..b503dc8ae74 100644 --- a/forge-gui/src/main/java/forge/match/input/InputProxy.java +++ b/forge-gui/src/main/java/forge/match/input/InputProxy.java @@ -43,7 +43,7 @@ import forge.util.ITriggerEvent; public class InputProxy implements Observer { /** The input. */ - private AtomicReference input = new AtomicReference(); + private AtomicReference input = new AtomicReference<>(); private final PlayerControllerHuman controller; // private static final boolean DEBUG_INPUT = true; // false; @@ -136,7 +136,7 @@ public class InputProxy implements Observer { final Card c = getCard(cv); if (c != null) { if (otherCardsToSelect == null) { - otherCardsToSelect = new ArrayList(); + otherCardsToSelect = new ArrayList<>(); } otherCardsToSelect.add(c); } diff --git a/forge-gui/src/main/java/forge/match/input/InputQueue.java b/forge-gui/src/main/java/forge/match/input/InputQueue.java index ad64c4126a7..2b745dcd1b1 100644 --- a/forge-gui/src/main/java/forge/match/input/InputQueue.java +++ b/forge-gui/src/main/java/forge/match/input/InputQueue.java @@ -33,7 +33,7 @@ import forge.player.PlayerControllerHuman; * @version $Id: InputQueue.java 24769 2014-02-09 13:56:04Z Hellfish $ */ public class InputQueue extends Observable { - private final BlockingDeque inputStack = new LinkedBlockingDeque(); + private final BlockingDeque inputStack = new LinkedBlockingDeque<>(); private final Game game; public InputQueue(final Game game, final InputProxy inputProxy) { diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java b/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java index cfbc2826b67..bfe0d22beb8 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java @@ -26,7 +26,7 @@ import forge.util.ITriggerEvent; public final class InputSelectCardsForConvokeOrImprovise extends InputSelectManyBase { private static final long serialVersionUID = -1779224307654698954L; - private final Map> chosenCards = new HashMap>(); + private final Map> chosenCards = new HashMap<>(); private final ManaCostBeingPaid remainingCost; private final Player player; private final CardCollectionView availableCards; @@ -115,7 +115,7 @@ public final class InputSelectCardsForConvokeOrImprovise extends InputSelectMany } public Map getConvokeMap() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); if(!hasCancelled()) { for(final Entry> c : chosenCards.entrySet()) { result.put(c.getKey(), c.getValue().right); diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index 374573b19f3..fc8b962b19c 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -23,7 +23,7 @@ public class InputSelectEntitiesFromList extends InputSele private static final long serialVersionUID = -6609493252672573139L; private final FCollectionView validChoices; - protected final FCollection selected = new FCollection(); + protected final FCollection selected = new FCollection<>(); protected Iterable zonesShown; // want to hide these zones when input done public InputSelectEntitiesFromList(final PlayerControllerHuman controller, final int min, final int max, final FCollectionView validChoices0) { @@ -36,7 +36,7 @@ public class InputSelectEntitiesFromList extends InputSele if (min > validChoices.size()) { // pfps does this really do anything useful?? System.out.println(String.format("Trying to choose at least %d things from a list with only %d things!", min, validChoices.size())); } - ArrayList vCards = new ArrayList(); + ArrayList vCards = new ArrayList<>(); for ( T c : validChoices0 ) { if ( c instanceof Card ) { vCards.add(((Card)c).getView()) ; diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java index 46cdd2f2f75..d67b78b4698 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java @@ -29,7 +29,7 @@ import forge.FThreads; public final class InputSelectTargets extends InputSyncronizedBase { private final List choices; // some cards can be targeted several times (eg: distribute damage as you choose) - private final Map targetDepth = new HashMap(); + private final Map targetDepth = new HashMap<>(); private final TargetRestrictions tgt; private final SpellAbility sa; private Card lastTarget = null; @@ -172,7 +172,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { // If all cards must have different controllers if (tgt.isDifferentControllers()) { - final List targetedControllers = new ArrayList(); + final List targetedControllers = new ArrayList<>(); for (final GameObject o : targetDepth.keySet()) { if (o instanceof Card) { final Player p = ((Card) o).getController(); diff --git a/forge-gui/src/main/java/forge/model/CardBlock.java b/forge-gui/src/main/java/forge/model/CardBlock.java index a3893102354..ec4f45cff3d 100644 --- a/forge-gui/src/main/java/forge/model/CardBlock.java +++ b/forge-gui/src/main/java/forge/model/CardBlock.java @@ -44,7 +44,7 @@ public final class CardBlock implements Comparable { private final int orderNum; private final String name; private final List sets; - private final Map metaSets = new TreeMap(); + private final Map metaSets = new TreeMap<>(); private final CardEdition landSet; private final int cntBoostersDraft; private final int cntBoostersSealed; @@ -139,7 +139,7 @@ public final class CardBlock implements Comparable { } private Predicate buildFilter() { - final List setCodes = new ArrayList(); + final List setCodes = new ArrayList<>(); for (final CardEdition set : this.sets) { setCodes.add(set.getCode()); } @@ -246,8 +246,8 @@ public final class CardBlock implements Comparable { int sealedBoosters = StringUtils.isNumeric(numbers[1]) ? Integer.parseInt(numbers[1]) : 0; CardEdition landSet = editions.getEditionByCodeOrThrow(numbers[2]); - List sets = new ArrayList(); - List metas = new ArrayList(); + List sets = new ArrayList<>(); + List metas = new ArrayList<>(); String[] setNames = TextUtil.splitWithParenthesis(sParts[2], ' ' ); for(final String set : setNames ) { diff --git a/forge-gui/src/main/java/forge/model/CardCollections.java b/forge-gui/src/main/java/forge/model/CardCollections.java index 9f1e16d5598..aea26ca713d 100644 --- a/forge-gui/src/main/java/forge/model/CardCollections.java +++ b/forge-gui/src/main/java/forge/model/CardCollections.java @@ -50,7 +50,7 @@ public class CardCollections { public final IStorage getConstructed() { if (constructed == null) { - constructed = new StorageImmediatelySerialized("Constructed decks", + constructed = new StorageImmediatelySerialized<>("Constructed decks", new DeckStorage(new File(ForgeConstants.DECK_CONSTRUCTED_DIR), ForgeConstants.DECK_BASE_DIR, true), true); } @@ -59,7 +59,7 @@ public class CardCollections { public final IStorage getDraft() { if (draft == null) { - draft = new StorageImmediatelySerialized("Draft deck sets", + draft = new StorageImmediatelySerialized<>("Draft deck sets", new DeckGroupSerializer(new File(ForgeConstants.DECK_DRAFT_DIR), ForgeConstants.DECK_BASE_DIR)); } return draft; @@ -67,7 +67,7 @@ public class CardCollections { public IStorage getSealed() { if (sealed == null) { - sealed = new StorageImmediatelySerialized("Sealed deck sets", + sealed = new StorageImmediatelySerialized<>("Sealed deck sets", new DeckGroupSerializer(new File(ForgeConstants.DECK_SEALED_DIR), ForgeConstants.DECK_BASE_DIR)); } return sealed; @@ -75,7 +75,7 @@ public class CardCollections { public final IStorage getWinston() { if (winston == null) { - winston = new StorageImmediatelySerialized("Winston draft deck sets", + winston = new StorageImmediatelySerialized<>("Winston draft deck sets", new DeckGroupSerializer(new File(ForgeConstants.DECK_WINSTON_DIR), ForgeConstants.DECK_BASE_DIR)); } return winston; @@ -83,7 +83,7 @@ public class CardCollections { public final IStorage getCubes() { if (cube == null) { - cube = new StorageImmediatelySerialized("Cubes", + cube = new StorageImmediatelySerialized<>("Cubes", new DeckStorage(new File(ForgeConstants.DECK_CUBE_DIR), ForgeConstants.RES_DIR)); } return cube; @@ -91,7 +91,7 @@ public class CardCollections { public IStorage getScheme() { if (scheme == null) { - scheme = new StorageImmediatelySerialized("Archenemy decks", + scheme = new StorageImmediatelySerialized<>("Archenemy decks", new DeckStorage(new File(ForgeConstants.DECK_SCHEME_DIR), ForgeConstants.DECK_BASE_DIR)); } return scheme; @@ -99,7 +99,7 @@ public class CardCollections { public IStorage getPlane() { if (plane == null) { - plane = new StorageImmediatelySerialized("Planechase decks", + plane = new StorageImmediatelySerialized<>("Planechase decks", new DeckStorage(new File(ForgeConstants.DECK_PLANE_DIR), ForgeConstants.DECK_BASE_DIR)); } return plane; @@ -107,7 +107,7 @@ public class CardCollections { public IStorage getCommander() { if (commander == null) { - commander = new StorageImmediatelySerialized("Commander decks", + commander = new StorageImmediatelySerialized<>("Commander decks", new DeckStorage(new File(ForgeConstants.DECK_COMMANDER_DIR), ForgeConstants.DECK_BASE_DIR)); } return commander; @@ -115,7 +115,7 @@ public class CardCollections { public IStorage getOathbreaker() { if (oathbreaker == null) { - oathbreaker = new StorageImmediatelySerialized("Oathbreaker decks", + oathbreaker = new StorageImmediatelySerialized<>("Oathbreaker decks", new DeckStorage(new File(ForgeConstants.DECK_OATHBREAKER_DIR), ForgeConstants.DECK_BASE_DIR)); } return oathbreaker; @@ -123,7 +123,7 @@ public class CardCollections { public IStorage getTinyLeaders() { if (tinyLeaders == null) { - tinyLeaders = new StorageImmediatelySerialized("Tiny Leaders decks", + tinyLeaders = new StorageImmediatelySerialized<>("Tiny Leaders decks", new DeckStorage(new File(ForgeConstants.DECK_TINY_LEADERS_DIR), ForgeConstants.DECK_BASE_DIR)); } return tinyLeaders; @@ -131,7 +131,7 @@ public class CardCollections { public IStorage getBrawl() { if (brawl == null) { - brawl = new StorageImmediatelySerialized("Brawl decks", + brawl = new StorageImmediatelySerialized<>("Brawl decks", new DeckStorage(new File(ForgeConstants.DECK_BRAWL_DIR), ForgeConstants.DECK_BASE_DIR)); } return brawl; diff --git a/forge-gui/src/main/java/forge/model/UnOpenedMeta.java b/forge-gui/src/main/java/forge/model/UnOpenedMeta.java index 0a819c54d26..b704188dc4a 100644 --- a/forge-gui/src/main/java/forge/model/UnOpenedMeta.java +++ b/forge-gui/src/main/java/forge/model/UnOpenedMeta.java @@ -54,7 +54,7 @@ public class UnOpenedMeta implements IUnOpenedProduct { * the GuiBase.getInterface(). */ private UnOpenedMeta(final String creationString, final JoinOperation op) { - metaSets = new ArrayList(); + metaSets = new ArrayList<>(); operation = op; for (String m : TextUtil.splitWithParenthesis(creationString, ';')) { @@ -107,7 +107,7 @@ public class UnOpenedMeta implements IUnOpenedProduct { return newBooster.get(); case SelectAll: - List allCards = new ArrayList(); + List allCards = new ArrayList<>(); for (MetaSet ms : metaSets) { allCards.addAll(ms.getBooster().get()); } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java b/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java index c6584392c97..077981baee7 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java @@ -8,10 +8,10 @@ public class ConquestAwardPool { public final List commons, uncommons, rares, mythics; public ConquestAwardPool(Iterable cards) { - commons = new ArrayList(); - uncommons = new ArrayList(); - rares = new ArrayList(); - mythics = new ArrayList(); + commons = new ArrayList<>(); + uncommons = new ArrayList<>(); + rares = new ArrayList<>(); + mythics = new ArrayList<>(); for (PaperCard c : cards) { switch (c.getRarity()) { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java index c0ce7625964..41dba7860ac 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java @@ -73,7 +73,7 @@ public class ConquestController { File decksDir = new File(model.getDirectory(), "decks"); FileUtil.ensureDirectoryExists(decksDir); DeckStorage storage = new DeckStorage(decksDir, ForgeConstants.CONQUEST_SAVE_DIR); - decks = new StorageImmediatelySerialized(model.getName() + " decks", storage); + decks = new StorageImmediatelySerialized<>(model.getName() + " decks", storage); } public IStorage getDecks() { @@ -121,7 +121,7 @@ public class ConquestController { aiPlayerName += " (AI)"; //ensure player names are distinct } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); humanPlayer = new LobbyPlayerHuman(humanPlayerName); humanPlayer.setAvatarCardImageKey(commander.getCard().getImageKey(false)); starter.add(humanStart.setPlayer(humanPlayer)); @@ -151,9 +151,9 @@ public class ConquestController { private List generatePlanarPool() { String planeName = model.getCurrentPlane().getName(); - List pool = new ArrayList(); - List otherPlanes = new ArrayList(); - List phenomenons = new ArrayList(); + List pool = new ArrayList<>(); + List otherPlanes = new ArrayList<>(); + List phenomenons = new ArrayList<>(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { CardType type = c.getRules().getType(); @@ -196,7 +196,7 @@ public class ConquestController { public List awardBooster(ConquestAwardPool pool) { ConquestPreferences prefs = FModel.getConquestPreferences(); - List rewards = new ArrayList(); + List rewards = new ArrayList<>(); int boostersPerMythic = prefs.getPrefInt(CQPref.BOOSTERS_PER_MYTHIC); int raresPerBooster = prefs.getPrefInt(CQPref.BOOSTER_RARES); for (int i = 0; i < raresPerBooster; i++) { @@ -220,7 +220,7 @@ public class ConquestController { //also build list of all rewards including replacement shards for each duplicate card //build this list in reverse order so commons appear first int shards = 0; - final List allRewards = new ArrayList(); + final List allRewards = new ArrayList<>(); for (int i = rewards.size() - 1; i >= 0; i--) { int replacementShards = 0; PaperCard card = rewards.get(i); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java index 3ce5ee53c50..b3a31a54160 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java @@ -51,11 +51,11 @@ public final class ConquestData { private int planeswalkEmblems; private final ConquestRecord chaosBattleRecord; - private final Map planeDataMap = new HashMap(); - private final HashSet unlockedCards = new HashSet(); - private final List commanders = new ArrayList(); - private final HashSet newCards = new HashSet(); - private final HashSet exiledCards = new HashSet(); + private final Map planeDataMap = new HashMap<>(); + private final HashSet unlockedCards = new HashSet<>(); + private final List commanders = new ArrayList<>(); + private final HashSet newCards = new HashSet<>(); + private final HashSet exiledCards = new HashSet<>(); public ConquestData(String name0, ConquestPlane startingPlane0, PaperCard startingPlaneswalker0, PaperCard startingCommander0) { name = name0; @@ -153,7 +153,7 @@ public final class ConquestData { } public Iterable getSortedPlaneswalkers() { - List planeswalkers = new ArrayList(); + List planeswalkers = new ArrayList<>(); for (PaperCard card : unlockedCards) { if (card.getRules().getType().isPlaneswalker() && !isInExile(card)) { planeswalkers.add(card); @@ -285,7 +285,7 @@ public final class ConquestData { return false; } if (commandersBeingExiled == null) { - commandersBeingExiled = new ArrayList(); + commandersBeingExiled = new ArrayList<>(); } commandersBeingExiled.add(commander); //cache commander to make it easier to remove later } @@ -537,7 +537,7 @@ public final class ConquestData { }; public static Map getColOverrides(ItemManagerConfig config) { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, fnNewCompare, fnNewGet); return colOverrides; } @@ -548,8 +548,8 @@ public final class ConquestData { } private class PathFinder { - private final HashSet closedSet = new HashSet(); - private final HashSet openSet = new HashSet(); + private final HashSet closedSet = new HashSet<>(); + private final HashSet openSet = new HashSet<>(); private final Node[][] map; private PathFinder() { @@ -585,7 +585,7 @@ public final class ConquestData { //if we've reach goal, reconstruct path and return it if (current == goal) { - List path = new ArrayList(); + List path = new ArrayList<>(); while (current != null) { path.add(current.loc); current = current.came_from; diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java b/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java index c85a7cd9edd..a73053cf441 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java @@ -78,7 +78,7 @@ public class ConquestLocation implements IXmlWritable { public static List getNeighbors(ConquestPlane plane0, int regionIndex0, int row0, int col0) { int regionCount = plane0.getRegions().size(); - List locations = new ArrayList(); + List locations = new ArrayList<>(); //add location above if (row0 < plane0.getRowsPerRegion() - 1) { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java index 0e67a770e08..4415fec32fc 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java @@ -136,7 +136,7 @@ public class ConquestPlane { public FCollectionView getPlaneCards() { if (planeCards == null) { - planeCards = new FCollection(); + planeCards = new FCollection<>(); CardDb variantCards = FModel.getMagicDb().getVariantCards(); List planeCardNames = FileUtil.readFile(directory + "plane_cards.txt"); @@ -160,7 +160,7 @@ public class ConquestPlane { if (regions != null) { return; } //load regions - regions = new FCollection(new ConquestRegion.Reader(this)); + regions = new FCollection<>(new ConquestRegion.Reader(this)); //load events int eventIndex = 0; @@ -168,7 +168,7 @@ public class ConquestPlane { int regionEndIndex = eventsPerRegion; events = new ConquestEvent[regions.size() * eventsPerRegion]; for (ConquestRegion region : regions) { - FCollection regionEvents = new FCollection(new ConquestEvent.Reader(region)); + FCollection regionEvents = new FCollection<>(new ConquestEvent.Reader(region)); for (ConquestEvent event : regionEvents) { events[eventIndex++] = event; if (eventIndex == regionEndIndex) { @@ -184,11 +184,11 @@ public class ConquestPlane { //load card pool cardPool = new DeckGenPool(); - commanders = new FCollection(); + commanders = new FCollection<>(); CardDb commonCards = FModel.getMagicDb().getCommonCards(); List bannedCards = FileUtil.readFile(directory + "banned_cards.txt"); - Set bannedCardSet = bannedCards.isEmpty() ? null : new HashSet(bannedCards); + Set bannedCardSet = bannedCards.isEmpty() ? null : new HashSet<>(bannedCards); List setCodes = FileUtil.readFile(directory + "sets.txt"); for (String setCode : setCodes) { @@ -292,7 +292,7 @@ public class ConquestPlane { } public static Set getAllPlanesOfCard(PaperCard card) { - Set planes = new HashSet(); + Set planes = new HashSet<>(); for (ConquestPlane plane : FModel.getPlanes()) { if (plane.cardPool.contains(card)) { planes.add(plane); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java index ed1904e2136..d4278084fb8 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java @@ -73,7 +73,7 @@ public class ConquestRegion { } public FCollectionView getCommanders() { - FCollection commanders = new FCollection(); + FCollection commanders = new FCollection<>(); for (PaperCard commander : plane.getCommanders()) { if (cardPool.contains(commander)) { commanders.add(commander); @@ -172,7 +172,7 @@ public class ConquestRegion { } public static Set getAllRegionsOfCard(PaperCard card) { - Set regions = new HashSet(); + Set regions = new HashSet<>(); for (ConquestPlane plane : FModel.getPlanes()) { if (plane.getCardPool().contains(card)) { for (ConquestRegion region : plane.getRegions()) { @@ -186,7 +186,7 @@ public class ConquestRegion { } public static List getAllRegions() { - List regions = new ArrayList(); + List regions = new ArrayList<>(); for (ConquestPlane plane : FModel.getPlanes()) { for (ConquestRegion region : plane.getRegions()) { regions.add(region); diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index c283bf771e5..22d379ddf5b 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -73,7 +73,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(final CostChooseCreatureType cost) { - final String choice = controller.chooseSomeType("Creature", ability, new ArrayList(CardType.Constant.CREATURE_TYPES), new ArrayList(), true); + final String choice = controller.chooseSomeType("Creature", ability, new ArrayList<>(CardType.Constant.CREATURE_TYPES), new ArrayList<>(), true); if (null == choice) { return null; } @@ -282,7 +282,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (!cost.sameZone) { return exileFromMiscZone(cost, ability, c, list); } final FCollectionView players = game.getPlayers(); - final List payableZone = new ArrayList(); + final List payableZone = new ArrayList<>(); for (final Player p : players) { final CardCollection enoughType = CardLists.filter(list, CardPredicates.isOwner(p)); if (enoughType.size() < c) { @@ -332,8 +332,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { Integer c = cost.convertAmount(); final String type = cost.getType(); - final List saList = new ArrayList(); - final List descList = new ArrayList(); + final List saList = new ArrayList<>(); + final List descList = new ArrayList<>(); for (final SpellAbilityStackInstance si : game.getStack()) { final Card stC = si.getSourceCard(); @@ -366,7 +366,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { return null; } - final List exiled = new ArrayList(); + final List exiled = new ArrayList<>(); for (int i = 0; i < c; i++) { //Have to use the stack descriptions here because some copied spells have no description otherwise final String o = controller.getGui().oneOrNone("Exile from Stack", descList); @@ -545,7 +545,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } } - final List oppsThatCanGainLife = new ArrayList(); + final List oppsThatCanGainLife = new ArrayList<>(); for (final Player opp : cost.getPotentialTargets(player, source)) { if (opp.canGainLife()) { oppsThatCanGainLife.add(opp); @@ -677,7 +677,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (cost.sameZone){ final FCollectionView players = player.getGame().getPlayers(); - final List payableZone = new ArrayList(); + final List payableZone = new ArrayList<>(); for (final Player p : players) { final CardCollectionView enoughType = CardLists.filter(list, CardPredicates.isOwner(p)); if (enoughType.size() < c) { @@ -898,7 +898,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { inp.showAndWait(); final Card selected = inp.getFirstSelected(); final Map tgtCounters = selected.getCounters(); - final List typeChoices = new ArrayList(); + final List typeChoices = new ArrayList<>(); for (final CounterType key : tgtCounters.keySet()) { if (tgtCounters.get(key) > 0) { typeChoices.add(key); @@ -922,7 +922,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { super(controller, cntCounters, cntCounters, sa); this.validChoices = validCards; counterType = cType; - cardsChosen = cntCounters > 0 ? new HashMap() : null; + cardsChosen = cntCounters > 0 ? new HashMap<>() : null; } @Override diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index fec7ac0844a..40d69e11f79 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -274,7 +274,7 @@ public class HumanPlay { } final List parts = CostAdjustment.adjust(cost, sourceAbility).getCostParts(); - final List remainingParts = new ArrayList(parts); + final List remainingParts = new ArrayList<>(parts); CostPart costPart = null; if (!parts.isEmpty()) { costPart = parts.get(0); @@ -319,7 +319,7 @@ public class HumanPlay { } else if (part instanceof CostDraw) { final int amount = getAmountFromPart(part, source, sourceAbility); - List res = new ArrayList(); + List res = new ArrayList<>(); String type = part.getType(); for (Player player : p.getGame().getPlayers()) { if (player.isValid(type, p, source, sourceAbility) && player.canDraw()) { @@ -455,7 +455,7 @@ public class HumanPlay { } Card selected = inp.getFirstSelected(); final Map tgtCounters = selected.getCounters(); - final List typeChoices = new ArrayList(); + final List typeChoices = new ArrayList<>(); for (CounterType key : tgtCounters.keySet()) { if (tgtCounters.get(key) > 0) { typeChoices.add(key); @@ -528,7 +528,7 @@ public class HumanPlay { if (sameZone) { // Jotun Grunt FCollectionView players = p.getGame().getPlayers(); - List payableZone = new ArrayList(); + List payableZone = new ArrayList<>(); for (Player player : players) { CardCollectionView enoughType = CardLists.filter(list, CardPredicates.isOwner(player)); if (enoughType.size() < amount) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index b3afc07f7df..4631c33e04a 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -136,7 +136,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return mayLookAtAllCards; } - private final ArrayList tempShownCards = new ArrayList(); + private final ArrayList tempShownCards = new ArrayList<>(); public void tempShow(final Iterable objects) { for (final T t : objects) { @@ -446,7 +446,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShow(delayedReveal.getCards()); } if (useSelectCardsInput(optionList)) { - final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, isOptional ? 0 : 1, 1, + final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, isOptional ? 0 : 1, 1, optionList, sa); input.setCancelAllowed(isOptional); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); @@ -485,7 +485,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShow(optionList); if (useSelectCardsInput(optionList)) { - final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, min, max, + final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, min, max, optionList, sa); input.setCancelAllowed(true); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); @@ -661,8 +661,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final String prompt = String.format( "%s, you %s\n\nWho would you like to start this game? (Click on the portrait.)", player.getName(), isFirstGame ? " have won the coin toss." : " lost the last game."); - final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, 1, 1, - new FCollection(game.getPlayersInTurnOrder())); + final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, 1, 1, + new FCollection<>(game.getPlayersInTurnOrder())); input.setMessage(prompt); input.showAndWait(); return input.getFirstSelected(); @@ -684,9 +684,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont mapCVtoC.put(card.getView(), card); } List chosen; - List choices = new ArrayList(mapCVtoC.keySet()); + List choices = new ArrayList<>(mapCVtoC.keySet()); chosen = getGui().order("Exert Attackers?", "Exerted", 0, choices.size(), choices, null, null, false); - List chosenCards = new ArrayList(); + List chosenCards = new ArrayList<>(); for (CardView cardView : chosen) { chosenCards.add(mapCVtoC.get(cardView)); } @@ -2858,7 +2858,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (Card card : cards) { mapCVtoC.put(card.getView(), card); } - List choices = new ArrayList(mapCVtoC.keySet()); + List choices = new ArrayList<>(mapCVtoC.keySet()); List chosen; chosen = getGui().many( "Choose cards to Splice onto", @@ -2868,7 +2868,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont choices, sa.getHostCard().getView() ); - List chosenCards = new ArrayList(); + List chosenCards = new ArrayList<>(); for (CardView cardView : chosen) { chosenCards.add(mapCVtoC.get(cardView)); } diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index 70fd7b72cfc..deced7b9fb8 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -194,7 +194,7 @@ public class TargetSelection { else if (zz.is(ZoneType.Stack)) crdsStack.add(cardView); else if (zz.is(ZoneType.Ante)) crdsAnte.add(cardView); } - List choicesFiltered = new ArrayList(); + List choicesFiltered = new ArrayList<>(); if (!crdsBattle.isEmpty()) { choicesFiltered.add("--CARDS ON BATTLEFIELD:--"); choicesFiltered.addAll(crdsBattle); @@ -251,7 +251,7 @@ public class TargetSelection { final TargetRestrictions tgt = this.getTgt(); final String message = tgt.getVTSelection(); // Find what's targetable, then allow human to choose - final List selectOptions = new ArrayList(); + final List selectOptions = new ArrayList<>(); HashMap stackItemViewCache = new HashMap<>(); final Game game = ability.getActivatingPlayer().getGame(); diff --git a/forge-gui/src/main/java/forge/properties/PreferencesStore.java b/forge-gui/src/main/java/forge/properties/PreferencesStore.java index 9fd0a15d116..39da97b9e99 100644 --- a/forge-gui/src/main/java/forge/properties/PreferencesStore.java +++ b/forge-gui/src/main/java/forge/properties/PreferencesStore.java @@ -36,7 +36,7 @@ public abstract class PreferencesStore> { private final String filename; public PreferencesStore(final String filename0, final Class clasz) { - preferenceValues = new EnumMap(clasz); + preferenceValues = new EnumMap<>(clasz); filename = filename0; final List lines = FileUtil.readFile(filename); diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 3828cdc77d4..86fc937f89a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -161,7 +161,7 @@ public class QuestController { public IStorage getDraftDecks() { if (draftDecks == null) { - draftDecks = new QuestDeckGroupMap(new HashMap()); + draftDecks = new QuestDeckGroupMap(new HashMap<>()); } final QuestAchievements achievements = this.getAchievements(); if (achievements != null && (achievements.getCurrentDraftIndex() == -1 || achievements.getCurrentDraft() == null)) { @@ -208,9 +208,9 @@ public class QuestController { public static IStorage getPrecons() { if (null == preconManager) { // read with a special class, that will fill sell rules as it processes each PreconDeck - preconManager = new StorageBase("Quest shop decks", new PreconDeck.Reader(new File(ForgeConstants.QUEST_PRECON_DIR)){ + preconManager = new StorageBase<>("Quest shop decks", new PreconDeck.Reader(new File(ForgeConstants.QUEST_PRECON_DIR)) { @Override - protected PreconDeck getPreconDeckFromSections(java.util.Map> sections) { + protected PreconDeck getPreconDeckFromSections(java.util.Map> sections) { PreconDeck result = super.getPreconDeckFromSections(sections); preconDeals.put(result.getName(), new SellRules(sections.get("shop"))); return result; @@ -219,7 +219,7 @@ public class QuestController { } return QuestController.preconManager; } - private final static Map preconDeals = new TreeMap(); + private final static Map preconDeals = new TreeMap<>(); public static SellRules getPreconDeals(PreconDeck deck) { return preconDeals.get(deck.getName()); } @@ -558,11 +558,11 @@ public class QuestController { public final void regenerateChallenges() { final QuestAchievements achievements = model.getAchievements(); - final List unlockedChallengeIds = new ArrayList(); + final List unlockedChallengeIds = new ArrayList<>(); final List availableChallengeIds = achievements.getCurrentChallenges(); // clean up challenges potentially coming over from a different quest world - List nonExistentIds = new ArrayList(); + List nonExistentIds = new ArrayList<>(); for (String cid : availableChallengeIds) { if (this.getChallenges().get(cid) == null) { System.out.println("Warning: removing a challenge that does not exist in the current quest world: " + cid); diff --git a/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java b/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java index c6a78556d2b..4ef703fc1b5 100644 --- a/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java +++ b/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java @@ -32,7 +32,7 @@ public class QuestDeckGroupMap extends StorageBase { * Instantiates a new quest deck map. */ public QuestDeckGroupMap(Map in) { - super("Quest draft decks", null, in == null ? new HashMap() : in); + super("Quest draft decks", null, in == null ? new HashMap<>() : in); } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java b/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java index 2f1b1fbd1cc..9009b97c441 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java @@ -61,10 +61,10 @@ public class QuestEventChallenge extends QuestEvent { // Other cards used in assignment: starting, and reward. /** The human extra cards. */ - private List humanExtraCards = new ArrayList(); + private List humanExtraCards = new ArrayList<>(); /** The ai extra cards. */ - private List aiExtraCards = new ArrayList(); + private List aiExtraCards = new ArrayList<>(); /** If persistent, the challenge does not disappear if the player fails it. */ private boolean persistent = false; diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java index e92c0be583b..138176ed248 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java @@ -218,10 +218,10 @@ public class QuestEventDuelManager implements QuestEventDuelManagerInterface { private void assembleDuelDifficultyLists() { sortedDuels.clear(); - sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList()); + sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList<>()); for (final QuestEventDuel qd : allDuels) { sortedDuels.add(qd.getDifficulty(), qd); diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java index eadd2ed28d4..424701015de 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java @@ -54,10 +54,10 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface private void assembleDuelDifficultyLists() { sortedDuels.clear(); - sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList()); + sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList<>()); int i=0; for(Archetype archetype : archetypes){ @@ -223,7 +223,7 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface @Override public Iterable getAllDuels() { - return new ArrayList(); + return new ArrayList<>(); } public Iterable getDuels(QuestEventDifficulty difficulty) { diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java index 91b008abbd4..26c2c6de0c7 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java @@ -59,7 +59,7 @@ public abstract class QuestRewardCard implements IQuestRewardCard { if (tmp.length > 1) { final String [] setcodes = tmp[1].split(","); if (setcodes.length > 0) { - final List sets = new ArrayList(); + final List sets = new ArrayList<>(); for (final String code : setcodes) { if (FModel.getMagicDb().getEditions().contains(code)) { // System.out.println("Set " + code + " was found!"); diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java index 8441b22ac9b..9850681e4e1 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java @@ -98,7 +98,7 @@ public class QuestRewardCardChooser extends QuestRewardCard { final ItemPool playerCards = FModel.getQuest().getAssets().getCardPool(); if (!playerCards.isEmpty()) { // Maybe a redundant check since it's hard to win a duel without any cards... - List cardChoices = new ArrayList(); + List cardChoices = new ArrayList<>(); for (final Map.Entry card : playerCards) { cardChoices.add(card.getKey()); } @@ -108,7 +108,7 @@ public class QuestRewardCardChooser extends QuestRewardCard { } } else if (type == poolType.predicateFilter) { - List cardChoices = new ArrayList(); + List cardChoices = new ArrayList<>(); for (final PaperCard card : Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), predicates)) { cardChoices.add(card); diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java index 4c6014e1cb0..4b6a0e66df9 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java @@ -60,7 +60,7 @@ public class QuestRewardCardDuplicate implements IQuestRewardCard { final ItemPool playerCards = FModel.getQuest().getAssets().getCardPool(); if (!playerCards.isEmpty()) { // Maybe a redundant check since it's hard to win a duel without any cards... - final List cardChoices = new ArrayList(); + final List cardChoices = new ArrayList<>(); for (final Map.Entry card : playerCards) { cardChoices.add(card.getKey()); } diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java index 3e05da19c27..ba565e9b774 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java @@ -60,7 +60,7 @@ public class QuestRewardCardFiltered extends QuestRewardCard { */ @Override public final List getChoices() { - List cardChoices = new ArrayList(); + List cardChoices = new ArrayList<>(); for (final PaperCard card : Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), predicates)) { cardChoices.add(card); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java index 598afcbb667..ffbad1ca8f3 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java @@ -67,7 +67,7 @@ public class QuestUtilUnlockSets { final ReadPriceList prices = new ReadPriceList(); final Map mapPrices = prices.getPriceList(); - final List> setPrices = new ArrayList>(); + final List> setPrices = new ArrayList<>(); Double multiplier = 1d; int j = 0; @@ -90,7 +90,7 @@ public class QuestUtilUnlockSets { } final String setPrompt = "You have " + qData.getAssets().getCredits() + " credits. Unlock:"; - List options = new ArrayList(); + List options = new ArrayList<>(); for (ImmutablePair ee : setPrices) { options.add(TextUtil.concatNoSpace(ee.left.getName()," [PRICE: ", String.valueOf(ee.right), " credits]")); } @@ -142,7 +142,7 @@ public class QuestUtilUnlockSets { if (qData.getUnlocksTokens() < 1) { // Should never happen if we made it this far but better safe than sorry... throw new RuntimeException("BUG? Could not find unlockable sets even though we should."); } - List options = new ArrayList(); + List options = new ArrayList<>(); // Sort current sets by date List allowedSets = Lists.newArrayList(Iterables.transform(qData.getFormat().getAllowedSetCodes(), FModel.getMagicDb().getEditions().FN_EDITION_BY_CODE)); @@ -153,7 +153,7 @@ public class QuestUtilUnlockSets { Collections.sort(excludedSets); // get a number of sets between an excluded and any included set - List> excludedWithDistances = new ArrayList>(); + List> excludedWithDistances = new ArrayList<>(); for (CardEdition ex : excludedSets) { if (!unlockableSetTypes.contains(ex.getType())) // don't add non-traditional sets continue; @@ -205,7 +205,7 @@ public class QuestUtilUnlockSets { qData.getFormat().unlockSet(additionalSet); } - List cardsWon = new ArrayList(); + List cardsWon = new ArrayList<>(); if (starters.contains(unlockedSet.getCode())) { UnOpenedProduct starter = new UnOpenedProduct(starters.get(unlockedSet.getCode())); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index cc44ae603c7..b5a27b5b04c 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -145,8 +145,8 @@ public class QuestWorld implements Comparable{ String useDir = null; GameFormatQuest useFormat = null; - final List sets = new ArrayList(); - final List bannedCards = new ArrayList(); // if both empty, no format + final List sets = new ArrayList<>(); + final List bannedCards = new ArrayList<>(); // if both empty, no format String key, value; String[] pieces = line.split("\\|"); @@ -234,7 +234,7 @@ public class QuestWorld implements Comparable{ } public static Set getAllQuestWorldsOfCard(PaperCard card) { - Set result = new HashSet(); + Set result = new HashSet<>(); for (QuestWorld qw : FModel.getWorlds()) { GameFormat format = qw.getFormat(); if (format == null) { @@ -248,7 +248,7 @@ public class QuestWorld implements Comparable{ } public static Set getAllQuestWorldsOfDeck(Deck deck) { - Set result = new HashSet(); + Set result = new HashSet<>(); for (QuestWorld qw : FModel.getWorlds()) { GameFormat format = qw.getFormat(); if (format == null) { diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java index de2905fb8ed..6e3db328e7a 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java @@ -122,10 +122,10 @@ public class QuestBazaarManager { } /** Constant stalls. */ - private final Map stalls = new TreeMap(); + private final Map stalls = new TreeMap<>(); /** Constant items. */ - private final Map> itemsOnStalls = new TreeMap>(String.CASE_INSENSITIVE_ORDER); - private final Map items = new TreeMap(); + private final Map> itemsOnStalls = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + private final Map items = new TreeMap<>(); /** *

@@ -149,7 +149,7 @@ public class QuestBazaarManager { * and maps to appropriate merchant. */ public void buildItems(final QuestController qCtrl) { - final Map itemSet = new HashMap(); + final Map itemSet = new HashMap<>(); for (int iSlot = 0; iSlot < QuestController.MAX_PET_SLOTS; iSlot++) { @@ -164,7 +164,7 @@ public class QuestBazaarManager { itemsOnStalls.clear(); for (final QuestStallDefinition thisStall : stalls.values()) { - final SortedSet set = new TreeSet(); + final SortedSet set = new TreeSet<>(); for (final String itemName : thisStall.getItems()) { final IQuestBazaarItem item = itemSet.get(itemName); @@ -184,7 +184,7 @@ public class QuestBazaarManager { public List getItems(final QuestController qCtrl, final String stallName) { buildItems(qCtrl); - final List ret = new ArrayList(); + final List ret = new ArrayList<>(); final QuestAssets qA = FModel.getQuest().getAssets(); for (final IQuestBazaarItem purchasable : itemsOnStalls.get(stallName)) { diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java index 455b4b114aa..0b84a69e5b0 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java @@ -49,7 +49,7 @@ public class QuestPetController implements IQuestBazaarItem { @XStreamAsAttribute() private final int maxLevel; - private final List levels = new ArrayList(); + private final List levels = new ArrayList<>(); @XStreamAsAttribute() private final String name; diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java index 5c49b541f26..8c30919f90e 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java @@ -29,9 +29,9 @@ import java.util.Map; */ public class QuestPetStorage { - private Map> petsBySlot = new HashMap>(); + private Map> petsBySlot = new HashMap<>(); - private Map petsByName = new HashMap(); + private Map petsByName = new HashMap<>(); /** * TODO: Write javadoc for Constructor. @@ -95,7 +95,7 @@ public class QuestPetStorage { * */ List list = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null == list) { - list = new ArrayList(); + list = new ArrayList<>(); this.petsBySlot.put(Integer.valueOf(iSlot), list); } this.petsByName.put(petCtrl.getName(), petCtrl); @@ -120,7 +120,7 @@ public class QuestPetStorage { * @return List */ public List getAvaliablePets(final int iSlot, final QuestAssets qA) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); final List allPossible = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null != allPossible) { for (final QuestPetController c : allPossible) { @@ -139,7 +139,7 @@ public class QuestPetStorage { * @return List */ public List getAllPets(final int iSlot) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); final List allPossible = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null != allPossible) { for (final QuestPetController c : allPossible) { diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java index 64420a85b9f..af107ee7355 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java @@ -69,7 +69,7 @@ public class QuestStallDefinition { name = null; displayName = null; description = null; - items = new ArrayList(); + items = new ArrayList<>(); icon = null; } diff --git a/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java b/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java index 6b6876dff77..b7da238eb3e 100644 --- a/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java +++ b/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java @@ -75,7 +75,7 @@ public final class GameFormatQuest extends GameFormat { */ public List getLockedSets() { - List exSets = new ArrayList(); + List exSets = new ArrayList<>(); if (this.allowedSetCodes.isEmpty()) { return exSets; } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java index 6140c1d5b64..98e03b13394 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -41,7 +41,7 @@ public class QuestAssets { // Cards associated with quest /** The card pool. */ - private final ItemPool cardPool = new ItemPool(PaperCard.class); // player's + private final ItemPool cardPool = new ItemPool<>(PaperCard.class); // player's /** The credits. */ private long credits; // this money is good for all modes // game @@ -49,25 +49,25 @@ public class QuestAssets { // Decks collected by player /** The my decks. */ - private final HashMap myDecks = new HashMap(); + private final HashMap myDecks = new HashMap<>(); // current // shop // list /** The new card list. */ - private final ItemPool newCardList = new ItemPool(InventoryItem.class); // cards + private final ItemPool newCardList = new ItemPool<>(InventoryItem.class); // cards // belonging /** The shop list. */ - private final ItemPool shopList = new ItemPool(InventoryItem.class); // the + private final ItemPool shopList = new ItemPool<>(InventoryItem.class); // the // gadgets /** The inventory items. */ - private final Map inventoryItems = new EnumMap( + private final Map inventoryItems = new EnumMap<>( QuestItemType.class); // Much the same like other map, but keyed by string (to support a lot of custom pets) - private final Map combatPets = new HashMap(); + private final Map combatPets = new HashMap<>(); - private final HashMap draftDecks = new HashMap(); + private final HashMap draftDecks = new HashMap<>(); /** * Checks for item. * diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index 41574634113..1d41cc4b013 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -66,7 +66,7 @@ public final class QuestData { private final Map petSlots = new HashMap<>(); private int matchLength = 3; - public HashSet Ratings = new HashSet(); + public HashSet Ratings = new HashSet<>(); public String currentDeck = "DEFAULT"; diff --git a/forge-gui/src/main/java/forge/sound/SoundSystem.java b/forge-gui/src/main/java/forge/sound/SoundSystem.java index a7e23a1d176..8e69ef87e0b 100644 --- a/forge-gui/src/main/java/forge/sound/SoundSystem.java +++ b/forge-gui/src/main/java/forge/sound/SoundSystem.java @@ -23,8 +23,8 @@ public class SoundSystem { public static final int DELAY = 30; private static final IAudioClip emptySound = new NoSoundClip(); - private static final Map loadedClips = new EnumMap(SoundEffectType.class); - private static final Map loadedScriptClips = new HashMap(); + private static final Map loadedClips = new EnumMap<>(SoundEffectType.class); + private static final Map loadedScriptClips = new HashMap<>(); private final EventVisualizer visualizer; diff --git a/forge-gui/src/main/java/forge/tournament/TournamentData.java b/forge-gui/src/main/java/forge/tournament/TournamentData.java index c045179161f..7064ce4b024 100644 --- a/forge-gui/src/main/java/forge/tournament/TournamentData.java +++ b/forge-gui/src/main/java/forge/tournament/TournamentData.java @@ -23,8 +23,8 @@ public class TournamentData { private int completed; private String timestamp; - private List eventRecords = new ArrayList(); - private List eventNames = new ArrayList(); + private List eventRecords = new ArrayList<>(); + private List eventNames = new ArrayList<>(); private Deck userDeck; private List decks; @@ -94,7 +94,7 @@ public class TournamentData { } public List getDeckNames() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : decks) { names.add(d.getName()); } return names; } diff --git a/forge-gui/src/main/java/forge/tournament/TournamentUtil.java b/forge-gui/src/main/java/forge/tournament/TournamentUtil.java index 5176fb8856b..ebf1c426e60 100644 --- a/forge-gui/src/main/java/forge/tournament/TournamentUtil.java +++ b/forge-gui/src/main/java/forge/tournament/TournamentUtil.java @@ -20,8 +20,8 @@ public class TournamentUtil { // Generate tournament decks Deck deck; - final List eventNames = new ArrayList(); - final List decks = new ArrayList(); + final List eventNames = new ArrayList<>(); + final List decks = new ArrayList<>(); for (int i = 0; i < numOpponents; i++) { int randType = (int)Math.floor(MyRandom.getRandom().nextDouble() * allowedDeckTypes.size()); @@ -81,7 +81,7 @@ public class TournamentUtil { public static void setDefaultTournamentName(TournamentData tournament, String prefix) { final File[] arrFiles = TournamentIO.getTournamentFilesUnlocked(prefix); - final Set setNames = new HashSet(); + final Set setNames = new HashSet<>(); for (File f : arrFiles) { setNames.add(f.getName()); } diff --git a/forge-gui/src/main/java/forge/util/IgnoringXStream.java b/forge-gui/src/main/java/forge/util/IgnoringXStream.java index bb4c0a12ce6..e8b5e997818 100644 --- a/forge-gui/src/main/java/forge/util/IgnoringXStream.java +++ b/forge-gui/src/main/java/forge/util/IgnoringXStream.java @@ -16,7 +16,7 @@ import java.util.List; * (but are there any fields?) */ public class IgnoringXStream extends XStream { - private final List ignoredFields = new ArrayList(); + private final List ignoredFields = new ArrayList<>(); @Override protected MapperWrapper wrapMapper(final MapperWrapper next) { diff --git a/forge-gui/src/main/java/forge/util/LineReader.java b/forge-gui/src/main/java/forge/util/LineReader.java index b89057a0214..7657bd949b3 100644 --- a/forge-gui/src/main/java/forge/util/LineReader.java +++ b/forge-gui/src/main/java/forge/util/LineReader.java @@ -118,7 +118,7 @@ public class LineReader implements Iterable, Closeable { * @return The lines read from the stream. */ public Collection readLines() { - final Collection lines = new ArrayList(); + final Collection lines = new ArrayList<>(); for (final String line : this) { lines.add(line); } diff --git a/forge-gui/src/main/java/forge/util/XmlReader.java b/forge-gui/src/main/java/forge/util/XmlReader.java index 9b2c3eeabae..5af330e66a4 100644 --- a/forge-gui/src/main/java/forge/util/XmlReader.java +++ b/forge-gui/src/main/java/forge/util/XmlReader.java @@ -69,19 +69,19 @@ public class XmlReader { return parseChildElements(key, null, collectionType, paperCardBuilder); } public T read(String key, Class type) { - return parseChildElements(key, new GenericBuilder(type)); + return parseChildElements(key, new GenericBuilder<>(type)); } public > void read(String key, T collectionToLoad, Class elementType) { - parseChildElements(key, collectionToLoad, null, new GenericBuilder(elementType)); + parseChildElements(key, collectionToLoad, null, new GenericBuilder<>(elementType)); } public > T read(String key, Class collectionType, Class elementType) { - return parseChildElements(key, null, collectionType, new GenericBuilder(elementType)); + return parseChildElements(key, null, collectionType, new GenericBuilder<>(elementType)); } public void read(final String key, final V[] array, final Class elementType) { parseChildElements(key, new Evaluator() { @Override public Void evaluate() { - final GenericBuilder builder = new GenericBuilder(elementType); + final GenericBuilder builder = new GenericBuilder<>(elementType); return parseChildElements(null, new Evaluator() { @Override public Void evaluate() { @@ -107,7 +107,7 @@ public class XmlReader { parseChildElements(key, new Evaluator() { @Override public Void evaluate() { - final GenericBuilder builder = new GenericBuilder(valueType); + final GenericBuilder builder = new GenericBuilder<>(valueType); return parseChildElements(null, new Evaluator() { @Override public Void evaluate() { @@ -131,7 +131,7 @@ public class XmlReader { parseChildElements(key, new Evaluator() { @Override public Void evaluate() { - final GenericBuilder builder = new GenericBuilder(valueType); + final GenericBuilder builder = new GenericBuilder<>(valueType); return parseChildElements(null, new Evaluator() { @Override public Void evaluate() { diff --git a/forge-gui/src/main/java/forge/util/XmlWriter.java b/forge-gui/src/main/java/forge/util/XmlWriter.java index 09b406f50c2..3c6cddcaaf6 100644 --- a/forge-gui/src/main/java/forge/util/XmlWriter.java +++ b/forge-gui/src/main/java/forge/util/XmlWriter.java @@ -17,7 +17,7 @@ import forge.item.PaperCard; public class XmlWriter { private final Document document; private final String filename; - private final Stack parentElements = new Stack(); + private final Stack parentElements = new Stack<>(); private Element currentElement; diff --git a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java index 0575d80adb6..4b8fcb3d860 100644 --- a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java +++ b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java @@ -105,7 +105,7 @@ public class SGuiChoose { return getInteger(message, min, max); } - final List choices = new ArrayList(); + final List choices = new ArrayList<>(); for (int i = min; i <= cutoff; i++) { choices.add(Integer.valueOf(i)); } From f06304ac1c1b0cb42c552c96069f8546966d41b3 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 6 Sep 2019 09:52:39 +0800 Subject: [PATCH 42/68] Update Forgescribed cards --- forge-gui/res/cardsfolder/r/reprobation.txt | 2 +- forge-gui/res/cardsfolder/t/the_hippodrome.txt | 2 +- forge-gui/res/cardsfolder/t/titanias_song.txt | 2 +- forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt | 8 ++++++++ .../res/cardsfolder/upcoming/belle_of_the_brawl.txt | 9 +++++++++ .../res/cardsfolder/upcoming/faerie_formation.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/frogify.txt | 7 +++++++ .../res/cardsfolder/upcoming/inspiring_veteran.txt | 8 ++++++++ .../res/cardsfolder/upcoming/keeper_of_fables.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/shambling_suit.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/shinechaser.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/taste_of_death.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/witchs_oven.txt | 9 +++++++++ 15 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/belle_of_the_brawl.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/faerie_formation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/frogify.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/inspiring_veteran.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/keeper_of_fables.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/shambling_suit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/shinechaser.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/taste_of_death.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/witchs_oven.txt diff --git a/forge-gui/res/cardsfolder/r/reprobation.txt b/forge-gui/res/cardsfolder/r/reprobation.txt index 70bee1efe39..31e57175382 100644 --- a/forge-gui/res/cardsfolder/r/reprobation.txt +++ b/forge-gui/res/cardsfolder/r/reprobation.txt @@ -3,5 +3,5 @@ ManaCost:1 W Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Curse -S:Mode$ Continuous | Affected$ Card.EnchantedBy | SetPower$ 0 | SetToughness$ 1 | RemoveAllAbilities$ True | AddType$ Coward | Description$ Enchanted creature loses all abilities and is a Coward creature with base power and toughness 0/1. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | SetPower$ 0 | SetToughness$ 1 | RemoveAllAbilities$ True | AddType$ Creature & Coward | RemoveCardTypes$ True | Description$ Enchanted creature loses all abilities and is a Coward creature with base power and toughness 0/1. Oracle:Enchant creature\nEnchanted creature loses all abilities and is a Coward creature with base power and toughness 0/1. (It keeps all supertypes but loses all other types and creature types.) diff --git a/forge-gui/res/cardsfolder/t/the_hippodrome.txt b/forge-gui/res/cardsfolder/t/the_hippodrome.txt index b90de6b14ce..206af01743d 100644 --- a/forge-gui/res/cardsfolder/t/the_hippodrome.txt +++ b/forge-gui/res/cardsfolder/t/the_hippodrome.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Plane Segovia S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddPower$ -5 | Description$ All Creatures get -5/-0. T:Mode$ PlanarDice | Result$ Chaos | OptionalDecider$ You | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, you may destroy target creature if it's power is 0 or less. -SVar:RolledChaos:DB$ Destroy | ValidTgts$ Creature | ConditionCheckSVar$ TgtPow | ConditionCompareSVar$ EQ1 | AITgts$ Creature.OpponentCtrl+powerLE0 +SVar:RolledChaos:DB$ Destroy | ValidTgts$ Creature | ConditionCheckSVar$ TgtPow | ConditionSVarCompare$ EQ1 | AITgts$ Creature.OpponentCtrl+powerLE0 SVar:TgtPow:Targeted$Valid Creature.powerLE0 SVar:Picture:http://www.wizards.com/global/images/magic/general/the_hippodrome.jpg SVar:AIRollPlanarDieParams:Mode$ Always diff --git a/forge-gui/res/cardsfolder/t/titanias_song.txt b/forge-gui/res/cardsfolder/t/titanias_song.txt index 73bdbd4da82..ed181a83062 100644 --- a/forge-gui/res/cardsfolder/t/titanias_song.txt +++ b/forge-gui/res/cardsfolder/t/titanias_song.txt @@ -1,7 +1,7 @@ Name:Titania's Song ManaCost:3 G Types:Enchantment -S:Mode$ Continuous | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | RemoveAllAbilities$ True | Description$ Each noncreature artifact loses all abilities and is an artifact creature with power and toughness each equal to its converted mana cost. +S:Mode$ Continuous | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Artifact & Creature | RemoveCardTypes$ True | RemoveAllAbilities$ True | Description$ Each noncreature artifact loses all abilities and is an artifact creature with power and toughness each equal to its converted mana cost. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigEffect | Static$ True | TriggerDescription$ If CARDNAME leaves the battlefield, this effect continues until end of turn. SVar:TrigEffect:DB$ Effect | Name$ Titania's Song Effect | StaticAbilities$ KWAnimateAll | SVars$ AffectedX | References$ AffectedX SVar:KWAnimateAll:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | RemoveAllAbilities$ True | Description$ Each noncreature artifact loses all abilities and is an artifact creature with power and toughness each equal to its converted mana cost. diff --git a/forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt b/forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt new file mode 100644 index 00000000000..bc1a12c4223 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt @@ -0,0 +1,8 @@ +Name:Arcanist's Owl +ManaCost:W/U W/U W/U W/U +Types:Artifact Creature Bird +PT:3/3 +K:Flying +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library. You may reveal an artifact or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Artifact,Enchantment | RestRandomOrder$ True | RestRandomOrder$ True +Oracle:Flying\nWhen Arcanist's Owl enters the battlefield, look at the top four cards of your library. You may reveal an artifact or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/belle_of_the_brawl.txt b/forge-gui/res/cardsfolder/upcoming/belle_of_the_brawl.txt new file mode 100644 index 00000000000..0f28dc9cafc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/belle_of_the_brawl.txt @@ -0,0 +1,9 @@ +Name:Belle of the Brawl +ManaCost:2 B +Types:Creature Human Knight +PT:3/2 +K:Menance +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, other Knights you control get +1/+0 until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Knight.YouCtrl+Other | NumAtt$ 1 +DeckHints:Type$Knight +Oracle:Menance\nWhenever Belle of the Brawl attacks, other Knights you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_formation.txt b/forge-gui/res/cardsfolder/upcoming/faerie_formation.txt new file mode 100644 index 00000000000..d5951dffad7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/faerie_formation.txt @@ -0,0 +1,8 @@ +Name:Faerie Formation +ManaCost:4 U +Types:Creature Faerie +PT:5/4 +K:Flying +A:AB$ Token | Cost$ 3 U | TokenAmount$ 1 | TokenScript$ u_1_1_faerie_flying | TokenOwner$ You | LegacyImage$ u 1 1 faerie flying eld | SubAbility$ DBDraw | SpellDescription$ Create a 1/1 blue Faerie creature token with flying. Draw a card. +SVar:DBDraw:DB$Draw | NumCards$ 1 +Oracle:Flying\n{3}{U}: Create a 1/1 blue Faerie creature token with flying. Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/frogify.txt b/forge-gui/res/cardsfolder/upcoming/frogify.txt new file mode 100644 index 00000000000..bc07c2bdbb5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/frogify.txt @@ -0,0 +1,7 @@ +Name:Frogify +ManaCost:1 U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | SetPower$ 1 | SetToughness$ 1 | SetColor$ Blue | RemoveAllAbilities$ True | AddType$ Creature & Frog | RemoveCardTypes$ True | RemoveCreatureTypes$ True | Description$ Enchanted creature loses all abilities and is a blue Frog creature with base power and toughness 1/1. +Oracle:Enchant creature\nEnchanted creature loses all abilities and is a blue Frog creature with base power and toughness 1/1. (It loses all other card types and creature types.) diff --git a/forge-gui/res/cardsfolder/upcoming/inspiring_veteran.txt b/forge-gui/res/cardsfolder/upcoming/inspiring_veteran.txt new file mode 100644 index 00000000000..3ab04271a23 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/inspiring_veteran.txt @@ -0,0 +1,8 @@ +Name:Inspiring Veteran +ManaCost:R W +Types:Creature Human Knight +PT:2/2 +S:Mode$ Continuous | Affected$ Knight.YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | Description$ Other Knights you control get +1/+1. +SVar:PlayMain1:TRUE +DeckHints:Type$Knight +Oracle:Other Knights you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/keeper_of_fables.txt b/forge-gui/res/cardsfolder/upcoming/keeper_of_fables.txt new file mode 100644 index 00000000000..514c6fba44e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/keeper_of_fables.txt @@ -0,0 +1,7 @@ +Name:Keeper of Fables +ManaCost:3 G G +Types:Creature Cat +PT:4/5 +T:Mode$ DamageDoneOnce | ValidSource$ Creature.nonHuman+YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever one or more non-Human creatures you control deal combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +Oracle:Whenever one or more non-Human creatures you control deal combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt b/forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt new file mode 100644 index 00000000000..e165dc5b962 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt @@ -0,0 +1,10 @@ +Name:Savvy Hunter +ManaCost:1 B G +Types:Creature Human Warrior +PT:3/3 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks or blocks, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +SVar:HasAttackEffect:TRUE +A:AB$ Draw | Cost$ Sac<2/Food> | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Whenever Savvy Hunter attacks or blocks, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\nSacrifice two Foods: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/shambling_suit.txt b/forge-gui/res/cardsfolder/upcoming/shambling_suit.txt new file mode 100644 index 00000000000..04c4dc70ae6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shambling_suit.txt @@ -0,0 +1,7 @@ +Name:Shambling Suit +ManaCost:3 +Types:Artifact Creature Construct +PT:*/3 +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | References$ X | Description$ CARDNAME's power is equal to the number of artifacts and/or enchantments you control. +SVar:X:Count$Valid Artifact.YouCtrl,Enchantment.YouCtrl +Oracle:Shambling Suit's power is equal to the number of artifacts and/or enchantments you control. diff --git a/forge-gui/res/cardsfolder/upcoming/shinechaser.txt b/forge-gui/res/cardsfolder/upcoming/shinechaser.txt new file mode 100644 index 00000000000..f8dc1c7309c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shinechaser.txt @@ -0,0 +1,10 @@ +Name:Shinechaser +ManaCost:1 W U +Types:Creature Faerie +PT:1/1 +K:Flying +K:Vigilance +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Artifact.YouCtrl | Description$ CARDNAME gets +1/+1 as long as you control an artifact. +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Enchantment.YouCtrl | Description$ CARDNAME gets +1/+1 as long as you control an enchantment. +SVar:BuffedBy:Enchantment,Artifact +Oracle:Flying, vigilance\nShinechaser gets +1/+1 as long as you control an artifact.\nShinechaser gets +1/+1 as long as you control an enchantment. diff --git a/forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt b/forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt new file mode 100644 index 00000000000..0247261b16f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt @@ -0,0 +1,7 @@ +Name:Steelclaw Lance +ManaCost:B R +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | Description$ Equipped creature gets +2/+2. +K:Equip:1:Creature.Knight+YouCtrl:Knight +K:Equip:3 +Oracle:Equipped creature gets +2/+2.\nEquip Knight {1} ({1}: Attach to target Knight creature you control. Equip only as a sorcery.)\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/taste_of_death.txt b/forge-gui/res/cardsfolder/upcoming/taste_of_death.txt new file mode 100644 index 00000000000..f3e9b865f9c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/taste_of_death.txt @@ -0,0 +1,7 @@ +Name:Taste of Death +ManaCost:4 B B +Types:Sorcery +A:SP$ Sacrifice | Cost$ 4 B B | Amount$ 3 | Defined$ Player | SacValid$ Creature | SpellDescription$ Each player sacrifices three creatures. You create three Food tokens. | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ 3 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +Oracle:Each player sacrifices three creatures. You create three Food tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_oven.txt b/forge-gui/res/cardsfolder/upcoming/witchs_oven.txt new file mode 100644 index 00000000000..43954e3ade5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/witchs_oven.txt @@ -0,0 +1,9 @@ +Name:Witch's Oven +ManaCost:1 +Types:Artifact +A:AB$ Token | Cost$ T Sac<1/Creature> | TokenAmount$ X | References$ X,Y | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food token. If the sacrificed creature's toughness was 4 or greater, create two Food tokens instead. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:AIPreference:SacCost$Creature.token +SVar:X:Count$Compare Y GE4.2.1 +SVar:Y:Sacrificed$CardToughness +AI:RemoveDeck:Random +Oracle:{T}, Sacrifice a creature: Create a Food token. If the sacrificed creature's toughness was 4 or greater, create two Food tokens instead. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") From d3d41d7c1fb729e67d8e65cf6308aa301f44a6bb Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 6 Sep 2019 12:34:53 +0800 Subject: [PATCH 43/68] Add Adamant cards --- .../src/main/java/forge/game/CardTraitBase.java | 13 +++++++++++++ .../res/cardsfolder/upcoming/embereth_paladin.txt | 7 +++++++ 2 files changed, 20 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 7897017b187..a56db98f6f9 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -1,5 +1,6 @@ package forge.game; +import forge.card.MagicColor; import forge.card.mana.ManaAtom; import forge.game.ability.AbilityUtils; import forge.game.card.Card; @@ -16,6 +17,8 @@ import forge.util.Expressions; import java.util.*; +import org.apache.commons.lang3.StringUtils; + import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; @@ -250,6 +253,16 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { if (params.containsKey("Blessing")) { if ("True".equalsIgnoreCase(params.get("Blessing")) != hostController.hasBlessing()) return false; } + + if (params.containsKey("Adamant")) { + if (hostCard.getCastSA() == null) { + return false; + } + final String payingMana = StringUtils.join(hostCard.getCastSA().getPayingMana()); + if (StringUtils.countMatches(payingMana, MagicColor.toShortString(params.get("Adamant"))) < 3) { + return false; + } + } if (params.containsKey("Presence")) { if (hostCard.getCastFrom() == null || hostCard.getCastSA() == null) diff --git a/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt new file mode 100644 index 00000000000..456f35744c0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt @@ -0,0 +1,7 @@ +Name:Embereth Paladin +ManaCost:3 R +Types:Creature Human Knight +PT:4/1 +K:Haste +K:etbCounter:P1P1:1:Adamant$ Red:Adamant — If at least three red mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +Oracle:Haste\nAdamant — If at least three red mana was spent to cast this spell, Embereth Paladin enters the battlefield with a +1/+1 counter on it. From e977420ffa6ee25b8471298444c2a6f3882ca412 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 6 Sep 2019 12:55:40 +0800 Subject: [PATCH 44/68] Finalization for Refactoring --- .../java/forge/ai/AiAttackController.java | 3 +- .../main/java/forge/ai/AiBlockController.java | 11 +--- .../src/main/java/forge/ai/ComputerUtil.java | 3 +- .../src/main/java/forge/ai/GameState.java | 10 +-- .../main/java/forge/ai/ability/AttachAi.java | 21 ++----- .../main/java/forge/ai/ability/TokenAi.java | 26 ++++---- .../ai/simulation/SpellAbilityPicker.java | 14 ++--- .../main/java/forge/card/mana/ManaCost.java | 4 +- .../src/main/java/forge/deck/DeckGroup.java | 4 +- .../src/main/java/forge/util/TextUtil.java | 2 +- .../java/forge/util/collect/FCollection.java | 18 +----- .../java/forge/game/GameLogFormatter.java | 10 +-- .../java/forge/game/ability/AbilityUtils.java | 12 +--- .../game/ability/SpellAbilityEffect.java | 4 +- .../ability/effects/ChangeZoneEffect.java | 4 +- .../game/ability/effects/CloneEffect.java | 2 +- .../ability/effects/DamageDealEffect.java | 6 +- .../ability/effects/DamagePreventEffect.java | 4 +- .../game/ability/effects/DestroyEffect.java | 6 +- .../forge/game/ability/effects/DigEffect.java | 4 +- .../game/ability/effects/EncodeEffect.java | 2 +- .../game/ability/effects/FightEffect.java | 4 +- .../game/ability/effects/FlipCoinEffect.java | 2 +- .../game/ability/effects/MillEffect.java | 2 +- .../game/ability/effects/ProtectEffect.java | 6 +- .../game/ability/effects/PumpEffect.java | 6 +- .../game/ability/effects/SacrificeEffect.java | 2 +- .../game/ability/effects/TokenEffect.java | 10 +-- .../game/ability/effects/TwoPilesEffect.java | 8 +-- .../src/main/java/forge/game/card/Card.java | 41 ++++++------ .../java/forge/game/card/CardFactoryUtil.java | 34 +++++----- .../java/forge/game/card/CardPlayOption.java | 2 +- .../main/java/forge/game/card/CardUtil.java | 2 +- .../main/java/forge/game/card/CardView.java | 2 +- .../main/java/forge/game/combat/Combat.java | 4 +- .../forge/game/cost/CostRemoveAnyCounter.java | 2 +- .../java/forge/game/cost/CostTapType.java | 2 +- .../forge/game/mana/ManaCostBeingPaid.java | 4 +- .../src/main/java/forge/game/phase/Untap.java | 8 +-- .../java/forge/deckchooser/FDeckChooser.java | 2 +- .../forge/gui/framework/SRearrangingUtil.java | 4 +- .../forge/gui/framework/SResizingUtil.java | 4 +- .../itemmanager/filters/ListLabelFilter.java | 4 +- .../itemmanager/filters/StatTypeFilter.java | 2 +- .../forge/itemmanager/views/ImageView.java | 4 +- .../main/java/forge/screens/home/CLobby.java | 5 +- .../home/gauntlet/ContestGauntletLister.java | 2 +- .../home/gauntlet/QuickGauntletLister.java | 2 +- .../home/quest/CSubmenuChallenges.java | 2 +- .../screens/home/quest/CSubmenuDuels.java | 2 +- .../screens/home/quest/QuestFileLister.java | 2 +- .../home/settings/VSubmenuDownloaders.java | 12 ++-- .../forge/screens/match/VAssignDamage.java | 2 +- .../src/main/java/forge/view/FView.java | 3 +- .../src/forge/animation/GifDecoder.java | 12 ++-- .../src/forge/deck/FDeckChooser.java | 2 +- .../src/forge/deck/FDeckImportDialog.java | 2 +- .../itemmanager/filters/ListLabelFilter.java | 4 +- .../forge/itemmanager/views/ImageView.java | 4 +- .../screens/constructed/LobbyScreen.java | 8 +-- .../screens/gauntlet/LoadGauntletScreen.java | 4 +- .../match/winlose/GauntletWinLose.java | 7 +-- .../planarconquest/LoadConquestScreen.java | 4 +- .../forge/screens/quest/LoadQuestScreen.java | 4 +- .../forge/screens/settings/SettingsPage.java | 5 +- .../src/forge/toolbox/FComboBox.java | 9 +-- .../main/java/forge/card/CardDetailUtil.java | 18 +++--- .../forge/card/CardReaderExperiments.java | 2 +- .../java/forge/deck/DeckGeneratorTheme.java | 10 +-- .../src/main/java/forge/deck/DeckgenUtil.java | 3 +- .../forge/itemmanager/AdvancedSearch.java | 18 +++--- .../forge/itemmanager/BooleanExpression.java | 18 +++--- .../java/forge/itemmanager/SFilterUtil.java | 10 +-- .../forge/itemmanager/SItemManagerUtil.java | 2 +- .../main/java/forge/limited/CardRanker.java | 3 +- .../match/input/InputConfirmMulligan.java | 6 +- .../forge/planarconquest/ConquestData.java | 18 +++--- .../forge/planarconquest/ConquestUtil.java | 16 ++--- .../src/main/java/forge/player/HumanPlay.java | 2 +- .../forge/player/PlayerControllerHuman.java | 19 +++--- .../properties/ForgeProfileProperties.java | 12 ++-- .../java/forge/quest/QuestEventDraft.java | 26 ++++---- .../java/forge/quest/QuestRewardCard.java | 12 ++-- .../src/main/java/forge/quest/QuestUtil.java | 2 +- .../forge/quest/QuestWinLoseController.java | 2 +- .../forge/quest/bazaar/QuestPetStorage.java | 4 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +-- .../java/forge/sound/EventVisualizer.java | 62 +++++++++---------- .../src/main/java/forge/util/RestartUtil.java | 4 +- 89 files changed, 312 insertions(+), 393 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 12b309f09aa..277128eb06d 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -103,8 +103,7 @@ public class AiAttackController { } // overloaded constructor to evaluate single specified attacker public static List getOpponentCreatures(final Player defender) { - List defenders = new ArrayList<>(); - defenders.addAll(defender.getCreaturesInPlay()); + List defenders = new ArrayList<>(defender.getCreaturesInPlay()); Predicate canAnimate = new Predicate() { @Override public boolean apply(Card c) { diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index e87a974d2db..68d0622b1a4 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -148,9 +148,7 @@ public class AiBlockController { final CardCollection attackers = combat.getAttackersOf(defender); // Begin with the attackers that pose the biggest threat CardLists.sortByPowerDesc(attackers); - for (final Card c : attackers) { - sortedAttackers.add(c); - } + sortedAttackers.addAll(attackers); } else if (defender instanceof Player && defender.equals(ai)) { firstAttacker = combat.getAttackersOf(defender); } @@ -163,9 +161,7 @@ public class AiBlockController { } } else { // add creatures attacking the Player to the back of the list - for (final Card c : firstAttacker) { - sortedAttackers.add(c); - } + sortedAttackers.addAll(firstAttacker); } return sortedAttackers; } @@ -481,8 +477,7 @@ public class AiBlockController { final int damageNeeded = ComputerUtilCombat.getDamageToKill(attacker) + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, secondBlocker, combat, false); - List usableBlockersAsThird = new ArrayList<>(); - usableBlockersAsThird.addAll(usableBlockers); + List usableBlockersAsThird = new ArrayList<>(usableBlockers); usableBlockersAsThird.remove(secondBlocker); // loop over the remaining blockers in search of a good third blocker candidate diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 9cf6b37e417..1d5d4eb26e1 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2283,8 +2283,7 @@ public class ComputerUtil { chosen = ComputerUtilCard.getMostProminentType(list, valid); } else if (logic.equals("MostNeededType")) { // Choose a type that is in the deck, but not in hand or on the battlefield - final List basics = new ArrayList<>(); - basics.addAll(CardType.Constant.BASIC_TYPES); + final List basics = new ArrayList<>(CardType.Constant.BASIC_TYPES); CardCollectionView presentCards = CardCollection.combine(ai.getCardsIn(ZoneType.Battlefield), ai.getCardsIn(ZoneType.Hand)); CardCollectionView possibleCards = ai.getAllCards(); diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 1703b9b0869..6edd9ffb70e 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -254,7 +254,7 @@ public abstract class GameState { newText.append(";"); } if (c.isToken()) { - newText.append("t:" + new TokenInfo(c).toString()); + newText.append("t:").append(new TokenInfo(c).toString()); } else { if (c.getPaperCard() == null) { return; @@ -377,7 +377,7 @@ public abstract class GameState { newText.append("|Attacking"); GameEntity def = c.getGame().getCombat().getDefenderByAttacker(c); if (def instanceof Card) { - newText.append(":" + def.getId()); + newText.append(":").append(def.getId()); } } } @@ -653,15 +653,15 @@ public abstract class GameState { } private String processManaPool(ManaPool manaPool) { - String mana = ""; + StringBuilder mana = new StringBuilder(); for (final byte c : MagicColor.WUBRGC) { int amount = manaPool.getAmountOfColor(c); for (int i = 0; i < amount; i++) { - mana += MagicColor.toShortString(c) + " "; + mana.append(MagicColor.toShortString(c)).append(" "); } } - return mana.trim(); + return mana.toString().trim(); } private void updateManaPool(Player p, String manaDef, boolean clearPool, boolean persistent) { diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 43cfb9dd765..1b0ab5d0f5a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -31,10 +31,7 @@ import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.MyRandom; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; public class AttachAi extends SpellAbilityAi { @@ -875,15 +872,11 @@ public class AttachAi extends SpellAbilityAi { String kws = stabMap.get("AddKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } kws = stabMap.get("AddHiddenKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } } } @@ -1173,15 +1166,11 @@ public class AttachAi extends SpellAbilityAi { String kws = stabMap.get("AddKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } kws = stabMap.get("AddHiddenKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } } } diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index ecc32895e01..49ce81440e9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -403,7 +403,7 @@ public class TokenAi extends SpellAbilityAi { String tokenToughness = sa.getParam("TokenToughness"); String tokenName = sa.getParam("TokenName"); String[] tokenTypes = sa.getParam("TokenTypes").split(","); - String cost = ""; + StringBuilder cost = new StringBuilder(); String[] tokenColors = sa.getParam("TokenColors").split(","); String tokenImage = sa.hasParam("TokenImage") ? PaperToken.makeTokenFileName(sa.getParam("TokenImage")) : ""; String[] tokenAbilities = sa.hasParam("TokenAbilities") ? sa.getParam("TokenAbilities").split(",") : null; @@ -418,35 +418,35 @@ public class TokenAi extends SpellAbilityAi { substitutedColors[i] = host.getChosenColor(); } } - String colorDesc = ""; + StringBuilder colorDesc = new StringBuilder(); for (final String col : substitutedColors) { if (col.equalsIgnoreCase("White")) { - colorDesc += "W "; + colorDesc.append("W "); } else if (col.equalsIgnoreCase("Blue")) { - colorDesc += "U "; + colorDesc.append("U "); } else if (col.equalsIgnoreCase("Black")) { - colorDesc += "B "; + colorDesc.append("B "); } else if (col.equalsIgnoreCase("Red")) { - colorDesc += "R "; + colorDesc.append("R "); } else if (col.equalsIgnoreCase("Green")) { - colorDesc += "G "; + colorDesc.append("G "); } else if (col.equalsIgnoreCase("Colorless")) { - colorDesc = "C"; + colorDesc = new StringBuilder("C"); } } final List imageNames = new ArrayList<>(1); if (tokenImage.equals("")) { - imageNames.add(PaperToken.makeTokenFileName(TextUtil.fastReplace(colorDesc, " ", ""), tokenPower, tokenToughness, tokenName)); + imageNames.add(PaperToken.makeTokenFileName(TextUtil.fastReplace(colorDesc.toString(), " ", ""), tokenPower, tokenToughness, tokenName)); } else { imageNames.add(0, tokenImage); } - for (final char c : colorDesc.toCharArray()) { - cost += c + ' '; + for (final char c : colorDesc.toString().toCharArray()) { + cost.append(c + ' '); } - cost = colorDesc.replace('C', '1').trim(); + cost = new StringBuilder(colorDesc.toString().replace('C', '1').trim()); final int finalPower = AbilityUtils.calculateAmount(host, tokenPower, sa); final int finalToughness = AbilityUtils.calculateAmount(host, tokenToughness, sa); @@ -460,7 +460,7 @@ public class TokenAi extends SpellAbilityAi { final String substitutedName = tokenName.equals("ChosenType") ? host.getChosenType() : tokenName; final String imageName = imageNames.get(MyRandom.getRandom().nextInt(imageNames.size())); final TokenInfo tokenInfo = new TokenInfo(substitutedName, imageName, - cost, substitutedTypes, tokenKeywords, finalPower, finalToughness); + cost.toString(), substitutedTypes, tokenKeywords, finalPower, finalToughness); Card token = tokenInfo.makeOneToken(ai); if (token == null) { diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java index 43f0c6f5e89..b81c648c1d2 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java @@ -270,28 +270,28 @@ public class SpellAbilityPicker { return abilityToString(sa, true); } public static String abilityToString(SpellAbility sa, boolean withTargets) { - String saString = "N/A"; + StringBuilder saString = new StringBuilder("N/A"); if (sa != null) { - saString = sa.toString(); + saString = new StringBuilder(sa.toString()); String cardName = sa.getHostCard().getName(); if (!cardName.isEmpty()) { - saString = TextUtil.fastReplace(saString, cardName, "<$>"); + saString = new StringBuilder(TextUtil.fastReplace(saString.toString(), cardName, "<$>")); } if (saString.length() > 40) { - saString = saString.substring(0, 40) + "..."; + saString = new StringBuilder(saString.substring(0, 40) + "..."); } if (withTargets) { SpellAbility saOrSubSa = sa; do { if (saOrSubSa.usesTargeting()) { - saString += " (targets: " + saOrSubSa.getTargets().getTargetedString() + ")"; + saString.append(" (targets: ").append(saOrSubSa.getTargets().getTargetedString()).append(")"); } saOrSubSa = saOrSubSa.getSubAbility(); } while (saOrSubSa != null); } - saString = sa.getHostCard() + " -> " + saString; + saString.insert(0, sa.getHostCard() + " -> "); } - return saString; + return saString.toString(); } private boolean shouldWaitForLater(final SpellAbility sa) { diff --git a/forge-core/src/main/java/forge/card/mana/ManaCost.java b/forge-core/src/main/java/forge/card/mana/ManaCost.java index 90886018108..51611a48d18 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCost.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCost.java @@ -114,7 +114,7 @@ public final class ManaCost implements Comparable, Iterable 0) { - sb.append("{" + this.genericCost + "}"); + sb.append("{").append(this.genericCost).append("}"); } for (final ManaCostShard s : this.shards) { if (s == ManaCostShard.X) { @@ -251,7 +251,7 @@ public final class ManaCost implements Comparable, Iterable " + (p.getValue() == null ? "(null)" : p.getValue().toString())); + mapAsString.append(p.getKey()).append(" => ").append(p.getValue() == null ? "(null)" : p.getValue().toString()); } return mapAsString.toString(); } diff --git a/forge-core/src/main/java/forge/util/collect/FCollection.java b/forge-core/src/main/java/forge/util/collect/FCollection.java index 1438b4f802c..4599035c795 100644 --- a/forge-core/src/main/java/forge/util/collect/FCollection.java +++ b/forge-core/src/main/java/forge/util/collect/FCollection.java @@ -9,15 +9,7 @@ import com.google.common.collect.Sets; import org.apache.commons.lang3.ArrayUtils; import java.io.Serializable; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; -import java.util.Set; +import java.util.*; /** * Collection with unique elements ({@link Set}) that maintains the order in @@ -73,9 +65,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, * creation. */ public FCollection(final T[] c) { - for (final T e : c) { - add(e); - } + this.addAll(Arrays.asList(c)); } /** @@ -87,9 +77,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, * creation. */ public FCollection(final Iterable i) { - for (final T e : i) { - add(e); - } + this.addAll(i); } /** diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index 520d39d33f4..9716126bd6b 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -229,11 +229,11 @@ public class GameLogFormatter extends IGameEventVisitor.Base { continue; } if (sb.length() > 0) sb.append("\n"); - sb.append(ev.player + " assigned " + Lang.joinHomogenous(attackers)); - sb.append(" to attack " + k + "."); + sb.append(ev.player).append(" assigned ").append(Lang.joinHomogenous(attackers)); + sb.append(" to attack ").append(k).append("."); } if (sb.length() == 0) { - sb.append(ev.player + " didn't attack this turn."); + sb.append(ev.player).append(" didn't attack this turn."); } return new GameLogEntry(GameLogEntryType.COMBAT, sb.toString()); } @@ -265,10 +265,10 @@ public class GameLogFormatter extends IGameEventVisitor.Base { blockers = att.getValue(); if (blockers.isEmpty()) { - sb.append(controllerName + " didn't block "); + sb.append(controllerName).append(" didn't block "); } else { - sb.append(controllerName + " assigned " + Lang.joinHomogenous(blockers) + " to block "); + sb.append(controllerName).append(" assigned ").append(Lang.joinHomogenous(blockers)).append(" to block "); } sb.append(att.getKey()).append("."); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index e4cb884ad78..3da8d02f45e 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -149,9 +149,7 @@ public class AbilityUtils { if (crd instanceof Card) { c = game.getCardState((Card) crd); } else if (crd instanceof Iterable) { - for (final Card cardItem : Iterables.filter((Iterable) crd, Card.class)) { - cards.add(cardItem); - } + cards.addAll(Iterables.filter((Iterable) crd, Card.class)); } } } @@ -161,9 +159,7 @@ public class AbilityUtils { if (crd instanceof Card) { c = game.getCardState((Card) crd); } else if (crd instanceof List) { - for (final Card cardItem : (CardCollection) crd) { - cards.add(cardItem); - } + cards.addAll((CardCollection) crd); } } else if (defined.equals("Remembered") || defined.equals("RememberedCard")) { @@ -530,9 +526,7 @@ public class AbilityUtils { } if (calcX[0].endsWith("LKI")) { // last known information - for (final Card c : newCard.getImprintedCards()) { - list.add(c); - } + list.addAll(newCard.getImprintedCards()); } else { for (final Card c : newCard.getImprintedCards()) { diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 831141a7b0b..160febd110b 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -83,7 +83,7 @@ public abstract class SpellAbilityEffect { "CARDNAME", sa.getHostCard().getName())); } if (sa.getTargets() != null && !sa.getTargets().getTargets().isEmpty()) { - sb.append(" (Targeting: " + sa.getTargets().getTargets() + ")"); + sb.append(" (Targeting: ").append(sa.getTargets().getTargets()).append(")"); } } else if (!"None".equalsIgnoreCase(stackDesc)) { // by typing "none" they want to suppress output makeSpellDescription(sa, sb, stackDesc); @@ -258,7 +258,7 @@ public abstract class SpellAbilityEffect { if (your) { delTrig.append("| ValidPlayer$ You "); } - delTrig.append("| TriggerDescription$ " + desc); + delTrig.append("| TriggerDescription$ ").append(desc); final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), sa.getHostCard(), intrinsic); for (final Card c : crds) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 8f8baaaaa00..b18b305f9b9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -876,9 +876,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { selectedCards = decider.getController().chooseCardsForZoneChange(destination, origin, sa, fetchList, 0, changeNum, delayedReveal, selectPrompt, decider); } while (selectedCards != null && selectedCards.size() > changeNum); if (selectedCards != null) { - for (Card card : selectedCards) { - chosenCards.add(card); - } + chosenCards.addAll(selectedCards); } // maybe prompt the user if they selected fewer than the maximum possible? } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index 950643e4a9c..742132bac5f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -40,7 +40,7 @@ public class CloneEffect extends SpellAbilityEffect { } sb.append(tgtCard); - sb.append(" becomes a copy of " + cardToCopy + "."); + sb.append(" becomes a copy of ").append(cardToCopy).append("."); return sb.toString(); } // end cloneStackDescription() diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 97b00f3c9be..bfb6258496d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -108,10 +108,8 @@ public class DamageDealEffect extends DamageBaseEffect { } // Can't radiate from a player if (origin != null) { - for (final Card c : CardUtil.getRadiance(hostCard, origin, - sa.getParam("ValidTgts").split(","))) { - tgts.add(c); - } + tgts.addAll(CardUtil.getRadiance(hostCard, origin, + sa.getParam("ValidTgts").split(","))); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java index fb2df2a405a..5b7ce50d73f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java @@ -81,9 +81,7 @@ public class DamagePreventEffect extends SpellAbilityEffect { } if (origin != null) { // Can't radiate from a player - for (final Card c : CardUtil.getRadiance(host, origin, sa.getParam("ValidTgts").split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(host, origin, sa.getParam("ValidTgts").split(","))); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java index b8d71057e54..e53e99e19c0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java @@ -78,10 +78,8 @@ public class DestroyEffect extends SpellAbilityEffect { CardCollection untargetedCards = new CardCollection(); if (sa.hasParam("Radiance")) { - for (final Card c : CardUtil.getRadiance(card, tgtCards.get(0), - sa.getParam("ValidTgts").split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(card, tgtCards.get(0), + sa.getParam("ValidTgts").split(","))); } if (tgtCards.size() > 1) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 7c654e8689d..dca94e86b5d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -167,9 +167,7 @@ public class DigEffect extends SpellAbilityEffect { if (!noMove) { CardCollection movedCards; - for (final Card c : top) { - rest.add(c); - } + rest.addAll(top); CardCollection valid; if (mitosis) { valid = sharesNameWithCardOnBattlefield(game, top); diff --git a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java index 6ededdfbf7c..7b0754c09cf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java @@ -45,7 +45,7 @@ public class EncodeEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); - sb.append("Do you want to exile " + host + " and encode it onto a creature you control?"); + sb.append("Do you want to exile ").append(host).append(" and encode it onto a creature you control?"); if (!player.getController().confirmAction(sa, null, sb.toString())) { return; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java index 4029bfd4d12..aa57af95f61 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java @@ -26,10 +26,10 @@ public class FightEffect extends DamageBaseEffect { List fighters = getFighters(sa); if (fighters.size() > 1) { - sb.append(fighters.get(0) + " fights " + fighters.get(1)); + sb.append(fighters.get(0)).append(" fights ").append(fighters.get(1)); } else if (fighters.size() == 1) { - sb.append(fighters.get(0) + " fights unknown"); + sb.append(fighters.get(0)).append(" fights unknown"); } return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java index 9724391b980..c23c2fb8f78 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java @@ -35,7 +35,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { sb.append(player).append(" flips a coin."); if (tgts != null && !tgts.isEmpty()) { - sb.append(" Targeting: " + tgts + "."); + sb.append(" Targeting: ").append(tgts).append("."); } return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index 1bbe40ac2a3..eca41963660 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -105,7 +105,7 @@ public class MillEffect extends SpellAbilityEffect { sb.append("s"); } final String millPosition = sa.hasParam("FromBottom") ? "bottom" : "top"; - sb.append(" from the " + millPosition + " of their library."); + sb.append(" from the ").append(millPosition).append(" of their library."); return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java index 45b268b9873..dd4769a547a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java @@ -132,10 +132,8 @@ public class ProtectEffect extends SpellAbilityEffect { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (sa.hasParam("Radiance") && (tgt != null)) { - for (final Card c : CardUtil.getRadiance(host, tgtCards.get(0), - sa.getParam("ValidTgts").split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(host, tgtCards.get(0), + sa.getParam("ValidTgts").split(","))); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 72c2987dd5c..4bd8a310b2c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -332,10 +332,8 @@ public class PumpEffect extends SpellAbilityEffect { } if (sa.hasParam("Radiance")) { - for (final Card c : CardUtil.getRadiance(host, tgtCards.get(0), sa.getParam("ValidTgts") - .split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(host, tgtCards.get(0), sa.getParam("ValidTgts") + .split(","))); } final ZoneType pumpZone = sa.hasParam("PumpZone") ? ZoneType.smartValueOf(sa.getParam("PumpZone")) diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java index 607c18d793c..367d9785286 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java @@ -62,7 +62,7 @@ public class SacrificeEffect extends SpellAbilityEffect { game.updateLastStateForCard(card); StringBuilder sb = new StringBuilder(); - sb.append("Cumulative upkeep for " + card); + sb.append("Cumulative upkeep for ").append(card); boolean isPaid = activator.getController().payManaOptional(card, payCost, sa, sb.toString(), ManaPaymentPurpose.CumulativeUpkeep); final Map runParams = Maps.newHashMap(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 548b7b18844..3c590887b26 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -368,14 +368,14 @@ public class TokenEffect extends SpellAbilityEffect { } private String parseColorForImage() { - String originalColorDesc = ""; + StringBuilder originalColorDesc = new StringBuilder(); for (final String col : this.tokenOriginalColors) { - originalColorDesc += MagicColor.toShortString(col); - if (originalColorDesc.equals("C")) { - return originalColorDesc; + originalColorDesc.append(MagicColor.toShortString(col)); + if (originalColorDesc.toString().equals("C")) { + return originalColorDesc.toString(); } } - return originalColorDesc; + return originalColorDesc.toString(); } private String determineTokenColor(Card host) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index d25125b73df..37febec93c9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -106,16 +106,16 @@ public class TwoPilesEffect extends SpellAbilityEffect { CardCollectionView chosenPile = pile1WasChosen ? pile1 : pile2; CardCollectionView unchosenPile = !pile1WasChosen ? pile1 : pile2; - String notification = chooser + " chooses Pile " + (pile1WasChosen ? "1" : "2") + ":\n"; + StringBuilder notification = new StringBuilder(chooser + " chooses Pile " + (pile1WasChosen ? "1" : "2") + ":\n"); if (!chosenPile.isEmpty()) { for (Card c : chosenPile) { - notification += c.getName() + "\n"; + notification.append(c.getName()).append("\n"); } } else { - notification += "(Empty pile)"; + notification.append("(Empty pile)"); } - p.getGame().getAction().nofityOfValue(sa, chooser, notification, chooser); + p.getGame().getAction().nofityOfValue(sa, chooser, notification.toString(), chooser); // take action on the chosen pile if (sa.hasParam("ChosenPile")) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 02f48f06494..78d1123680a 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1652,13 +1652,13 @@ public class Card extends GameEntity implements Comparable { if (!mCost.isOnlyManaCost()) { sbLong.append("."); } - sbLong.append(" (" + inst.getReminderText() + ")"); + sbLong.append(" (").append(inst.getReminderText()).append(")"); sbLong.append("\r\n"); } } else if (keyword.startsWith("Emerge")) { final String[] k = keyword.split(":"); sbLong.append(k[0]).append(" ").append(ManaCostParser.parse(k[1])); - sbLong.append(" (" + inst.getReminderText() + ")"); + sbLong.append(" (").append(inst.getReminderText()).append(")"); sbLong.append("\r\n"); } else if (keyword.startsWith("Echo")) { sbLong.append("Echo "); @@ -1689,7 +1689,7 @@ public class Card extends GameEntity implements Comparable { final String[] n = keyword.split(":"); final Cost cost = new Cost(n[1], false); sbLong.append("Multikicker ").append(cost.toSimpleString()); - sbLong.append(" (" + inst.getReminderText() + ")").append("\r\n"); + sbLong.append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } } else if (keyword.startsWith("Kicker")) { if (!keyword.endsWith("Generic")) { @@ -1703,7 +1703,7 @@ public class Card extends GameEntity implements Comparable { final Cost cost2 = new Cost(n[2], false); sbx.append(cost2.toSimpleString()); } - sbx.append(" (" + inst.getReminderText() + ")"); + sbx.append(" (").append(inst.getReminderText()).append(")"); sbLong.append(sbx).append("\r\n"); } } else if (keyword.startsWith("Hexproof:")) { @@ -1733,10 +1733,10 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Hideaway") || keyword.equals("Ascend") || keyword.equals("Totem armor") || keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot")){ - sbLong.append(keyword + " (" + inst.getReminderText() + ")"); + sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Partner:")) { final String[] k = keyword.split(":"); - sbLong.append("Partner with " + k[1] + " (" + inst.getReminderText() + ")"); + sbLong.append("Partner with ").append(k[1]).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Modular") || keyword.startsWith("Bloodthirst") || keyword.startsWith("Dredge") || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido") || keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb") @@ -1745,7 +1745,7 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { final String[] k = keyword.split(":"); - sbLong.append(k[0] + " " + k[1] + " (" + inst.getReminderText() + ")"); + sbLong.append(k[0]).append(" ").append(k[1]).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.contains("Haunt")) { sb.append("\r\nHaunt ("); if (isCreature()) { @@ -1766,14 +1766,14 @@ public class Card extends GameEntity implements Comparable { if (sb.length() != 0) { sb.append("\r\n"); } - sb.append(keyword + " (" + inst.getReminderText() + ")"); + sb.append(keyword).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.endsWith(" offering")) { String offeringType = keyword.split(" ")[0]; if (sb.length() != 0) { sb.append("\r\n"); } sbLong.append(keyword); - sbLong.append(" (" + Keyword.getInstance("Offering:"+ offeringType).getReminderText() + ")"); + sbLong.append(" (").append(Keyword.getInstance("Offering:" + offeringType).getReminderText()).append(")"); } else if (keyword.startsWith("Equip") || keyword.startsWith("Fortify") || keyword.startsWith("Outlast") || keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") || keyword.startsWith("Spectacle") || keyword.startsWith("Evoke") || keyword.startsWith("Bestow") || keyword.startsWith("Dash") @@ -1935,7 +1935,7 @@ public class Card extends GameEntity implements Comparable { String meld = this.getRules().getMeldWith(); if (meld != "" && (!hasMeldEffect)) { sb.append("\r\n"); - sb.append("(Melds with " + meld + ".)"); + sb.append("(Melds with ").append(meld).append(".)"); sb.append("\r\n"); } } @@ -2042,7 +2042,7 @@ public class Card extends GameEntity implements Comparable { } if (isGoaded()) { - sb.append("is goaded by: " + Lang.joinHomogenous(getGoaded())); + sb.append("is goaded by: ").append(Lang.joinHomogenous(getGoaded())); sb.append("\r\n"); } // replace triple line feeds with double line feeds @@ -2104,17 +2104,17 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Undaunted") || keyword.equals("Cascade") || keyword.equals("Devoid") || keyword.equals("Lifelink") || keyword.equals("Split second")) { - sbBefore.append(keyword + " (" + inst.getReminderText() + ")"); + sbBefore.append(keyword).append(" (").append(inst.getReminderText()).append(")"); sbBefore.append("\r\n"); } else if(keyword.equals("Conspire") || keyword.equals("Epic") || keyword.equals("Suspend") || keyword.equals("Jump-start")) { - sbAfter.append(keyword + " (" + inst.getReminderText() + ")"); + sbAfter.append(keyword).append(" (").append(inst.getReminderText()).append(")"); sbAfter.append("\r\n"); } else if (keyword.startsWith("Ripple")) { - sbBefore.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); + sbBefore.append(TextUtil.fastReplace(keyword, ":", " ")).append(" (").append(inst.getReminderText()).append(")"); sbBefore.append("\r\n"); } else if (keyword.startsWith("Dredge")) { - sbAfter.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); + sbAfter.append(TextUtil.fastReplace(keyword, ":", " ")).append(" (").append(inst.getReminderText()).append(")"); sbAfter.append("\r\n"); } else if (keyword.startsWith("Escalate") || keyword.startsWith("Buyback") || keyword.startsWith("Prowl")) { @@ -2129,14 +2129,13 @@ public class Card extends GameEntity implements Comparable { sbCost.append(" "); } sbCost.append(cost.toSimpleString()); - sbBefore.append(sbCost + " (" + inst.getReminderText() + ")"); + sbBefore.append(sbCost).append(" (").append(inst.getReminderText()).append(")"); sbBefore.append("\r\n"); } else if (keyword.startsWith("Multikicker")) { if (!keyword.endsWith("Generic")) { final String[] n = keyword.split(":"); final Cost cost = new Cost(n[1], false); - sbBefore.append("Multikicker ").append(cost.toSimpleString()) - .append(" (" + inst.getReminderText() + ")").append("\r\n"); + sbBefore.append("Multikicker ").append(cost.toSimpleString()).append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } } else if (keyword.startsWith("Kicker")) { if (!keyword.endsWith("Generic")) { @@ -2150,7 +2149,7 @@ public class Card extends GameEntity implements Comparable { final Cost cost2 = new Cost(n[2], false); sbx.append(cost2.toSimpleString()); } - sbx.append(" (" + inst.getReminderText() + ")"); + sbx.append(" (").append(inst.getReminderText()).append(")"); sbBefore.append(sbx).append("\r\n"); } }else if (keyword.startsWith("AlternateAdditionalCost")) { @@ -2179,7 +2178,7 @@ public class Card extends GameEntity implements Comparable { sbCost.append(" "); } sbCost.append(cost.toSimpleString()); - sbAfter.append(sbCost + " (" + inst.getReminderText() + ")"); + sbAfter.append(sbCost).append(" (").append(inst.getReminderText()).append(")"); sbAfter.append("\r\n"); } else if (keyword.equals("CARDNAME can't be countered.") || keyword.equals("Remove CARDNAME from your deck before playing if you're not playing for ante.")) { @@ -2209,7 +2208,7 @@ public class Card extends GameEntity implements Comparable { } sbAfter.append("Splice onto ").append(desc).append(" ").append(cost.toSimpleString()); - sbAfter.append(" (" + inst.getReminderText() + ")").append("\r\n"); + sbAfter.append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } else if (keyword.equals("Storm")) { sbAfter.append("Storm ("); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 3c2413b6ed6..b6d21204033 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -901,11 +901,11 @@ public class CardFactoryUtil { if (sq[0].contains("xColorPaid")) { String[] attrs = sq[0].split(" "); - String colors = ""; + StringBuilder colors = new StringBuilder(); for (int i = 1; i < attrs.length; i++) { - colors += attrs[i]; + colors.append(attrs[i]); } - return doXMath(c.getXManaCostPaidCount(colors), m, c); + return doXMath(c.getXManaCostPaidCount(colors.toString()), m, c); } @@ -2113,7 +2113,7 @@ public class CardFactoryUtil { } if (!zone.isEmpty()) { - repEffsb.append(" | ActiveZones$ " + zone); + repEffsb.append(" | ActiveZones$ ").append(zone); } ReplacementEffect re = ReplacementHandler.parseReplacement(repEffsb.toString(), card, intrinsic); @@ -2323,7 +2323,7 @@ public class CardFactoryUtil { StringBuilder trig = new StringBuilder(); trig.append("Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self"); - trig.append(" | TriggerDescription$ Champion ").append(article + " ").append(desc); + trig.append(" | TriggerDescription$ Champion ").append(article).append(" ").append(desc); trig.append(" (").append(Keyword.getInstance("Champion:"+desc).getReminderText()) .append(")"); StringBuilder trigReturn = new StringBuilder(); @@ -2677,7 +2677,7 @@ public class CardFactoryUtil { final StringBuilder sbTrig = new StringBuilder(); sbTrig.append("Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | "); sbTrig.append("ValidCard$ Card.Self | Secondary$ True | TriggerDescription$ "); - sbTrig.append("Living Weapon (" + inst.getReminderText() + ")"); + sbTrig.append("Living Weapon (").append(inst.getReminderText()).append(")"); final StringBuilder sbGerm = new StringBuilder(); sbGerm.append("DB$ Token | TokenAmount$ 1 | TokenScript$ b_0_0_germ |TokenOwner$ You | RememberTokens$ True"); @@ -3142,7 +3142,7 @@ public class CardFactoryUtil { } final String costStr = k.length == 3 ? k[2] : cost.toSimpleString(); - sb.append(costStr.substring(0,1).toLowerCase() + costStr.substring(1)); + sb.append(costStr.substring(0, 1).toLowerCase()).append(costStr.substring(1)); sb.append("."); String upkeepTrig = "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | " + @@ -3934,8 +3934,8 @@ public class CardFactoryUtil { } else { abilityStr.append(" "); } - abilityStr.append("| CostDesc$ " + cost.toSimpleString() + " "); - abilityStr.append("| SpellDescription$ (" + inst.getReminderText() + ")"); + abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); + abilityStr.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); // instantiate attach ability final SpellAbility newSA = AbilityFactory.getAbility(abilityStr.toString(), card); newSA.setIntrinsic(intrinsic); @@ -4008,7 +4008,7 @@ public class CardFactoryUtil { abilityStr.append("| PrecostDesc$ Fortify"); Cost cost = new Cost(equipCost, true); abilityStr.append(cost.isOnlyManaCost() ? " " : "—"); - abilityStr.append("| CostDesc$ " + cost.toSimpleString() + " "); + abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); abilityStr.append("| SpellDescription$ ("); abilityStr.append(inst.getReminderText()).append(")"); @@ -4169,8 +4169,8 @@ public class CardFactoryUtil { } else { abilityStr.append(" "); } - abilityStr.append("| CostDesc$ " + cost.toSimpleString() + " "); - abilityStr.append("| SpellDescription$ (" + inst.getReminderText() + ")"); + abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); + abilityStr.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); final SpellAbility sa = AbilityFactory.getAbility(abilityStr.toString(), card); sa.setIntrinsic(intrinsic); @@ -4192,7 +4192,7 @@ public class CardFactoryUtil { // makes new SpellDescription final StringBuilder sb = new StringBuilder(); sb.append(newSA.getCostDescription()); - sb.append("(" + inst.getReminderText() + ")"); + sb.append("(").append(inst.getReminderText()).append(")"); newSA.setDescription(sb.toString()); newSA.setBasicSpell(false); @@ -4209,9 +4209,9 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append("AB$ PutCounter | CounterType$ P1P1 | ActivationZone$ Hand"); sb.append("| ValidTgts$ Creature | TgtPrompt$ Select target creature"); - sb.append("| Cost$ " + manacost + " Discard<1/CARDNAME>"); + sb.append("| Cost$ ").append(manacost).append(" Discard<1/CARDNAME>"); sb.append("| CounterNum$ ").append(n); - sb.append("| CostDesc$ " + ManaCostParser.parse(manacost)); // to hide the Discard from the cost + sb.append("| CostDesc$ ").append(ManaCostParser.parse(manacost)); // to hide the Discard from the cost sb.append("| PrecostDesc$ Reinforce ").append(n).append("—"); sb.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); @@ -4421,7 +4421,7 @@ public class CardFactoryUtil { sb.append(manacost); sb.append(" Discard<1/CARDNAME> | ActivationZone$ Hand | PrecostDesc$ Cycling"); sb.append(cost.isOnlyManaCost() ? " " : "—"); - sb.append("| CostDesc$ " + cost.toSimpleString() + " "); + sb.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); sb.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); SpellAbility sa = AbilityFactory.getAbility(sb.toString(), card); @@ -4494,7 +4494,7 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append("Mode$ Continuous | EffectZone$ Exile | Affected$ Card.EncodedWithSource"); sb.append(" | AddTrigger$ CipherTrigger"); - sb.append(" | Description$ Cipher (" + inst.getReminderText() + ")"); + sb.append(" | Description$ Cipher (").append(inst.getReminderText()).append(")"); effect = sb.toString(); diff --git a/forge-game/src/main/java/forge/game/card/CardPlayOption.java b/forge-game/src/main/java/forge/game/card/CardPlayOption.java index b7531dde10d..3c2cb2e699e 100644 --- a/forge-game/src/main/java/forge/game/card/CardPlayOption.java +++ b/forge-game/src/main/java/forge/game/card/CardPlayOption.java @@ -82,7 +82,7 @@ public final class CardPlayOption { switch (getPayManaCost()) { case YES: if (altManaCost != null) { - sb.append(" (by paying " + getFormattedAltManaCost() + " instead of paying its mana cost"); + sb.append(" (by paying ").append(getFormattedAltManaCost()).append(" instead of paying its mana cost"); if (isWithFlash()) { sb.append(" and as though it has flash"); } diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 2f1efa59769..7bf0cfe1390 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -92,7 +92,7 @@ public final class CardUtil { public static String getShortColorsString(final Iterable colors) { StringBuilder colorDesc = new StringBuilder(); for (final String col : colors) { - colorDesc.append(MagicColor.toShortString(col) + " "); + colorDesc.append(MagicColor.toShortString(col)).append(" "); } return colorDesc.toString(); } diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 8f33fc065ad..d452b7d8123 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -559,7 +559,7 @@ public class CardView extends GameEntityView { sb.append(rulesText).append("\r\n\r\n"); } if (isCommander()) { - sb.append(getOwner()).append("'s " + getCommanderType() + "\r\n"); + sb.append(getOwner()).append("'s ").append(getCommanderType()).append("\r\n"); sb.append(getOwner().getCommanderInfo(this)).append("\r\n"); } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 94aff5f0de3..7a85137e66c 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -71,9 +71,7 @@ public class Combat { playerWhoAttacks = attacker; // Create keys for all possible attack targets - for (final GameEntity defender : CombatUtil.getAllPossibleDefenders(playerWhoAttacks)) { - attackableEntries.add(defender); - } + attackableEntries.addAll(CombatUtil.getAllPossibleDefenders(playerWhoAttacks)); attackConstraints = new AttackConstraints(this); } diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java index 329f2991bc8..063a44ce224 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java @@ -123,7 +123,7 @@ public class CostRemoveAnyCounter extends CostPartWithList { sb.append("Remove "); sb.append(Cost.convertIntAndTypeToWords(this.convertAmount(), "counter")); final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription(); - sb.append(" from " + desc); + sb.append(" from ").append(desc); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/cost/CostTapType.java b/forge-game/src/main/java/forge/game/cost/CostTapType.java index 4a400a3a4dc..fa62b2945a9 100644 --- a/forge-game/src/main/java/forge/game/cost/CostTapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostTapType.java @@ -77,7 +77,7 @@ public class CostTapType extends CostPartWithList { sb.append("two untapped creatures you control that share a creature type"); } else if (type.contains("+withTotalPowerGE")) { String num = type.split("\\+withTotalPowerGE")[1]; - sb.append("Tap any number of untapped creatures you control other than CARDNAME with total power " + num + "or greater"); + sb.append("Tap any number of untapped creatures you control other than CARDNAME with total power ").append(num).append("or greater"); } else { sb.append(Cost.convertAmountTypeToWords(i, this.getAmount(), "untapped " + desc)); sb.append(" you control"); diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java index 3208205f582..f3484f6192b 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -610,12 +610,12 @@ public class ManaCostBeingPaid { if (nGeneric > 0) { if (nGeneric <= 20) { - sb.append("{" + nGeneric + "}"); + sb.append("{").append(nGeneric).append("}"); } else { //if no mana symbol exists for generic amount, use combination of symbols for each digit String genericStr = String.valueOf(nGeneric); for (int i = 0; i < genericStr.length(); i++) { - sb.append("{" + genericStr.charAt(i) + "}"); + sb.append("{").append(genericStr.charAt(i)).append("}"); } } } diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index 688a295ce79..6b317fa3dff 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -220,19 +220,19 @@ public class Untap extends Phase { private static void optionalUntap(final Card c) { if (c.hasKeyword("You may choose not to untap CARDNAME during your untap step.")) { if (c.isTapped()) { - String prompt = "Untap " + c.toString() + "?"; + StringBuilder prompt = new StringBuilder("Untap " + c.toString() + "?"); boolean defaultChoice = true; if (c.getGainControlTargets().size() > 0) { final Iterable targets = c.getGainControlTargets(); - prompt += "\r\n" + c + " is controlling: "; + prompt.append("\r\n").append(c).append(" is controlling: "); for (final Card target : targets) { - prompt += target; + prompt.append(target); if (target.isInPlay()) { defaultChoice = false; } } } - boolean untap = c.getController().getController().chooseBinary(new SpellAbility.EmptySa(c, c.getController()), prompt, BinaryChoiceType.UntapOrLeaveTapped, defaultChoice); + boolean untap = c.getController().getController().chooseBinary(new SpellAbility.EmptySa(c, c.getController()), prompt.toString(), BinaryChoiceType.UntapOrLeaveTapped, defaultChoice); if (untap) { c.untap(); } diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index c25f55b5d78..2c8b5b40eaf 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -444,7 +444,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { if (decksComboBox.getDeckType() == null || decksComboBox.getDeckType() == DeckType.NET_DECK) { //handle special case of net decks if (netDeckCategory == null) { return ""; } - state.append(NetDeckCategory.PREFIX + netDeckCategory.getName()); + state.append(NetDeckCategory.PREFIX).append(netDeckCategory.getName()); } else { state.append(decksComboBox.getDeckType().name()); diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java index 83144ef6a40..0f779013499 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java @@ -98,9 +98,7 @@ public final class SRearrangingUtil { } // Otherwise, add all of the documents. else { - for (final IVDoc vDoc : cellSrc.getDocs()) { - docsToMove.add(vDoc); - } + docsToMove.addAll(cellSrc.getDocs()); } // Reset and show preview panel diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java index 5c6902bd3cc..3a3771b449f 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java @@ -136,9 +136,7 @@ public final class SResizingUtil { int smoothVal = 0; Set existingComponents = new HashSet<>(); - for (Component c : pnlContent.getComponents()) { - existingComponents.add(c); - } + existingComponents.addAll(Arrays.asList(pnlContent.getComponents())); // This is the core of the pixel-perfect layout. To avoid ±1 px errors on borders // from rounding individual panels, the intermediate values (exactly accurate, in %) diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java index 5490f787e5f..989db5eb853 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java @@ -45,10 +45,10 @@ public abstract class ListLabelFilter extends ItemFilte labelBuilder.append("s: All"); break; case 1: - labelBuilder.append(": " + getList().iterator().next()); + labelBuilder.append(": ").append(getList().iterator().next()); break; default: - labelBuilder.append("s: " + TextUtil.join(getList(), ", ")); + labelBuilder.append("s: ").append(TextUtil.join(getList(), ", ")); break; } label.setText(labelBuilder.toString()); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java index 0c84dea03da..775cdaf496e 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java @@ -32,7 +32,7 @@ public abstract class StatTypeFilter extends ToggleButt final Localizer localizer = Localizer.getInstance(); StringBuilder tooltip = new StringBuilder(); tooltip.append(st.label); - tooltip.append(" (" + localizer.getMessage("lblclicktotoogle") + " "); + tooltip.append(" (").append(localizer.getMessage("lblclicktotoogle")).append(" "); if (st.label.length() > 1 && !Character.isUpperCase(st.label.charAt(1))) { tooltip.append(st.label.substring(0, 1).toLowerCase()); tooltip.append(st.label.substring(1)); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index c4ab75b5ff9..b57a92b3261 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -597,9 +597,7 @@ public class ImageView extends ItemView { piles.get(key).items.add(itemInfo); } group.piles.clear(); - for (Pile pile : piles.values()) { - group.piles.add(pile); - } + group.piles.addAll(piles.values()); } groupY = y; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java index 46e9d1c9748..0058e27744f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java @@ -2,6 +2,7 @@ package forge.screens.home; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Arrays; import java.util.Vector; import javax.swing.SwingUtilities; @@ -28,9 +29,7 @@ public class CLobby { private void addDecks(final Iterable commanderDecks, FList deckList, String... initialItems) { Vector listData = new Vector<>(); - for (String item : initialItems) { - listData.add(item); - } + listData.addAll(Arrays.asList(initialItems)); listData.add("Generate"); if (!Iterables.isEmpty(commanderDecks)) { listData.add("Random"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java index b02d5215ac2..2dc906c0e61 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java @@ -45,7 +45,7 @@ public class ContestGauntletLister extends JPanel { this.removeAll(); final List tempRows = new ArrayList<>(); final List sorted = new ArrayList<>(); - for (final GauntletData gd : gd0) { sorted.add(gd); } + sorted.addAll(gd0); sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java index f610817ec5f..99e47412fb5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java @@ -64,7 +64,7 @@ public class QuickGauntletLister extends JPanel { this.removeAll(); final List tempRows = new ArrayList<>(); final List sorted = new ArrayList<>(); - for (final GauntletData gd : gauntlets) { sorted.add(gd); } + sorted.addAll(gauntlets); sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java index b35b3edbe36..f674b5b8ee2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java @@ -161,7 +161,7 @@ public enum CSubmenuChallenges implements ICDoc { final JXButtonPanel grpPanel = new JXButtonPanel(); StringBuilder sb = new StringBuilder(); - sb.append(localizer.getMessage("lblMatchBestof") + " ").append(FModel.getQuest().getMatchLength()); + sb.append(localizer.getMessage("lblMatchBestof")).append(" ").append(FModel.getQuest().getMatchLength()); view.getCbxMatchLength().setSelectedItem(sb.toString()); boolean haveAnyChallenges = true; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java index 448f521e7e7..1ddc1ebaaf6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java @@ -197,7 +197,7 @@ public enum CSubmenuDuels implements ICDoc { view.getPnlDuels().add(grpPanel, "w 100%!"); StringBuilder sb = new StringBuilder(); - sb.append(localizer.getMessage("lblMatchBestof") + " ").append(FModel.getQuest().getMatchLength()); + sb.append(localizer.getMessage("lblMatchBestof")).append(" ").append(FModel.getQuest().getMatchLength()); view.getCbxMatchLength().setSelectedItem(sb.toString()); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java index bcf8dfe969d..7a650ed9ee4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java @@ -66,7 +66,7 @@ public class QuestFileLister extends JPanel { this.removeAll(); List tempRows = new ArrayList<>(); List sorted = new ArrayList<>(); - for (QuestData qd : qd0) { sorted.add(qd); } + sorted.addAll(qd0); sorted.sort(new Comparator() { @Override public int compare(final QuestData x, final QuestData y) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java index 7a287619e01..bd4bde30705 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java @@ -234,8 +234,8 @@ public enum VSubmenuDownloaders implements IVSubmenu { cniSB.append("-------------------\n\n"); for (CardEdition e : editions) { - nifSB.append("Edition: " + e.getName() + " " + "(" + e.getCode() + "/" + e.getCode2() + ")\n"); - cniSB.append("Edition: " + e.getName() + " " + "(" + e.getCode() + "/" + e.getCode2() + ")\n"); + nifSB.append("Edition: ").append(e.getName()).append(" ").append("(").append(e.getCode()).append("/").append(e.getCode2()).append(")\n"); + cniSB.append("Edition: ").append(e.getName()).append(" ").append("(").append(e.getCode()).append("/").append(e.getCode2()).append(")\n"); String imagePath; int artIndex = 1; @@ -261,7 +261,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { } if (cp == null) { - cniSB.append(" " + c + "\n"); + cniSB.append(" ").append(c).append("\n"); notImplementedCount++; continue; } @@ -274,7 +274,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { if (imagePath != null) { File file = ImageKeys.getImageFile(imagePath); if (file == null) { - nifSB.append(" " + imagePath + "\n"); + nifSB.append(" ").append(imagePath).append("\n"); missingCount++; } } @@ -287,7 +287,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { if (imagePath != null) { File file = ImageKeys.getImageFile(imagePath); if (file == null) { - nifSB.append(" " + imagePath + "\n"); + nifSB.append(" ").append(imagePath).append("\n"); missingCount++; } } @@ -310,7 +310,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { String imgKey = token.getImageKey(i); File file = ImageKeys.getImageFile(imgKey); if (file == null) { - nifSB.append(" " + token.getImageFilename(i+1) + "\n"); + nifSB.append(" ").append(token.getImageFilename(i + 1)).append("\n"); missingCount++; } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java index 8b4717a3929..e0115d20a61 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java @@ -403,7 +403,7 @@ public class VAssignDamage { StringBuilder sb = new StringBuilder(); sb.append(dmg); if( overkill >= 0 ) { - sb.append(" (" +localizer.getMessage("lblLethal")); + sb.append(" (").append(localizer.getMessage("lblLethal")); if( overkill > 0 ) sb.append(" +").append(overkill); sb.append(")"); diff --git a/forge-gui-desktop/src/main/java/forge/view/FView.java b/forge-gui-desktop/src/main/java/forge/view/FView.java index 8e94854947f..2f9bb499825 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FView.java +++ b/forge-gui-desktop/src/main/java/forge/view/FView.java @@ -459,8 +459,7 @@ public enum FView { * @return {@link java.util.List}<{@link forge.gui.framework.DragCell}> */ public List getDragCells() { - final List clone = new ArrayList<>(); - clone.addAll(allCells); + final List clone = new ArrayList<>(allCells); return clone; } diff --git a/forge-gui-mobile/src/forge/animation/GifDecoder.java b/forge-gui-mobile/src/forge/animation/GifDecoder.java index 675d0018ed1..258b8d7036c 100644 --- a/forge-gui-mobile/src/forge/animation/GifDecoder.java +++ b/forge-gui-mobile/src/forge/animation/GifDecoder.java @@ -504,11 +504,11 @@ public class GifDecoder { break; case 0xff: // application extension readBlock(); - String app = ""; + StringBuilder app = new StringBuilder(); for (int i = 0; i < 11; i++) { - app += (char) block[i]; + app.append((char) block[i]); } - if (app.equals("NETSCAPE2.0")) { + if (app.toString().equals("NETSCAPE2.0")) { readNetscapeExt(); } else { skip(); // don't care @@ -554,11 +554,11 @@ public class GifDecoder { * Reads GIF file header information. */ protected void readHeader() { - String id = ""; + StringBuilder id = new StringBuilder(); for (int i = 0; i < 6; i++) { - id += (char) read(); + id.append((char) read()); } - if (!id.startsWith("GIF")) { + if (!id.toString().startsWith("GIF")) { status = STATUS_FORMAT_ERROR; return; } diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 8f53bb83989..06c681b5b8f 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -950,7 +950,7 @@ public class FDeckChooser extends FScreen { if (cmbDeckTypes.getSelectedItem() == null || cmbDeckTypes.getSelectedItem() == DeckType.NET_DECK) { //handle special case of net decks if (netDeckCategory == null) { return ""; } - state.append(NetDeckCategory.PREFIX + netDeckCategory.getName()); + state.append(NetDeckCategory.PREFIX).append(netDeckCategory.getName()); } else { state.append(cmbDeckTypes.getSelectedItem().name()); diff --git a/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java b/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java index 999d4568fe9..e8c5c56cece 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java +++ b/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java @@ -79,7 +79,7 @@ public class FDeckImportDialog extends FDialog { if (sb.length() > 0) { sb.append("\n"); } - sb.append(token.getNumber() + " " + token.getText()); + sb.append(token.getNumber()).append(" ").append(token.getText()); } } if (sb.length() > 0) { diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java index 0dab393dcf6..7398e095dc7 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java @@ -43,10 +43,10 @@ public abstract class ListLabelFilter extends ItemFilte labelBuilder.append("s: All"); break; case 1: - labelBuilder.append(": " + getList().iterator().next()); + labelBuilder.append(": ").append(getList().iterator().next()); break; default: - labelBuilder.append("s: " + TextUtil.join(getList(), ", ")); + labelBuilder.append("s: ").append(TextUtil.join(getList(), ", ")); break; } label.setText(labelBuilder.toString()); diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index 199d7bc3280..8261e525f40 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -433,9 +433,7 @@ public class ImageView extends ItemView { piles.get(key).items.add(itemInfo); } group.piles.clear(); - for (Pile pile : piles.values()) { - group.piles.add(pile); - } + group.piles.addAll(piles.values()); } groupY = y; diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index 79109f1343d..1ddb4f0c318 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -216,14 +216,14 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { cbVariants.setSelectedItem(appliedVariants.iterator().next()); } else { - String text = ""; + StringBuilder text = new StringBuilder(); for (GameType variantType : appliedVariants) { if (text.length() > 0) { - text += ", "; + text.append(", "); } - text += variantType.toString(); + text.append(variantType.toString()); } - cbVariants.setText(text); + cbVariants.setText(text.toString()); } } diff --git a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java index 59cc9a377f5..a8a3cc58e6a 100644 --- a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java +++ b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java @@ -295,9 +295,7 @@ public class LoadGauntletScreen extends LaunchScreen { public void refresh() { List sorted = new ArrayList<>(); - for (GauntletData gauntlet : gauntlets) { - sorted.add(gauntlet); - } + sorted.addAll(gauntlets); sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java index c0dcc042f66..69d634cd9e5 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java @@ -52,17 +52,16 @@ public class GauntletWinLose extends ControlWinLose { if (!lstEventNames.isEmpty()) { for (int i = 0; i < len; i++) { if (i <= num) { - sb.append((i + 1) + ". " + lstEventNames.get(i) - + " (" + lstEventRecords.get(i) + ")\n"); + sb.append(i + 1).append(". ").append(lstEventNames.get(i)).append(" (").append(lstEventRecords.get(i)).append(")\n"); } else { - sb.append((i + 1) + ". ??????\n"); + sb.append(i + 1).append(". ??????\n"); } } } if (message1 != null) { sb.append("\n"); - sb.append(message1 + "\n\n"); + sb.append(message1).append("\n\n"); sb.append(message2); } else { diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java index 893f5754347..db590928085 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java @@ -333,9 +333,7 @@ public class LoadConquestScreen extends LaunchScreen { public void setConquests(List qd0) { List sorted = new ArrayList<>(); - for (ConquestData qd : qd0) { - sorted.add(qd); - } + sorted.addAll(qd0); sorted.sort(new Comparator() { @Override public int compare(final ConquestData x, final ConquestData y) { diff --git a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java index cb9daf1b4ef..23ccaaf97bf 100644 --- a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java @@ -335,9 +335,7 @@ public class LoadQuestScreen extends LaunchScreen { public void setQuests(List qd0) { List sorted = new ArrayList<>(); - for (QuestData qd : qd0) { - sorted.add(qd); - } + sorted.addAll(qd0); sorted.sort(new Comparator() { @Override public int compare(final QuestData x, final QuestData y) { diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index a8b95b99340..13b0dbe6720 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -29,6 +29,7 @@ import forge.util.Callback; import forge.util.Utils; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class SettingsPage extends TabPage { @@ -402,9 +403,7 @@ public class SettingsPage extends TabPage { public CustomSelectSetting(FPref pref0, String label0, String description0, String[] options0) { super(pref0, label0 + ":", description0); - for (String option : options0) { - options.add(option); - } + options.addAll(Arrays.asList(options0)); } public CustomSelectSetting(FPref pref0, String label0, String description0, Iterable options0) { super(pref0, label0 + ":", description0); diff --git a/forge-gui-mobile/src/forge/toolbox/FComboBox.java b/forge-gui-mobile/src/forge/toolbox/FComboBox.java index 8e22a40b9d2..e6878c5e142 100644 --- a/forge-gui-mobile/src/forge/toolbox/FComboBox.java +++ b/forge-gui-mobile/src/forge/toolbox/FComboBox.java @@ -1,6 +1,7 @@ package forge.toolbox; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.badlogic.gdx.utils.Align; @@ -26,9 +27,7 @@ public class FComboBox extends FTextField implements IComboBox { setLabel(label0); } public FComboBox(T[] itemArray) { - for (T item : itemArray) { - items.add(item); - } + items.addAll(Arrays.asList(itemArray)); initialize(); } public FComboBox(Iterable items0) { @@ -66,9 +65,7 @@ public class FComboBox extends FTextField implements IComboBox { public void setItems(T[] itemArray, T selectedItem0) { items.clear(); if (itemArray != null) { - for (T item : itemArray) { - items.add(item); - } + items.addAll(Arrays.asList(itemArray)); } setSelectedItem(selectedItem0); } diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index 5215450dfef..8a0a7c3e2a3 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -339,7 +339,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append(c.getKey().getName() + " counters: "); + area.append(c.getKey().getName()).append(" counters: "); area.append(c.getValue()); } } @@ -351,7 +351,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Damage: " + damage); + area.append("Damage: ").append(damage); } } if (state.isCreature() || state.isPlaneswalker()) { @@ -360,7 +360,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Assigned Damage: " + assigned); + area.append("Assigned Damage: ").append(assigned); } } @@ -416,7 +416,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("(chosen player: " + card.getChosenPlayer() + ")"); + area.append("(chosen player: ").append(card.getChosenPlayer()).append(")"); } // chosen mode @@ -424,7 +424,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("(chosen mode: " + card.getChosenMode() + ")"); + area.append("(chosen mode: ").append(card.getChosenMode()).append(")"); } // named card @@ -506,7 +506,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Haunting " + card.getHaunting()); + area.append("Haunting ").append(card.getHaunting()); } // Cipher @@ -514,7 +514,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Encoded: " + card.getEncodedCards()); + area.append("Encoded: ").append(card.getEncodedCards()); } // must block @@ -523,7 +523,7 @@ public class CardDetailUtil { area.append("\n"); } final String mustBlockThese = Lang.joinHomogenous(card.getMustBlockCards()); - area.append("Must block " + mustBlockThese); + area.append("Must block ").append(mustBlockThese); } // exerted @@ -550,7 +550,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n\n"); } - area.append("Current Storm Count: " + gameView.getStormCount()); + area.append("Current Storm Count: ").append(gameView.getStormCount()); } } return area.toString(); diff --git a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java index 147940c7f96..00acd98e5fa 100644 --- a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java +++ b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java @@ -164,7 +164,7 @@ public class CardReaderExperiments { StringBuilder newLineBuilder = new StringBuilder(); newLineBuilder.append(line, 0, m.start(1)); for (String sym : m.group(1).split(" ")) { - newLineBuilder.append("{" + sym + "}"); + newLineBuilder.append("{").append(sym).append("}"); } newLineBuilder.append(line.substring(m.end(1) - 1)); //-1 so final space appended updated = true; diff --git a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java index 3f57c84a271..8cc0a5c94f5 100644 --- a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java +++ b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java @@ -124,7 +124,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { final float p = (float) (g.percentage * .01); final int grpCnt = (int) (p * size); final int cnSize = g.cardnames.size(); - errorBuilder.append("Group" + i + ":" + grpCnt + "\n"); + errorBuilder.append("Group").append(i).append(":").append(grpCnt).append("\n"); for (int j = 0; j < grpCnt; j++) { s = g.cardnames.get(MyRandom.getRandom().nextInt(cnSize)); @@ -150,7 +150,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { tDeck.add(pool.getCard(ss[0],ss[1])); } cardCounts.put(ss[0], n + 1); - errorBuilder.append(s + "\n"); + errorBuilder.append(s).append("\n"); } } @@ -162,15 +162,15 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { numBLands = size - tDeck.countAll(); } - errorBuilder.append("numBLands:" + numBLands + "\n"); + errorBuilder.append("numBLands:").append(numBLands).append("\n"); addBasicLand(numBLands,basicLandSet); - errorBuilder.append("DeckSize:" + tDeck.countAll() + "\n"); + errorBuilder.append("DeckSize:").append(tDeck.countAll()).append("\n"); adjustDeckSize(size); - errorBuilder.append("DeckSize:" + tDeck.countAll() + "\n"); + errorBuilder.append("DeckSize:").append(tDeck.countAll()).append("\n"); if (!testing) { errorBuilder.delete(0, errorBuilder.length()); //clear if not testing } diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index a155d4e782e..67dd9217b04 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -622,9 +622,8 @@ public class DeckgenUtil { } } }else { - List> potentialCards = new ArrayList<>(); String matrixKey = (format.equals(DeckFormat.TinyLeaders) ? DeckFormat.Commander : format).toString(); //use Commander for Tiny Leaders - potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(matrixKey).get(commander.getName())); + List> potentialCards = new ArrayList<>(CardRelationMatrixGenerator.cardPools.get(matrixKey).get(commander.getName())); Collections.shuffle(potentialCards, MyRandom.getRandom()); for(Map.Entry pair:potentialCards){ if(format.isLegalCard(pair.getKey())) { diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index a7a96a4837b..129924ef861 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -886,12 +886,12 @@ public class AdvancedSearch { return formatValue(values.get(0)) + finalDelim + formatValue(values.get(1)); default: int lastValueIdx = valueCount - 1; - String result = formatValue(values.get(0)); + StringBuilder result = new StringBuilder(formatValue(values.get(0))); for (int i = 1; i < lastValueIdx; i++) { - result += delim + formatValue(values.get(i)); + result.append(delim).append(formatValue(values.get(i))); } - result += delim.trim() + finalDelim + formatValue(values.get(lastValueIdx)); - return result; + result.append(delim.trim()).append(finalDelim).append(formatValue(values.get(lastValueIdx))); + return result.toString(); } } @@ -1233,15 +1233,15 @@ public class AdvancedSearch { StringBuilder builder = new StringBuilder(); builder.append("Filter:\n"); - String indent = ""; + StringBuilder indent = new StringBuilder(); for (Object piece : expression) { - if (piece.equals(Operator.CLOSE_PAREN) && !indent.isEmpty()) { - indent = indent.substring(2); //trim an indent level when a close paren is hit + if (piece.equals(Operator.CLOSE_PAREN) && (indent.length() > 0)) { + indent = new StringBuilder(indent.substring(2)); //trim an indent level when a close paren is hit } - builder.append("\n" + indent + piece.toString().trim()); + builder.append("\n").append(indent).append(piece.toString().trim()); if (piece.equals(Operator.OPEN_PAREN)) { - indent += " "; //add an indent level when an open paren is hit + indent.append(" "); //add an indent level when an open paren is hit } } return GuiBase.getInterface().encodeSymbols(builder.toString(), false); diff --git a/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java b/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java index 291bc5f1441..995cbccd033 100644 --- a/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java +++ b/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java @@ -43,7 +43,7 @@ public class BooleanExpression { public Predicate evaluate() { - String currentValue = ""; + StringBuilder currentValue = new StringBuilder(); boolean escapeNext = false; while (expression.hasNext()) { @@ -59,7 +59,7 @@ public class BooleanExpression { operator = Operator.OPEN_PAREN; } else if (token.equals(Operator.CLOSE_PAREN.token)) { operator = Operator.CLOSE_PAREN; - } else if (token.equals(Operator.NOT.token) && currentValue.trim().isEmpty()) { //Ignore ! operators that aren't the first token in a search term (Don't use '!' in 'Kaboom!') + } else if (token.equals(Operator.NOT.token) && currentValue.toString().trim().isEmpty()) { //Ignore ! operators that aren't the first token in a search term (Don't use '!' in 'Kaboom!') operator = Operator.NOT; } else if (token.equals(Operator.ESCAPE.token)) { escapeNext = true; @@ -67,20 +67,20 @@ public class BooleanExpression { } if (operator == null) { - currentValue += token; + currentValue.append(token); } else { if (escapeNext) { escapeNext = false; - currentValue += token; + currentValue.append(token); continue; } - if (!currentValue.trim().isEmpty()) { - operands.push(valueOf(currentValue.trim())); + if (!currentValue.toString().trim().isEmpty()) { + operands.push(valueOf(currentValue.toString().trim())); } - currentValue = ""; + currentValue = new StringBuilder(); if (!operators.isEmpty() && operator.precedence < operators.peek().precedence) { resolve(true); @@ -98,8 +98,8 @@ public class BooleanExpression { } - if (!currentValue.trim().isEmpty()) { - operands.push(valueOf(currentValue.trim())); + if (!currentValue.toString().trim().isEmpty()) { + operands.push(valueOf(currentValue.toString().trim())); } while (!operators.isEmpty()) { diff --git a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java index 241cb827008..d0b49c98364 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java @@ -70,7 +70,7 @@ public class SFilterUtil { private static List getSplitText(String text) { boolean inQuotes = false; - String entry = ""; + StringBuilder entry = new StringBuilder(); List splitText = new ArrayList<>(); for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); @@ -78,8 +78,8 @@ public class SFilterUtil { case ' ': if (!inQuotes) { //if not in quotes, end current entry if (entry.length() > 0) { - splitText.add(entry); - entry = ""; + splitText.add(entry.toString()); + entry = new StringBuilder(); } continue; } @@ -99,10 +99,10 @@ public class SFilterUtil { } break; } - entry += ch; + entry.append(ch); } if (entry.length() > 0) { - splitText.add(entry); + splitText.add(entry.toString()); } return splitText; } diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index f08c8960ded..eb960d86a2c 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -154,7 +154,7 @@ public final class SItemManagerUtil { }); final StringBuilder builder = new StringBuilder(); for (final Entry itemEntry : sorted) { - builder.append("\n" + itemEntry.getValue() + " * " + itemEntry.getKey().toString()); + builder.append("\n").append(itemEntry.getValue()).append(" * ").append(itemEntry.getKey().toString()); } return builder.toString(); } diff --git a/forge-gui/src/main/java/forge/limited/CardRanker.java b/forge-gui/src/main/java/forge/limited/CardRanker.java index 4fa6b84d7ee..91f12774e2e 100644 --- a/forge-gui/src/main/java/forge/limited/CardRanker.java +++ b/forge-gui/src/main/java/forge/limited/CardRanker.java @@ -135,8 +135,7 @@ public class CardRanker { } private static List getCardsExceptOne(List cache, int i) { - List otherCards = new ArrayList<>(); - otherCards.addAll(cache.subList(0, i)); + List otherCards = new ArrayList<>(cache.subList(0, i)); if (i + 1 < cache.size()) { otherCards.addAll(cache.subList(i + 1, cache.size())); } diff --git a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java index f413918e55e..24e2a6a1d19 100644 --- a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java +++ b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java @@ -63,11 +63,11 @@ public class InputConfirmMulligan extends InputSyncronizedBase { final StringBuilder sb = new StringBuilder(); if (startingPlayer == player) { - sb.append(player).append(", "+ localizer.getMessage("lblYouAreGoingFirst") +"\n\n"); + sb.append(player).append(", ").append(localizer.getMessage("lblYouAreGoingFirst")).append("\n\n"); } else { - sb.append(startingPlayer.getName()).append(" " + localizer.getMessage("lblIsGoingFirst") +".\n"); - sb.append(player).append(", "+ localizer.getMessage("lblYouAreGoing") + " ").append(Lang.getOrdinal(game.getPosition(player, startingPlayer))).append(".\n\n"); + sb.append(startingPlayer.getName()).append(" ").append(localizer.getMessage("lblIsGoingFirst")).append(".\n"); + sb.append(player).append(", ").append(localizer.getMessage("lblYouAreGoing")).append(" ").append(Lang.getOrdinal(game.getPosition(player, startingPlayer))).append(".\n\n"); } getController().getGui().updateButtons(getOwner(), localizer.getMessage("lblKeep"), localizer.getMessage("lblMulligan"), true, true, true); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java index b3a31a54160..f1fd227ecc9 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java @@ -270,14 +270,14 @@ public final class ConquestData { List commandersBeingExiled = null; - String message = "Exile the following " + cardStr + " to receive {AE}" + value + "?\n"; + StringBuilder message = new StringBuilder("Exile the following " + cardStr + " to receive {AE}" + value + "?\n"); for (PaperCard card : cards) { if (planeswalker == card) { SOptionPane.showMessageDialog("Current planeswalker cannot be exiled.", title, SOptionPane.INFORMATION_ICON); return false; } - String commandersUsingCard = ""; + StringBuilder commandersUsingCard = new StringBuilder(); for (ConquestCommander commander : commanders) { if (commander.getCard() == card) { if (!commander.getDeck().getMain().isEmpty()) { @@ -290,19 +290,19 @@ public final class ConquestData { commandersBeingExiled.add(commander); //cache commander to make it easier to remove later } if (commander.getDeck().getMain().contains(card)) { - commandersUsingCard += "\n" + commander.getName(); + commandersUsingCard.append("\n").append(commander.getName()); } } - if (!commandersUsingCard.isEmpty()) { + if (commandersUsingCard.length() > 0) { SOptionPane.showMessageDialog(card.getName() + " is in use by the following commanders and cannot be exiled:\n" + commandersUsingCard, title, SOptionPane.INFORMATION_ICON); return false; } - message += "\n" + card.getName(); + message.append("\n").append(card.getName()); } - if (SOptionPane.showConfirmDialog(message, title, "OK", "Cancel")) { + if (SOptionPane.showConfirmDialog(message.toString(), title, "OK", "Cancel")) { if (exiledCards.addAll(cards)) { if (commandersBeingExiled != null) { commanders.removeAll(commandersBeingExiled); @@ -326,11 +326,11 @@ public final class ConquestData { return false; } - String message = "Spend {AE}" + cost + " to retrieve the following " + cardStr + " from exile?\n"; + StringBuilder message = new StringBuilder("Spend {AE}" + cost + " to retrieve the following " + cardStr + " from exile?\n"); for (PaperCard card : cards) { - message += "\n" + card.getName(); + message.append("\n").append(card.getName()); } - if (SOptionPane.showConfirmDialog(message, title, "OK", "Cancel")) { + if (SOptionPane.showConfirmDialog(message.toString(), title, "OK", "Cancel")) { if (exiledCards.removeAll(cards)) { for (PaperCard card : cards) { if (card.getRules().canBeCommander()) { //add back commander for card if needed diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java index 7b1feacb8d3..df54a02c9fa 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java @@ -311,13 +311,13 @@ public class ConquestUtil { } public static AEtherFilter getColorFilter(ColorSet color) { - String name = ""; + StringBuilder name = new StringBuilder(); for (ManaCostShard s : color.getOrderedShards()) { - name += s.toString(); + name.append(s.toString()); } - name = name.replaceAll("[{}]", ""); //remove all brackets + name = new StringBuilder(name.toString().replaceAll("[{}]", "")); //remove all brackets try { - return AEtherFilter.valueOf(name); + return AEtherFilter.valueOf(name.toString()); } catch (Exception e) { System.err.println("No color filter with name " + name); @@ -462,7 +462,7 @@ public class ConquestUtil { double baseOdds = 0; double remainingOdds = 1; CardRarity baseRarity = null; - String caption = ""; + StringBuilder caption = new StringBuilder(); for (CardRarity rarity : rarityOdds.keySet()) { Double odds = oddsLookup.get(rarity); @@ -479,16 +479,16 @@ public class ConquestUtil { final String display = rounded < 1d ? Double.toString(rounded) // Display decimal if < 1% : Long.toString(Math.round(rounded)); - caption += ", " + rarity.getLongName() + " (" + display + "%)"; + caption.append(", ").append(rarity.getLongName()).append(" (").append(display).append("%)"); rarityOdds.put(rarity, odds); } } //prepend base rarity and odds - caption = baseRarity.getLongName() + " (" + (Math.round(1000 * remainingOdds) / 10) + "%)" + caption; + caption.insert(0, baseRarity.getLongName() + " (" + (Math.round(1000 * remainingOdds) / 10) + "%)"); rarityOdds.put(baseRarity, remainingOdds); - return caption; + return caption.toString(); } @Override diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 40d69e11f79..bf9244ffd0c 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -333,7 +333,7 @@ public class HumanPlay { StringBuilder sb = new StringBuilder("Do you want to "); sb.append(res.contains(p) ? "" : "let that player "); - sb.append("draw " + Lang.nounWithAmount(amount, " card") + "?" + orString); + sb.append("draw ").append(Lang.nounWithAmount(amount, " card")).append("?").append(orString); if (!p.getController().confirmPayment(part, sb.toString(), sourceAbility)) { return false; diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 4631c33e04a..eb4dc80fa2f 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -337,7 +337,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (min == 0) { builder.append("up to "); } - builder.append("%d " + message + "(s) to " + action + "."); + builder.append("%d ").append(message).append("(s) to ").append(action).append("."); final InputSelectCardsFromList inp = new InputSelectCardsFromList(this, min, max, valid, sa); inp.setMessage(builder.toString()); @@ -544,8 +544,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (SpellAbility spellAbility : spells) { spellViewCache.put(spellAbility.getView(), spellAbility); } - List choices = new ArrayList<>(); - choices.addAll(spellViewCache.keySet()); + List choices = new ArrayList<>(spellViewCache.keySet()); Object choice = getGui().one(title, choices); // Human is supposed to read the message and understand from it what to @@ -634,13 +633,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } final Map tos = sa.getTriggeringObjects(); if (tos.containsKey("Attacker")) { - buildQuestion.append("\nAttacker: " + tos.get("Attacker")); + buildQuestion.append("\nAttacker: ").append(tos.get("Attacker")); } if (tos.containsKey("Card")) { final Card card = (Card) tos.get("Card"); if (card != null && (card.getController() == player || game.getZoneOf(card) == null || game.getZoneOf(card).getZoneType().isKnown())) { - buildQuestion.append("\nTriggered by: " + tos.get("Card")); + buildQuestion.append("\nTriggered by: ").append(tos.get("Card")); } } @@ -1623,7 +1622,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // for the purpose of pre-ordering, no need for extra granularity Integer idxAdditionalInfo = firstStr.indexOf(" ["); - String saLookupKey = idxAdditionalInfo != -1 ? firstStr.substring(0, idxAdditionalInfo - 1) : firstStr; + StringBuilder saLookupKey = new StringBuilder(idxAdditionalInfo != -1 ? firstStr.substring(0, idxAdditionalInfo - 1) : firstStr); char delim = (char) 5; for (int i = 1; i < activePlayerSAs.size(); i++) { @@ -1635,14 +1634,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // are the same } - saLookupKey += delim + saStr; + saLookupKey.append(delim).append(saStr); idxAdditionalInfo = saLookupKey.indexOf(" ["); if (idxAdditionalInfo != -1) { - saLookupKey = saLookupKey.substring(0, idxAdditionalInfo - 1); + saLookupKey = new StringBuilder(saLookupKey.substring(0, idxAdditionalInfo - 1)); } } if (needPrompt) { - List savedOrder = orderedSALookup.get(saLookupKey); + List savedOrder = orderedSALookup.get(saLookupKey.toString()); List orderedSAVs = Lists.newArrayList(); // create a mapping between a spell's view and the spell itself @@ -1681,7 +1680,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (SpellAbility sa : orderedSAs) { savedOrder.add(activePlayerSAs.indexOf(sa)); } - orderedSALookup.put(saLookupKey, savedOrder); + orderedSALookup.put(saLookupKey.toString(), savedOrder); } } for (int i = orderedSAs.size() - 1; i >= 0; i--) { diff --git a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java index 17711e08509..78cd5278860 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java +++ b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java @@ -212,16 +212,16 @@ public class ForgeProfileProperties { //only append values that aren't equal to defaults final StringBuilder sb = new StringBuilder(); if (!userDir.equals(defaultUserDir)) { //ensure backslashes are escaped - sb.append(USER_DIR_KEY + "=" + userDir.replace("\\", "\\\\") + "\n"); + sb.append(USER_DIR_KEY + "=").append(userDir.replace("\\", "\\\\")).append("\n"); } if (!decksDir.equals(defaultDecksDir)) { - sb.append(DECKS_DIR_KEY + "=" + decksDir.replace("\\", "\\\\") + "\n"); + sb.append(DECKS_DIR_KEY + "=").append(decksDir.replace("\\", "\\\\")).append("\n"); } if (!cacheDir.equals(defaultCacheDir)) { - sb.append(CACHE_DIR_KEY + "=" + cacheDir.replace("\\", "\\\\") + "\n"); + sb.append(CACHE_DIR_KEY + "=").append(cacheDir.replace("\\", "\\\\")).append("\n"); } if (!cardPicsDir.equals(defaultCardPicsDir)) { - sb.append(CARD_PICS_DIR_KEY + "=" + cardPicsDir.replace("\\", "\\\\") + "\n"); + sb.append(CARD_PICS_DIR_KEY + "=").append(cardPicsDir.replace("\\", "\\\\")).append("\n"); } if (cardPicsSubDirs.size() > 0) { sb.append(CARD_PICS_SUB_DIRS_KEY + "="); @@ -230,12 +230,12 @@ public class ForgeProfileProperties { if (needDelim) { sb.append("|"); } - sb.append(entry.getKey() + "->" + entry.getValue()); + sb.append(entry.getKey()).append("->").append(entry.getValue()); } sb.append("\n"); } if (serverPort != 0) { - sb.append(SERVER_PORT_KEY + "=" + serverPort); + sb.append(SERVER_PORT_KEY + "=").append(serverPort); } if (sb.length() > 0) { FileUtil.writeFile(ForgeConstants.PROFILE_FILE, sb.toString()); diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java index d3e36257b84..974aaddb753 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java @@ -693,17 +693,17 @@ public class QuestEventDraft implements IQuestEvent { if (edition != null) { return edition.getName() + " (" + edition.getCode() + ")"; } - String blockString = block.getName() + " ("; + StringBuilder blockString = new StringBuilder(block.getName() + " ("); List sets = block.getSets(); for (int i = 0; i < sets.size(); i++) { CardEdition cardEdition = sets.get(i); - blockString += cardEdition.getCode(); + blockString.append(cardEdition.getCode()); if (i < sets.size() - 1) { - blockString += ", "; + blockString.append(", "); } } - blockString += ")"; - return blockString; + blockString.append(")"); + return blockString.toString(); } public String getName() { @@ -959,14 +959,14 @@ public class QuestEventDraft implements IQuestEvent { final String s0c = sets.get(0).getCode(); if (sets.size() == 1) { int numBoosters = block.getCntBoostersDraft(); - String combination = ""; + StringBuilder combination = new StringBuilder(); for (int i = 0; i < numBoosters; i++) { - combination += s0c; + combination.append(s0c); if (i < numBoosters - 1) { - combination += "/"; + combination.append("/"); } } - possibleCombinations.add(combination); + possibleCombinations.add(combination.toString()); return possibleCombinations; } @@ -1087,15 +1087,15 @@ public class QuestEventDraft implements IQuestEvent { } public String getBoosterList() { - String boosterList = ""; + StringBuilder boosterList = new StringBuilder(); String[] boosterArray = boosterConfiguration.split("/"); for (int i = 0; i < boosterArray.length; i++) { - boosterList += FModel.getMagicDb().getEditions().get(boosterArray[i]).getName(); + boosterList.append(FModel.getMagicDb().getEditions().get(boosterArray[i]).getName()); if (i != boosterArray.length - 1) { - boosterList += " | "; + boosterList.append(" | "); } } - return boosterList; + return boosterList.toString(); } @Override diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java index 26c2c6de0c7..9b0541dbc91 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java @@ -19,27 +19,27 @@ public abstract class QuestRewardCard implements IQuestRewardCard { return defaultDescription; } - String buildDesc = null; + StringBuilder buildDesc = null; for (final String s : input) { if (s.startsWith("desc:") || s.startsWith("Desc:")) { final String[] tmp = s.split(":"); if (tmp.length > 1) { - buildDesc = tmp[1]; + buildDesc = new StringBuilder(tmp[1]); } else { - buildDesc = ""; + buildDesc = new StringBuilder(); } } else if (buildDesc != null) { if (s.contains(":")) { - return buildDesc; + return buildDesc.toString(); } else { - buildDesc = buildDesc + " " + s; + buildDesc.append(" ").append(s); } } } if (buildDesc != null) { - return buildDesc; + return buildDesc.toString(); } return defaultDescription; } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 63be897d389..03b336a36cf 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -323,7 +323,7 @@ public class QuestUtil { view.getCbxMatchLength().removeAllItems(); boolean activeCharms = false; StringBuilder matchLength = new StringBuilder(); - matchLength.append(localizer.getMessage("lblMatchBestof") + " ").append(qCtrl.getMatchLength()); + matchLength.append(localizer.getMessage("lblMatchBestof")).append(" ").append(qCtrl.getMatchLength()); if (qCtrl.getAssets().hasItem(QuestItemType.CHARM_VIM)) { view.getCbxMatchLength().addItem(localizer.getMessage("lblMatchBestOf1")); activeCharms = true; diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 265ea61bb58..bcf80b0526d 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -227,7 +227,7 @@ public class QuestWinLoseController { sb.append(" opponent: ").append(credBase).append(" credits.\n"); if(qEvent.getIsRandomMatch()){ - sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + sb.append("Random Opponent Bonus: ").append(credBase).append(" credit").append(credBase > 1 ? "s." : ".").append("\n"); credBase += credBase; } diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java index 8c30919f90e..899f7c93d4a 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java @@ -142,9 +142,7 @@ public class QuestPetStorage { final List result = new ArrayList<>(); final List allPossible = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null != allPossible) { - for (final QuestPetController c : allPossible) { - result.add(c); - } + result.addAll(allPossible); } return result; } diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index c64544b11b8..2aebea27992 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -540,14 +540,14 @@ public class QuestDataIO { writer.endNode(); writer.startNode("packs"); - String output = ""; + StringBuilder output = new StringBuilder(); for (int i = 0; i < draft.getBoosterConfiguration().length; i++) { - output += draft.getBoosterConfiguration()[i]; + output.append(draft.getBoosterConfiguration()[i]); if (i != draft.getBoosterConfiguration().length - 1) { - output += "/"; + output.append("/"); } } - writer.setValue(output); + writer.setValue(output.toString()); writer.endNode(); writer.startNode("entryFee"); diff --git a/forge-gui/src/main/java/forge/sound/EventVisualizer.java b/forge-gui/src/main/java/forge/sound/EventVisualizer.java index 0f2cc2c71fd..69ce7a8fba1 100644 --- a/forge-gui/src/main/java/forge/sound/EventVisualizer.java +++ b/forge-gui/src/main/java/forge/sound/EventVisualizer.java @@ -199,40 +199,40 @@ public class EventVisualizer extends IGameEventVisitor.Base imp resultSound = SoundEffectType.ScriptedEffect; } else { // I want to get all real colors this land can produce - no interest in colorless or devoid - String fullManaColors = ""; + StringBuilder fullManaColors = new StringBuilder(); for (final SpellAbility sa : land.getManaAbilities()) { String currManaColor = sa.getManaPartRecursive().getOrigProduced(); if(!"C".equals(currManaColor)) { - fullManaColors = fullManaColors + currManaColor; + fullManaColors.append(currManaColor); } } // No interest if "colors together" or "alternative colors" - only interested in colors themselves - fullManaColors = fullManaColors.replaceAll("\\s", ""); + fullManaColors = new StringBuilder(fullManaColors.toString().replaceAll("\\s", "")); int fullManaColorsLength = fullManaColors.length(); if(fullManaColorsLength >= 3) { // three color land - fullManaColors = fullManaColors.substring(0,3); - if (fullManaColors.contains("W") && fullManaColors.contains("U") && fullManaColors.contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueBlackLand)) { + fullManaColors = new StringBuilder(fullManaColors.substring(0, 3)); + if (fullManaColors.toString().contains("W") && fullManaColors.toString().contains("U") && fullManaColors.toString().contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueBlackLand)) { resultSound = SoundEffectType.WhiteBlueBlackLand; - } else if (fullManaColors.contains("W") && fullManaColors.contains("G") && fullManaColors.contains("U") && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenBlueLand)) { + } else if (fullManaColors.toString().contains("W") && fullManaColors.toString().contains("G") && fullManaColors.toString().contains("U") && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenBlueLand)) { resultSound = SoundEffectType.WhiteGreenBlueLand; - } else if (fullManaColors.contains("W") && fullManaColors.contains("R") && fullManaColors.contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedBlackLand)) { + } else if (fullManaColors.toString().contains("W") && fullManaColors.toString().contains("R") && fullManaColors.toString().contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedBlackLand)) { resultSound = SoundEffectType.WhiteRedBlackLand; - } else if (fullManaColors.contains("B") && fullManaColors.contains("W") && fullManaColors.contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteGreenLand)) { + } else if (fullManaColors.toString().contains("B") && fullManaColors.toString().contains("W") && fullManaColors.toString().contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteGreenLand)) { resultSound = SoundEffectType.BlackWhiteGreenLand; - } else if (fullManaColors.contains("B") && fullManaColors.contains("R") && fullManaColors.contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackRedGreenLand)) { + } else if (fullManaColors.toString().contains("B") && fullManaColors.toString().contains("R") && fullManaColors.toString().contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackRedGreenLand)) { resultSound = SoundEffectType.BlackRedGreenLand; - } else if (fullManaColors.contains("U") && fullManaColors.contains("B") && fullManaColors.contains("R") && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackRedLand)) { + } else if (fullManaColors.toString().contains("U") && fullManaColors.toString().contains("B") && fullManaColors.toString().contains("R") && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackRedLand)) { resultSound = SoundEffectType.BlueBlackRedLand; - } else if (fullManaColors.contains("G") && fullManaColors.contains("U") && fullManaColors.contains("R") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueRedLand)) { + } else if (fullManaColors.toString().contains("G") && fullManaColors.toString().contains("U") && fullManaColors.toString().contains("R") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueRedLand)) { resultSound = SoundEffectType.GreenBlueRedLand; - } else if (fullManaColors.contains("G") && fullManaColors.contains("B") && fullManaColors.contains("U") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackBlueLand)) { + } else if (fullManaColors.toString().contains("G") && fullManaColors.toString().contains("B") && fullManaColors.toString().contains("U") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackBlueLand)) { resultSound = SoundEffectType.GreenBlackBlueLand; - } else if (fullManaColors.contains("G") && fullManaColors.contains("R") && fullManaColors.contains("W") && SoundSystem.instance.hasResource(SoundEffectType.GreenRedWhiteLand)) { + } else if (fullManaColors.toString().contains("G") && fullManaColors.toString().contains("R") && fullManaColors.toString().contains("W") && SoundSystem.instance.hasResource(SoundEffectType.GreenRedWhiteLand)) { resultSound = SoundEffectType.GreenRedWhiteLand; - } else if (fullManaColors.contains("R") && fullManaColors.contains("U") && fullManaColors.contains("W") && SoundSystem.instance.hasResource(SoundEffectType.RedBlueWhiteLand)) { + } else if (fullManaColors.toString().contains("R") && fullManaColors.toString().contains("U") && fullManaColors.toString().contains("W") && SoundSystem.instance.hasResource(SoundEffectType.RedBlueWhiteLand)) { resultSound = SoundEffectType.RedBlueWhiteLand; } } @@ -240,26 +240,26 @@ public class EventVisualizer extends IGameEventVisitor.Base imp if(resultSound == null && fullManaColorsLength >= 2) { // three color land without sounds installed, or two color land // lets try - fullManaColors = fullManaColors.substring(0,2); - if (fullManaColors.contains("W") && (fullManaColors.contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueLand)) { + fullManaColors = new StringBuilder(fullManaColors.substring(0, 2)); + if (fullManaColors.toString().contains("W") && (fullManaColors.toString().contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueLand)) { resultSound = SoundEffectType.WhiteBlueLand; - } else if (fullManaColors.contains("W") && (fullManaColors.contains("G")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenLand)) { + } else if (fullManaColors.toString().contains("W") && (fullManaColors.toString().contains("G")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenLand)) { resultSound = SoundEffectType.WhiteGreenLand; - } else if (fullManaColors.contains("W") && (fullManaColors.contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedLand)) { + } else if (fullManaColors.toString().contains("W") && (fullManaColors.toString().contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedLand)) { resultSound = SoundEffectType.WhiteRedLand; - } else if (fullManaColors.contains("B") && (fullManaColors.contains("W")) && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteLand)) { + } else if (fullManaColors.toString().contains("B") && (fullManaColors.toString().contains("W")) && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteLand)) { resultSound = SoundEffectType.BlackWhiteLand; - } else if (fullManaColors.contains("B") && (fullManaColors.contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.BlackRedLand)) { + } else if (fullManaColors.toString().contains("B") && (fullManaColors.toString().contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.BlackRedLand)) { resultSound = SoundEffectType.BlackRedLand; - } else if (fullManaColors.contains("U") && (fullManaColors.contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackLand)) { + } else if (fullManaColors.toString().contains("U") && (fullManaColors.toString().contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackLand)) { resultSound = SoundEffectType.BlueBlackLand; - } else if (fullManaColors.contains("G") && (fullManaColors.contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueLand)) { + } else if (fullManaColors.toString().contains("G") && (fullManaColors.toString().contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueLand)) { resultSound = SoundEffectType.GreenBlueLand; - } else if (fullManaColors.contains("G") && (fullManaColors.contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackLand)) { + } else if (fullManaColors.toString().contains("G") && (fullManaColors.toString().contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackLand)) { resultSound = SoundEffectType.GreenBlackLand; - } else if (fullManaColors.contains("G") && (fullManaColors.contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.GreenRedLand)) { + } else if (fullManaColors.toString().contains("G") && (fullManaColors.toString().contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.GreenRedLand)) { resultSound = SoundEffectType.GreenRedLand; - } else if (fullManaColors.contains("R") && (fullManaColors.contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.RedBlueLand)) { + } else if (fullManaColors.toString().contains("R") && (fullManaColors.toString().contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.RedBlueLand)) { resultSound = SoundEffectType.RedBlueLand; } } @@ -268,17 +268,17 @@ public class EventVisualizer extends IGameEventVisitor.Base imp // multicolor land without sounds installed, or single mana land, or colorless/devoid land // in case of multicolor, lets take only the 1st color of the list, it sure has sound if(fullManaColorsLength >= 2) { - fullManaColors = fullManaColors.substring(0,1); + fullManaColors = new StringBuilder(fullManaColors.substring(0, 1)); } - if (fullManaColors.contains("B")) { + if (fullManaColors.toString().contains("B")) { resultSound = SoundEffectType.BlackLand; - } else if (fullManaColors.contains("U")) { + } else if (fullManaColors.toString().contains("U")) { resultSound = SoundEffectType.BlueLand; - } else if (fullManaColors.contains("G")) { + } else if (fullManaColors.toString().contains("G")) { resultSound = SoundEffectType.GreenLand; - } else if (fullManaColors.contains("R")) { + } else if (fullManaColors.toString().contains("R")) { resultSound = SoundEffectType.RedLand; - } else if (fullManaColors.contains("W")) { + } else if (fullManaColors.toString().contains("W")) { resultSound = SoundEffectType.WhiteLand; } else { resultSound = SoundEffectType.OtherLand; diff --git a/forge-gui/src/main/java/forge/util/RestartUtil.java b/forge-gui/src/main/java/forge/util/RestartUtil.java index c74c05297f1..a4fcf54679a 100644 --- a/forge-gui/src/main/java/forge/util/RestartUtil.java +++ b/forge-gui/src/main/java/forge/util/RestartUtil.java @@ -45,10 +45,10 @@ public class RestartUtil { // program main is a jar if (mainCommand[0].endsWith(".jar")) { // if it's a jar, add -jar mainJar - cmd.append("-jar " + new File(mainCommand[0]).getPath()); + cmd.append("-jar ").append(new File(mainCommand[0]).getPath()); } else { // else it's a .class, add the classpath and mainClass - cmd.append("-cp \"" + System.getProperty("java.class.path") + "\" " + mainCommand[0]); + cmd.append("-cp \"").append(System.getProperty("java.class.path")).append("\" ").append(mainCommand[0]); } // finally add program arguments for (int i = 1; i < mainCommand.length; i++) { From 21af87b906abe48c1daba16708b4dd48c0105006 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 6 Sep 2019 08:08:02 +0300 Subject: [PATCH 45/68] - Preparing Forge for Android publish 1.6.28.001. --- forge-gui-android/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile/src/forge/Forge.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 2028698e0aa..93bcc51d651 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.27.001 + 1.6.28.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 49a8543ad94..550be4903b2 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.27.001 + 1.6.28.001 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 6afce5fb824..15f603356ca 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Stack; public class Forge implements ApplicationListener { - public static final String CURRENT_VERSION = "1.6.27.001"; + public static final String CURRENT_VERSION = "1.6.28.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 0f9ed8638b53baf5dfd0b953640be115bb133461 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 6 Sep 2019 13:24:14 +0800 Subject: [PATCH 46/68] Add Silverflame Ritual --- .../game/spellability/SpellAbilityCondition.java | 13 +++++++++++++ .../game/spellability/SpellAbilityVariables.java | 16 ++++++++++++++++ .../cardsfolder/upcoming/silverflame_ritual.txt | 6 ++++++ 3 files changed, 35 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index c53c34bd3ce..aa0b7797540 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -155,6 +155,10 @@ public class SpellAbilityCondition extends SpellAbilityVariables { this.setPresenceCondition(params.get("Presence")); } + if (params.containsKey("ConditionAdamant")) { + this.setAdamantCondition(params.get("ConditionAdamant")); + } + // Condition version of IsPresent stuff if (params.containsKey("ConditionPresent")) { this.setIsPresent(params.get("ConditionPresent")); @@ -264,6 +268,15 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } } + if (!this.getAdamantCondition().isEmpty()) { + if (host.getCastSA() == null) return false; + final String color = this.getAdamantCondition(); + final String payingMana = StringUtils.join(host.getCastSA().getPayingMana()); + if (StringUtils.countMatches(payingMana, MagicColor.toShortString(color)) < 3) { + return false; + } + } + if (this.isAllTargetsLegal()) { for (Card c : sa.getTargets().getTargetCards()) { if (!CardFactoryUtil.isTargetStillValid(sa, c)) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java index 7f8c32e6f74..2378c584822 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java @@ -89,6 +89,7 @@ public class SpellAbilityVariables implements Cloneable { this.targetValidTargeting = sav.getTargetValidTargeting(); this.targetsSingleTarget = sav.targetsSingleTarget(); this.presenceCondition = sav.getPresenceCondition(); + this.adamantCondition = sav.getAdamantCondition(); } // default values for Sorcery speed abilities @@ -200,6 +201,8 @@ public class SpellAbilityVariables implements Cloneable { /** The Presence keyword value containing the relevant condition */ private String presenceCondition = ""; + /** The Adamant keyword value containing the relevant condition */ + private String adamantCondition = ""; /** *

* Setter for the field manaSpent. @@ -943,4 +946,17 @@ public class SpellAbilityVariables implements Cloneable { public void setPresenceCondition(String s) { this.presenceCondition = s; } + /** + * @return the condition from the Adamant keyword, empty if keyword is absent + */ + public String getAdamantCondition() { + return this.adamantCondition; + } + + /** + * @param s the condition from the Adamant keyword + */ + public void setAdamantCondition(String s) { + this.adamantCondition = s; + } } // end class SpellAbilityVariables diff --git a/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt b/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt new file mode 100644 index 00000000000..e9504a07e7e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt @@ -0,0 +1,6 @@ +Name:Silverflame Ritual +ManaCost:3 W +Types:Sorcery +A:SP$ PutCounterAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPumpAll | SpellDescription$ Put a +1/+1 counter on each creature you control. Adamant — If at least three white mana was spent to cast this spell, creatures you control gain vigilance until end of turn. +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionAdamant$ White +Oracle:Put a +1/+1 counter on each creature you control.\nAdamant — If at least three white mana was spent to cast this spell, creatures you control gain vigilance until end of turn. From 56d0982fb150e5975c58247feb71a4833d3754bb Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 6 Sep 2019 13:36:18 +0800 Subject: [PATCH 47/68] Add Slaying Fire --- .../src/main/java/forge/game/ability/AbilityUtils.java | 7 +++++++ forge-gui/res/cardsfolder/upcoming/slaying_fire.txt | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/slaying_fire.txt diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 399515f6755..bf32df071ef 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1623,6 +1623,13 @@ public class AbilityUtils { return count; } + // Count$Adamant... + if (sq[0].startsWith("Adamant")) { + final String payingMana = StringUtils.join(sa.getRootAbility().getPayingMana()); + final boolean adamant = StringUtils.countMatches(payingMana, MagicColor.toShortString(sq[1])) >= 3; + return CardFactoryUtil.doXMath(Integer.parseInt(sq[adamant ? 2 : 3]), expr, c); + } + if (l[0].startsWith("LastStateBattlefield")) { final String[] k = l[0].split(" "); CardCollectionView list = null; diff --git a/forge-gui/res/cardsfolder/upcoming/slaying_fire.txt b/forge-gui/res/cardsfolder/upcoming/slaying_fire.txt new file mode 100644 index 00000000000..8476797dfaa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slaying_fire.txt @@ -0,0 +1,6 @@ +Name:Slaying Fire +ManaCost:2 R +Types:Instant +A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals 3 damage to any target. Adamant — If at least three red mana was spent to cast this spell, it deals 4 damage instead. +SVar:X:Count$Adamant.Red.4.3 +Oracle:Slaying Fire deals 3 damage to any target.\nAdamant — If at least three red mana was spent to cast this spell, it deals 4 damage instead. From 3747a05927398cf152f1ef79406833a48be68754 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 6 Sep 2019 06:24:46 +0000 Subject: [PATCH 48/68] change Half-width to full-width symbol --- forge-gui/res/languages/cn-ZH.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/languages/cn-ZH.properties b/forge-gui/res/languages/cn-ZH.properties index 52fd1fbef33..20eb6e71990 100644 --- a/forge-gui/res/languages/cn-ZH.properties +++ b/forge-gui/res/languages/cn-ZH.properties @@ -494,7 +494,7 @@ lblColors=颜色 lblnoSettings=没有可用于此选择的设置 lblDistribution=分配 lblHoverforDescription=将鼠标悬停在每个选项上以获得更详细的说明 -lblradBalanced="均衡"将在每种选定的颜色中提供数量均衡的卡牌。 +lblradBalanced=“均衡”将在每种选定的颜色中提供数量均衡的卡牌。 lblradRandom=“随机”将随机分配卡牌和颜色。 lblradSurpriseMe=随机挑选颜色并提供数量均衡的随机卡牌。 lblradBoosters=忽略所有颜色设置,从指定数量的补充包中生成牌池 From 42bfb40eae4d32cd61a24f55915b2ca96c46bf3b Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 6 Sep 2019 06:43:19 +0000 Subject: [PATCH 49/68] change half-width to full-width symbol --- forge-gui/res/languages/cn-ZH.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/languages/cn-ZH.properties b/forge-gui/res/languages/cn-ZH.properties index 20eb6e71990..8f96e54bcac 100644 --- a/forge-gui/res/languages/cn-ZH.properties +++ b/forge-gui/res/languages/cn-ZH.properties @@ -550,7 +550,7 @@ lblNetCommanderDecks=网络指挥官套牌 lblSolve=解谜 lblPuzzleModeSolve=谜题模式:解谜 #VSubmenuPuzzleCreate.java -lblPuzzleModeCreate=谜题模式:创建 +lblPuzzleModeCreate=谜题模式:创建 lblCreate=创建 #VSubmenuGauntletLoad.java lblQuickGauntlets=快速决斗 @@ -613,7 +613,7 @@ lblVisitTheSpellShop=参观卡牌商店 lblVisitTheBazaar=参观珍宝集市 lblUnlockEditions=解锁新的时空 lblUnlocked=你已经成功解锁%n -titleUnlocked=%n解锁! +titleUnlocked=%n解锁! lblStartADuel=开始决斗! lblSelectAQuestDeck=请选择一个冒险套牌。 lblInvalidDeck=错误的套牌 From 87b2311fd6dcbae9426bfcaa7ec30b1684332fc3 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 6 Sep 2019 07:32:04 +0000 Subject: [PATCH 50/68] if generate common chinese characters,many mobile phones stuck in generate image(if font file exists chinese characters). try only generate what is currently used. --- .../src/forge/assets/FSkinFont.java | 138 +++--------------- 1 file changed, 24 insertions(+), 114 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinFont.java b/forge-gui-mobile/src/forge/assets/FSkinFont.java index 5da5896c204..8c81f050161 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinFont.java +++ b/forge-gui-mobile/src/forge/assets/FSkinFont.java @@ -187,120 +187,30 @@ public class FSkinFont { //only generate images for characters that could be used by Forge String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"!?'.,;:()[]{}<>|/@\\^$-%+=#_&*\u2014\u2022"; chars += "ÁÉÍÓÚáéíóúÀÈÌÒÙàèìòùÑñÄËÏÖÜäëïöüẞß"; - //common chinese charsets - chars += "阿啊哎哀唉埃挨癌矮艾爱碍安氨俺岸按案暗昂凹熬傲奥澳八巴叭吧拔把" - + "坝爸罢霸白百柏摆败拜班般颁斑搬板版办半伴扮瓣邦帮膀傍棒包胞宝饱" - + "保堡报抱豹暴爆卑杯悲碑北贝备背倍被辈奔本崩逼鼻比彼笔币必毕闭辟" - + "碧蔽壁避臂边编蝙鞭扁便变遍辨辩标表别宾滨冰兵丙柄饼并病拨波玻剥" - + "播脖伯驳泊勃博搏膊薄卜补捕不布步部擦猜才材财裁采彩踩菜蔡参餐残" - + "蚕惨灿仓苍舱藏操曹槽草册侧测策层叉插查茶察差拆柴缠产阐颤昌长肠" - + "尝偿常厂场畅倡唱抄超巢朝潮吵炒车扯彻撤尘臣沉陈闯衬称趁撑成呈承" - + "诚城乘惩程橙吃池驰迟持匙尺齿斥赤翅充冲虫崇抽仇绸愁筹酬丑瞅臭出" - + "初除厨础储楚处触川穿传船喘串窗床晨创吹垂锤春纯唇醇词瓷慈辞磁雌" - + "此次刺从匆葱聪丛凑粗促催脆翠村存寸措错搭达答打大呆代带待袋逮戴" - + "丹单担胆旦但诞弹淡蛋氮当挡党荡刀导岛倒蹈到盗道稻得德的灯登等邓" - + "凳瞪低堤滴迪敌笛底抵地弟帝递第颠典点电店垫淀殿雕吊钓调掉爹跌叠" - + "蝶丁叮盯钉顶订定丢东冬懂动冻洞都斗抖陡豆督毒读独堵赌杜肚度渡端" - + "短段断锻堆队对吨敦蹲盾顿多夺朵躲俄鹅额恶饿鳄恩儿而尔耳二发乏伐" - + "罚阀法帆番翻凡烦繁反返犯泛饭范贩方坊芳防妨房肪仿访纺放飞非啡菲" - + "肥废沸肺费分纷芬坟粉份奋愤粪丰风枫封疯峰锋蜂冯逢缝凤奉佛否夫肤" - + "孵弗伏扶服浮符幅福辐蝠抚府辅腐父付妇负附复赴副傅富赋腹覆该改钙" - + "盖溉概干甘杆肝赶敢感刚岗纲缸钢港高搞稿告戈哥胳鸽割歌阁革格葛隔" - + "个各给根跟更耕工弓公功攻供宫恭巩拱共贡勾沟钩狗构购够估咕姑孤菇" - + "古谷股骨鼓固故顾瓜刮挂拐怪关观官冠馆管贯惯灌罐光广归龟规硅轨鬼" - + "柜贵桂滚棍郭锅国果裹过哈孩海害含函寒韩罕喊汉汗旱杭航毫豪好号浩" - + "耗呵喝合何和河核荷盒贺褐赫鹤黑嘿痕很狠恨哼恒横衡轰哄红宏洪虹鸿" - + "侯喉猴吼后厚候乎呼忽狐胡壶湖葫糊蝴虎互户护花华哗滑化划画话桦怀" - + "淮坏欢还环缓幻唤换患荒慌皇黄煌晃灰恢挥辉徽回毁悔汇会绘惠慧昏婚" - + "浑魂混活火伙或货获祸惑霍击饥圾机肌鸡积基迹绩激及吉级即极急疾集" - + "辑籍几己挤脊计记纪忌技际剂季既济继寂寄加夹佳家嘉甲贾钾价驾架假" - + "嫁稼尖坚间肩艰兼监减剪检简碱见件建剑健舰渐践鉴键箭江姜将浆僵疆" - + "讲奖蒋匠降交郊娇浇骄胶焦礁角脚搅叫轿较教阶皆接揭街节劫杰洁结捷" - + "截竭姐解介戒届界借巾今斤金津筋仅紧锦尽劲近进晋浸禁京经茎惊晶睛" - + "精鲸井颈景警净径竞竟敬境静镜纠究九久酒旧救就舅居局菊橘举矩句巨" - + "拒具俱剧惧据距聚卷倦决绝觉掘嚼军君均菌俊峻卡开凯慨刊堪砍看康抗" - + "炕考烤靠科棵颗壳咳可渴克刻客课肯坑空孔恐控口扣枯哭苦库裤酷夸跨" - + "块快宽款狂况矿亏葵愧溃昆困扩括阔垃拉啦喇腊蜡辣来莱赖兰拦栏蓝篮" - + "览懒烂滥郎狼廊朗浪捞劳牢老乐勒雷蕾泪类累冷愣厘梨离莉犁璃黎礼李" - + "里哩理鲤力历厉立丽利励例隶粒俩连帘怜莲联廉脸练炼恋链良凉梁粮两" - + "亮辆量辽疗聊僚了料列劣烈猎裂邻林临淋磷灵玲凌铃陵羚零龄领岭令另" - + "溜刘流留硫瘤柳六龙笼隆垄拢楼漏露卢芦炉鲁陆录鹿碌路驴旅铝履律虑" - + "率绿氯滤卵乱掠略伦轮论罗萝逻螺裸洛络骆落妈麻马玛码蚂骂吗嘛埋买" - + "迈麦卖脉蛮满曼慢漫忙芒盲茫猫毛矛茅茂冒贸帽貌么没枚玫眉梅媒煤霉" - + "每美妹门闷们萌盟猛蒙孟梦弥迷谜米泌秘密蜜眠绵棉免勉面苗描秒妙庙" - + "灭民敏名明鸣命摸模膜摩磨蘑魔抹末沫陌莫漠墨默谋某母亩牡姆拇木目" - + "牧墓幕慕穆拿哪内那纳娜钠乃奶奈耐男南难囊恼脑闹呢嫩能尼泥你拟逆" - + "年念娘酿鸟尿捏您宁凝牛扭纽农浓弄奴努怒女暖挪诺哦欧偶爬帕怕拍排" - + "牌派攀盘判叛盼庞旁胖抛炮跑泡胚陪培赔佩配喷盆朋棚蓬鹏膨捧碰批披" - + "皮疲脾匹屁譬片偏篇骗漂飘瓢票拼贫频品平评凭苹屏瓶萍坡泼颇婆迫破" - + "剖扑铺葡蒲朴浦普谱七妻栖戚期欺漆齐其奇歧骑棋旗企岂启起气弃汽契" - + "砌器恰千迁牵铅谦签前钱潜浅遣欠枪腔强墙抢悄敲乔桥瞧巧切茄且窃亲" - + "侵秦琴禽勤青氢轻倾清情晴顷请庆穷丘秋蚯求球区曲驱屈躯趋取娶去趣" - + "圈全权泉拳犬劝券缺却雀确鹊裙群然燃染嚷壤让饶扰绕惹热人仁忍认任" - + "扔仍日绒荣容溶熔融柔肉如儒乳辱入软锐瑞润若弱撒洒萨塞赛三伞散桑" - + "嗓丧扫嫂色森僧杀沙纱刹砂傻啥晒山杉衫珊闪陕扇善伤商赏上尚梢烧稍" - + "少绍哨舌蛇舍设社射涉摄申伸身深神审婶肾甚渗慎升生声牲胜绳省圣盛" - + "剩尸失师诗施狮湿十什石时识实拾蚀食史使始驶士氏世市示式事侍势视" - + "试饰室是适逝释收手守首寿受兽售授瘦书抒叔枢殊疏舒输蔬熟暑署属鼠" - + "薯术束述树竖数刷耍衰摔甩帅双霜爽谁水税睡顺瞬说丝司私思斯撕死四" - + "寺似饲松耸宋送颂搜艘苏俗诉肃素速宿塑酸蒜算虽随髓岁遂碎穗孙损笋" - + "缩所索锁他它她塌塔踏胎台抬太态泰贪摊滩坛谈潭坦叹炭探碳汤唐堂塘" - + "糖躺趟涛掏逃桃陶淘萄讨套特疼腾藤梯踢啼提题蹄体替天添田甜填挑条" - + "跳贴铁厅听廷亭庭停蜓挺艇通同桐铜童统桶筒痛偷头投透突图徒涂途屠" - + "土吐兔团推腿退吞托拖脱驼妥拓唾挖哇蛙娃瓦歪外弯湾丸完玩顽挽晚碗" - + "万汪亡王网往忘旺望危威微为围违唯惟维伟伪尾纬委萎卫未位味胃谓喂" - + "慰魏温文纹闻蚊吻稳问翁窝我沃卧握乌污屋无吴吾五午伍武舞务物误悟" - + "雾夕西吸希析息牺悉惜晰稀溪锡熙嘻膝习席袭媳洗喜戏系细隙虾瞎峡狭" - + "辖霞下吓夏厦仙先纤掀鲜闲弦贤咸衔嫌显险县现线限宪陷献腺乡相香厢" - + "湘箱详祥翔享响想向巷项象像橡削消萧硝销小晓孝效校笑些歇协胁斜谐" - + "携鞋写泄泻卸屑械谢蟹心辛欣新信兴星猩刑行形型醒杏姓幸性凶兄匈胸" - + "雄熊休修羞朽秀绣袖嗅须虚需徐许序叙畜绪续蓄宣玄悬旋选穴学雪血寻" - + "巡询循训讯迅压呀鸦鸭牙芽崖哑雅亚咽烟淹延严言岩沿炎研盐颜衍掩眼" - + "演厌宴艳验焰雁燕央扬羊阳杨洋仰养氧痒样腰邀摇遥咬药要耀爷也冶野" - + "业叶页夜液一伊衣医依仪夷宜姨移遗疑乙已以矣蚁椅义亿忆艺议亦异役" - + "抑译易疫益谊逸意溢毅翼因阴音吟银引饮蚓隐印应英婴鹰迎盈营蝇赢影" - + "映硬哟拥永泳勇涌用优忧幽悠尤犹由邮油游友有又右幼诱于予余鱼娱渔" - + "愉愚与宇羽雨语玉吁育郁狱浴预域欲喻寓御裕遇愈誉豫元员园原圆袁援" - + "缘源远怨院愿曰约月岳钥悦阅跃越云匀允孕运晕韵蕴杂砸灾栽宰载再在" - + "咱暂赞脏葬遭糟早枣藻灶皂造噪燥躁则择泽责贼怎曾增赠渣扎眨炸摘宅" - + "窄债沾粘展占战站张章涨掌丈仗帐胀账障招找召兆赵照罩遮折哲者这浙" - + "针侦珍真诊枕阵振镇震争征挣睁蒸整正证郑政症之支汁芝枝知织肢脂蜘" - + "执直值职植殖止只旨址纸指趾至志制治质致智置中忠终钟肿种仲众重州" - + "舟周洲轴宙皱骤朱株珠诸猪蛛竹烛逐主煮嘱住助注贮驻柱祝著筑抓爪专" - + "砖转赚庄桩装壮状撞追准捉桌着仔兹姿资滋籽子紫字自宗综棕踪总纵走" - + "奏租足族阻组祖钻嘴最罪醉尊遵昨左作坐座做蔼隘庵鞍黯肮拗袄懊扒芭" - + "疤捌跋靶掰扳拌绊梆绑榜蚌谤磅镑苞褒雹鲍狈悖惫笨绷泵蹦匕鄙庇毙痹" - + "弊璧贬匾辫彪憋鳖瘪彬斌缤濒鬓秉禀菠舶渤跛簸哺怖埠簿睬惭沧糙厕蹭" - + "茬岔豺掺搀禅馋蝉铲猖敞钞嘲澈忱辰铛澄逞秤痴弛侈耻宠畴稠锄雏橱矗" - + "揣囱疮炊捶椿淳蠢戳绰祠赐醋簇窜篡崔摧悴粹搓撮挫瘩歹怠贷耽档叨捣" - + "祷悼蹬嘀涤缔蒂掂滇巅碘佃甸玷惦奠刁叼迭谍碟鼎董栋兜蚪逗痘睹妒镀" - + "缎兑墩盹囤钝咄哆踱垛堕舵惰跺讹娥峨蛾扼鄂愕遏噩饵贰筏矾妃匪诽吠" - + "吩氛焚忿讽敷芙拂俘袱甫斧俯脯咐缚尬丐柑竿尴秆橄赣冈肛杠羔膏糕镐" - + "疙搁蛤庚羹埂耿梗蚣躬汞苟垢沽辜雇寡卦褂乖棺逛闺瑰诡癸跪亥骇酣憨" - + "涵悍捍焊憾撼翰夯嚎皓禾烘弘弧唬沪猾徊槐宦涣焕痪凰惶蝗簧恍谎幌卉" - + "讳诲贿晦秽荤豁讥叽唧缉畸箕稽棘嫉妓祭鲫冀颊奸歼煎拣俭柬茧捡荐贱" - + "涧溅槛缰桨酱椒跤蕉侥狡绞饺矫剿缴窖酵秸睫芥诫藉襟谨荆兢靖窘揪灸" - + "玖韭臼疚拘驹鞠桔沮炬锯娟捐鹃绢眷诀倔崛爵钧骏竣咖揩楷勘坎慷糠扛" - + "亢拷铐坷苛磕蝌垦恳啃吭抠叩寇窟垮挎筷筐旷框眶盔窥魁馈坤捆廓睐婪" - + "澜揽缆榄琅榔唠姥涝烙酪垒磊肋擂棱狸漓篱吏沥俐荔栗砾痢雳镰敛粱谅" - + "晾寥嘹撩缭瞭咧琳鳞凛吝赁躏拎伶聆菱浏琉馏榴咙胧聋窿娄搂篓陋庐颅" - + "卤虏赂禄吕侣屡缕峦抡仑沦啰锣箩骡蟆馒瞒蔓莽锚卯昧媚魅氓朦檬锰咪" - + "靡眯觅缅瞄渺藐蔑皿闽悯冥铭谬馍摹茉寞沐募睦暮捺挠瑙呐馁妮匿溺腻" - + "捻撵碾聂孽拧狞柠泞钮脓疟虐懦糯殴鸥呕藕趴啪耙徘湃潘畔乓螃刨袍沛" - + "砰烹彭澎篷坯劈霹啤僻翩撇聘乒坪魄仆菩圃瀑曝柒凄祈脐崎鳍乞迄泣掐" - + "洽钳乾黔谴嵌歉呛跷锹侨憔俏峭窍翘撬怯钦芹擒寝沁卿蜻擎琼囚岖渠痊" - + "瘸冉瓤壬刃纫韧戎茸蓉榕冗揉蹂蠕汝褥蕊闰腮叁搔骚臊涩瑟鲨煞霎筛删" - + "煽擅赡裳晌捎勺奢赦呻绅沈笙甥矢屎恃拭柿嗜誓梳淑赎蜀曙恕庶墅漱蟀" - + "拴栓涮吮烁硕嗽嘶巳伺祀肆讼诵酥粟溯隋祟隧唆梭嗦琐蹋苔汰瘫痰谭檀" - + "毯棠膛倘淌烫滔誊剔屉剃涕惕恬舔迢帖彤瞳捅凸秃颓蜕褪屯豚臀驮鸵椭" - + "洼袜豌宛婉惋皖腕枉妄偎薇巍帷苇畏尉猬蔚瘟紊嗡涡蜗呜巫诬芜梧蜈侮" - + "捂鹉勿戊昔犀熄蟋徙匣侠暇馅羡镶宵潇箫霄嚣淆肖哮啸蝎邪挟懈芯锌薪" - + "馨衅腥汹锈戌墟旭恤酗婿絮轩喧癣炫绚渲靴薛勋熏旬驯汛逊殉丫押涯衙" - + "讶焉阎蜒檐砚唁谚堰殃秧鸯漾夭吆妖尧肴姚窑谣舀椰腋壹怡贻胰倚屹邑" - + "绎姻茵荫殷寅淫瘾莺樱鹦荧莹萤颖佣庸咏踊酉佑迂淤渝隅逾榆舆屿禹芋" - + "冤鸳渊猿苑粤耘陨酝哉赃凿蚤澡憎咋喳轧闸乍诈栅榨斋寨毡瞻斩盏崭辗" - + "栈绽彰樟杖昭沼肇辙蔗贞斟疹怔狰筝拯吱侄帜挚秩掷窒滞稚衷粥肘帚咒" - + "昼拄瞩蛀铸拽撰妆幢椎锥坠缀赘谆卓拙灼茁浊酌啄琢咨姊揍卒佐佘赊"; + //generate from zh-CN.properties + chars += "“”、一三上下不与专且东两个中临为主么义之乐也了争事二于五些交产" + + "亮人什仅从他付代以们件价任优会传伤但位低住体何作你使例供侧侵便" + + "保信倍候值偏做停偿像允元充先克入全关其具兼兽内再冒决况准减凑几" + + "出击分切列则创初删利到制刷前剪副力功加动助励势包化匹区十协单卖" + + "博卡印即原去参双发取受变叠口句只召可台史右号司合同名后向吗否含" + + "启告员周命和咒品哪唤售商喜器回因团困围图在地场均坊坏坟型域基堆" + + "塞境墓增声处备复多大天太失头夹奇奖套好如始子字存它完宏官定宝实" + + "宠客害家容对导将小少尝就局层屏展属巅左差已市布带帮常幕并幻序库" + + "应底店度建开异弊式引张弧强当录形征很得御徽必志快忽态性总恢息您" + + "悬情惊惰想意慢戏成我或战户所手才打执找把抓抗折报拉拟拥择括持指" + + "按挑挡挥损换据捷排探接控掷描提摩摸撤播操擎支收改攻放故效数文斗" + + "斯新方旅无日旧时明易星是显景暂暴更替最有服期未本术机权束来杯松" + + "板构果柄染查标栏样格框档检植模次止正此死殊段每比池没法注洗洛活" + + "测消涵混添清渐温渲游源滤灵灼点烁烧然片版牌物特状独率王玩环现珍" + + "理瓦生用由画界留略登白百的盒盖盘目直相省看着瞄瞬知破确磨示神票" + + "禁离种秘积称移稀程空窗立竞章第等筑筛简管箭类精系素索紧红级线组" + + "细终经结给络统继绩续维绿缓编缩缺网置者而联肥背胜能脚自至致舒航" + + "般艇色节英范莫获菜蓝薪藏行衍衡补表被西要覆观规视览觉角解触言誓" + + "警计认让记许论设证评试诗诡该详语误说请读调谋谜象败费资赌赛赢起" + + "距跳踢转轮轻载较辑输辨边过运近返还这进远连述退适选逐递速造道那" + + "部都配醒释里重量金钮铁银销锁锋错锦键长门闪闭间队防阴阶阻限除险" + + "隆随隐障难雄集雪需静非靠面音页顶项顺须顿预题颜风飞首验骰高魔鹏" + + "黑默鼠!(),:?" final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false); final FreeTypeFontParameter parameter = new FreeTypeFontParameter(); parameter.characters = chars; From b487cdc1e3c18b3eb4e8d5cde1299c1bff3fd228 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 6 Sep 2019 07:36:45 +0000 Subject: [PATCH 51/68] rename to ISO 639 name --- forge-gui/res/languages/{cn-ZH.properties => zh-CN.properties} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/languages/{cn-ZH.properties => zh-CN.properties} (100%) diff --git a/forge-gui/res/languages/cn-ZH.properties b/forge-gui/res/languages/zh-CN.properties similarity index 100% rename from forge-gui/res/languages/cn-ZH.properties rename to forge-gui/res/languages/zh-CN.properties From ca4926f9b4bbc8c22d50ffd8246f3fc8d406370b Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 6 Sep 2019 09:18:23 +0000 Subject: [PATCH 52/68] fix miss ';' --- forge-gui-mobile/src/forge/assets/FSkinFont.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinFont.java b/forge-gui-mobile/src/forge/assets/FSkinFont.java index 8c81f050161..4cec472b453 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinFont.java +++ b/forge-gui-mobile/src/forge/assets/FSkinFont.java @@ -210,7 +210,7 @@ public class FSkinFont { + "距跳踢转轮轻载较辑输辨边过运近返还这进远连述退适选逐递速造道那" + "部都配醒释里重量金钮铁银销锁锋错锦键长门闪闭间队防阴阶阻限除险" + "隆随隐障难雄集雪需静非靠面音页顶项顺须顿预题颜风飞首验骰高魔鹏" - + "黑默鼠!(),:?" + + "黑默鼠!(),:?"; final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false); final FreeTypeFontParameter parameter = new FreeTypeFontParameter(); parameter.characters = chars; From b4a7a9a3ca4e1069fc14ea9ef62a6b7aa3780acd Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 6 Sep 2019 20:04:07 +0800 Subject: [PATCH 53/68] Changed the template of Embereth Paladin --- forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt index 456f35744c0..b76ada65fcd 100644 --- a/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt +++ b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt @@ -3,5 +3,7 @@ ManaCost:3 R Types:Creature Human Knight PT:4/1 K:Haste -K:etbCounter:P1P1:1:Adamant$ Red:Adamant — If at least three red mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Adamant$ Red | ReplaceWith$ ETBAddCounter | Description$ Adamant — If at least three red mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +SVar:ETBAddCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard Oracle:Haste\nAdamant — If at least three red mana was spent to cast this spell, Embereth Paladin enters the battlefield with a +1/+1 counter on it. From b3ad92530cf84b67d55aff739c6f6f73a68b6e37 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 6 Sep 2019 20:51:33 +0800 Subject: [PATCH 54/68] Fix scaling of background when zoomed in multiplayer mode --- forge-gui-mobile/src/forge/screens/match/MatchScreen.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 3a07b5d0aca..945f470ebae 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -506,7 +506,8 @@ public class MatchScreen extends FScreen { float y = midField - topPlayerPanel.getField().getHeight(); float w = getWidth() - x; float bgFullWidth, scaledbgHeight; - float bgHeight = midField + bottomPlayerPanel.getField().getHeight() - y; + int multiplier = playerPanels.keySet().size() - 1; //fix scaling of background when zoomed in multiplayer + float bgHeight = (midField + bottomPlayerPanel.getField().getHeight() * multiplier) - y; if(FModel.getPreferences().getPrefBoolean(FPref.UI_DYNAMIC_PLANECHASE_BG) && hasActivePlane()) { String imageName = getPlaneName() From e8e115ae1acecacd9e79d23b183dd9f472728e18 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 6 Sep 2019 20:51:55 +0800 Subject: [PATCH 55/68] Use a simple template for Silverflame Ritual --- .../game/spellability/SpellAbilityCondition.java | 13 ------------- .../game/spellability/SpellAbilityVariables.java | 16 ---------------- .../cardsfolder/upcoming/silverflame_ritual.txt | 3 ++- 3 files changed, 2 insertions(+), 30 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index aa0b7797540..c53c34bd3ce 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -155,10 +155,6 @@ public class SpellAbilityCondition extends SpellAbilityVariables { this.setPresenceCondition(params.get("Presence")); } - if (params.containsKey("ConditionAdamant")) { - this.setAdamantCondition(params.get("ConditionAdamant")); - } - // Condition version of IsPresent stuff if (params.containsKey("ConditionPresent")) { this.setIsPresent(params.get("ConditionPresent")); @@ -268,15 +264,6 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } } - if (!this.getAdamantCondition().isEmpty()) { - if (host.getCastSA() == null) return false; - final String color = this.getAdamantCondition(); - final String payingMana = StringUtils.join(host.getCastSA().getPayingMana()); - if (StringUtils.countMatches(payingMana, MagicColor.toShortString(color)) < 3) { - return false; - } - } - if (this.isAllTargetsLegal()) { for (Card c : sa.getTargets().getTargetCards()) { if (!CardFactoryUtil.isTargetStillValid(sa, c)) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java index 2378c584822..7f8c32e6f74 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java @@ -89,7 +89,6 @@ public class SpellAbilityVariables implements Cloneable { this.targetValidTargeting = sav.getTargetValidTargeting(); this.targetsSingleTarget = sav.targetsSingleTarget(); this.presenceCondition = sav.getPresenceCondition(); - this.adamantCondition = sav.getAdamantCondition(); } // default values for Sorcery speed abilities @@ -201,8 +200,6 @@ public class SpellAbilityVariables implements Cloneable { /** The Presence keyword value containing the relevant condition */ private String presenceCondition = ""; - /** The Adamant keyword value containing the relevant condition */ - private String adamantCondition = ""; /** *

* Setter for the field manaSpent. @@ -946,17 +943,4 @@ public class SpellAbilityVariables implements Cloneable { public void setPresenceCondition(String s) { this.presenceCondition = s; } - /** - * @return the condition from the Adamant keyword, empty if keyword is absent - */ - public String getAdamantCondition() { - return this.adamantCondition; - } - - /** - * @param s the condition from the Adamant keyword - */ - public void setAdamantCondition(String s) { - this.adamantCondition = s; - } } // end class SpellAbilityVariables diff --git a/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt b/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt index e9504a07e7e..7692b568a9b 100644 --- a/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt +++ b/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt @@ -2,5 +2,6 @@ Name:Silverflame Ritual ManaCost:3 W Types:Sorcery A:SP$ PutCounterAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPumpAll | SpellDescription$ Put a +1/+1 counter on each creature you control. Adamant — If at least three white mana was spent to cast this spell, creatures you control gain vigilance until end of turn. -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionAdamant$ White +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionCheckSVar$ X | References$ X +SVar:X:Count$Adamant.White.1.0 Oracle:Put a +1/+1 counter on each creature you control.\nAdamant — If at least three white mana was spent to cast this spell, creatures you control gain vigilance until end of turn. From 3269d3fd9d6c6bc78ea4f54c147311cccdf12e8d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 6 Sep 2019 21:41:05 +0800 Subject: [PATCH 56/68] Fix gameview when there is no human player --- forge-gui/src/main/java/forge/match/HostedMatch.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/src/main/java/forge/match/HostedMatch.java b/forge-gui/src/main/java/forge/match/HostedMatch.java index 47b8c57d93c..fa57ea0a654 100644 --- a/forge-gui/src/main/java/forge/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/match/HostedMatch.java @@ -202,6 +202,7 @@ public class HostedMatch { if (humanCount == 0) { //watch game but do not participate final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); + gui.setGameView(null); //clear the view so when the game restarts again, it updates correctly gui.setGameView(gameView); final PlayerControllerHuman humanController = new WatchLocalGame(game, new LobbyPlayerHuman("Spectator"), gui); From 11d3433b5fc40edb35aba3dfb99d7b4838729a94 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 6 Sep 2019 21:59:12 +0800 Subject: [PATCH 57/68] Fix Garruk's name --- ...{garruk_cursed_hunstman.txt => garruk_cursed_huntsman.txt} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename forge-gui/res/cardsfolder/upcoming/{garruk_cursed_hunstman.txt => garruk_cursed_huntsman.txt} (96%) diff --git a/forge-gui/res/cardsfolder/upcoming/garruk_cursed_hunstman.txt b/forge-gui/res/cardsfolder/upcoming/garruk_cursed_huntsman.txt similarity index 96% rename from forge-gui/res/cardsfolder/upcoming/garruk_cursed_hunstman.txt rename to forge-gui/res/cardsfolder/upcoming/garruk_cursed_huntsman.txt index 88d6d1c66ea..b5decbca13e 100644 --- a/forge-gui/res/cardsfolder/upcoming/garruk_cursed_hunstman.txt +++ b/forge-gui/res/cardsfolder/upcoming/garruk_cursed_huntsman.txt @@ -1,4 +1,4 @@ -Name:Garruk, Cursed Hunstman +Name:Garruk, Cursed Huntsman Types:Legendary Planeswalker Garruk ManaCost:4 B G Loyalty:5 @@ -8,4 +8,4 @@ SVar:DBDraw:DB$ Draw | NumCards$ 1 A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Name$ Emblem - Garruk, Cursed Hunstman | Image$ emblem_garruk_cursed_hunstman | StaticAbilities$ STTrample | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +3/+3 and have trample." SVar:STTrample:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Trample | AddPower$ 3 | AddToughness$ 3 | Description$ Creatures you control get +3/+3 and have trample. DeckHas:Ability$Token -Oracle:[0]: Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control."\n[-3]: Destroy target creature. Draw a card.\n:[-6]: You get an emblem with "Creatures you control get +3/+3 and have trample." \ No newline at end of file +Oracle:[0]: Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control."\n[-3]: Destroy target creature. Draw a card.\n:[-6]: You get an emblem with "Creatures you control get +3/+3 and have trample." From c1d5cfa27e6a527fed17c7aa7f65821f04cbc867 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 6 Sep 2019 22:13:59 +0800 Subject: [PATCH 58/68] Fix highlight of Planar Conquest start button instead of OldQuest header --- .../src/forge/screens/planarconquest/LoadConquestScreen.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java index db590928085..e11ce520ca0 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java @@ -11,6 +11,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Align; import forge.FThreads; +import forge.Forge; import forge.Graphics; import forge.assets.FSkinColor; import forge.assets.FSkinColor.Colors; @@ -148,7 +149,7 @@ public class LoadConquestScreen extends LaunchScreen { @Override protected void drawBackground(Graphics g) { super.drawBackground(g); - float y = getHeader().getBottom(); + float y = Forge.isLandscapeMode() ? 0 : getHeader().getBottom(); g.fillRect(OLD_CONQUESTS_BACK_COLOR, 0, y, lstConquests.getWidth(), lstConquests.getTop() - y); } From 2619f87520ae885e447a1bea9323bfd49fe7e80c Mon Sep 17 00:00:00 2001 From: swordshine Date: Sat, 7 Sep 2019 09:18:43 +0800 Subject: [PATCH 59/68] Fix two cards --- forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt | 2 +- ..._gwyn_hero_of_ashenvale.txt => syr_gwyn_hero_of_ashvale.txt} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename forge-gui/res/cardsfolder/upcoming/{syr_gwyn_hero_of_ashenvale.txt => syr_gwyn_hero_of_ashvale.txt} (95%) diff --git a/forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt b/forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt index d02ad5dae4a..6b4e63b94c7 100644 --- a/forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt +++ b/forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Djinn Monk PT:3/3 K:Prowess S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time. -S:Mode$ Continuous | Affected$ Creature.TopLibrary+YouCtrl+nonLand+nonCreature | AffectedZone$ Library | MayPlay$ True | MayPlayWithFlash$ True | Description$ You may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl+nonLand+nonCreature | AffectedZone$ Library | MayPlay$ True | MayPlayWithFlash$ True | Description$ You may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. Oracle:Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)\nYou may look at the top card of your library any time.\nYou may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashenvale.txt b/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashvale.txt similarity index 95% rename from forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashenvale.txt rename to forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashvale.txt index 43ff964d386..2aca904bcd0 100644 --- a/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashenvale.txt +++ b/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashvale.txt @@ -1,4 +1,4 @@ -Name:Syr Gwyn, Hero of Ashenvale +Name:Syr Gwyn, Hero of Ashvale ManaCost:3 R W B Types:Legendary Creature Human Knight PT:5/5 From a9f367d9de36508d8baec8b170ec9b35e06fb19d Mon Sep 17 00:00:00 2001 From: swordshine Date: Sat, 7 Sep 2019 09:53:21 +0800 Subject: [PATCH 60/68] Add Run Away Together --- forge-gui/res/cardsfolder/upcoming/run_away_together.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/run_away_together.txt diff --git a/forge-gui/res/cardsfolder/upcoming/run_away_together.txt b/forge-gui/res/cardsfolder/upcoming/run_away_together.txt new file mode 100644 index 00000000000..7d039ac73cd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/run_away_together.txt @@ -0,0 +1,5 @@ +Name:Run Away Together +ManaCost:1 U +Types:Instant +A:SP$ ChangeZone | Cost$ 1 U | TargetMin$ 2 | TargetMax$ 2 | TargetsWithDifferentControllers$ True | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Choose two target creatures by different players. Return those creatures to their owners' hands. +Oracle:Choose two target creatures controlled by different players. Return those creatures to their owners' hands. From a0b71d60a1a1e4b46fd06b80fe7e33522446a85a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 7 Sep 2019 22:54:53 +0800 Subject: [PATCH 61/68] Revert Android 8 codes to support older Android phones. Hope I didn't miss any. :) (tested with Android Marshmallow phone with 2gb RAM and mediatek cpu) --- .../main/java/forge/ai/AiBlockController.java | 2 +- .../src/main/java/forge/ai/AiController.java | 4 ++-- .../main/java/forge/ai/AiCostDecision.java | 8 ++++---- .../src/main/java/forge/ai/ComputerUtil.java | 4 ++-- .../main/java/forge/ai/ComputerUtilCard.java | 9 ++++----- .../main/java/forge/ai/ComputerUtilMana.java | 4 ++-- .../src/main/java/forge/ai/SpecialCardAi.java | 16 ++++++++-------- .../java/forge/ai/ability/ChangeZoneAi.java | 2 +- .../main/java/forge/game/CardTraitBase.java | 2 +- forge-game/src/main/java/forge/game/Game.java | 2 +- .../src/main/java/forge/game/GameAction.java | 2 +- .../src/main/java/forge/game/GameFormat.java | 3 ++- .../java/forge/game/GameLogFormatter.java | 4 ++-- .../forge/game/ability/AbilityFactory.java | 4 ++-- .../game/ability/effects/CharmEffect.java | 3 ++- .../src/main/java/forge/game/card/Card.java | 6 +++--- .../main/java/forge/game/card/CardLists.java | 10 +++++----- .../main/java/forge/game/card/CardState.java | 6 +++++- .../src/main/java/forge/game/cost/Cost.java | 3 ++- .../java/forge/game/cost/CostAdjustment.java | 2 +- .../main/java/forge/game/player/Player.java | 4 ++-- .../game/spellability/AbilityManaPart.java | 6 +++--- .../StaticAbilityCantBeCast.java | 2 +- .../StaticAbilityPreventDamage.java | 2 +- .../libs/arm64-v8a/libgdx-freetype.so | Bin 796504 -> 0 bytes forge-gui-android/libs/arm64-v8a/libgdx.so | Bin 170288 -> 0 bytes .../java/forge/gui/ImportSourceAnalyzer.java | 4 ++-- .../java/forge/itemmanager/ItemManager.java | 6 +++++- .../main/java/forge/sound/AltSoundSystem.java | 2 +- .../java/forge/quest/QuestEventDraft.java | 18 +++++++++++++++--- 30 files changed, 81 insertions(+), 59 deletions(-) delete mode 100644 forge-gui-android/libs/arm64-v8a/libgdx-freetype.so delete mode 100644 forge-gui-android/libs/arm64-v8a/libgdx.so diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index 68d0622b1a4..5b2caa36636 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -124,7 +124,7 @@ public class AiBlockController { ComputerUtilCard.sortByEvaluateCreature(attackers); CardLists.sortByPowerDesc(attackers); //move cards like Phage the Untouchable to the front - attackers.sort(new Comparator() { + Collections.sort(attackers, new Comparator() { @Override public int compare(final Card o1, final Card o2) { if (o1.hasSVar("MustBeBlocked") && !o2.hasSVar("MustBeBlocked")) { diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 9a7dbc61048..a027cc9ea1c 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -608,7 +608,7 @@ public class AiController { ComputerUtilAbility.getAvailableCards(game, player); List all = ComputerUtilAbility.getSpellAbilities(cards, player); - all.sort(saComparator); // put best spells first + Collections.sort(all, saComparator); // put best spells first for (final SpellAbility sa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, player)) { ApiType saApi = sa.getApi(); @@ -1571,7 +1571,7 @@ public class AiController { if (all == null || all.isEmpty()) return null; - all.sort(saComparator); // put best spells first + Collections.sort(all, saComparator); // put best spells first for (final SpellAbility sa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, player)) { // Don't add Counterspells to the "normal" playcard lookups diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index ef3d0b509cf..47dfbbd4d4b 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -631,7 +631,7 @@ public class AiCostDecision extends CostDecisionMakerBase { CardPredicates.hasKeyword("Undying")); if (!prefs.isEmpty()) { - prefs.sort(CardPredicates.compareByCounterType(CounterType.P1P1)); + Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.P1P1)); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.P1P1; return result; @@ -642,7 +642,7 @@ public class AiCostDecision extends CostDecisionMakerBase { CardPredicates.hasKeyword("Persist")); if (!prefs.isEmpty()) { - prefs.sort(CardPredicates.compareByCounterType(CounterType.M1M1)); + Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.M1M1)); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.M1M1; return result; @@ -653,7 +653,7 @@ public class AiCostDecision extends CostDecisionMakerBase { CardPredicates.nameEquals("Chronozoa")); if (!prefs.isEmpty()) { - prefs.sort(CardPredicates.compareByCounterType(CounterType.TIME)); + Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.TIME)); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.TIME; return result; @@ -676,7 +676,7 @@ public class AiCostDecision extends CostDecisionMakerBase { return crd.getCounters(CounterType.QUEST) >= e + c; } }); - prefs.sort(Collections.reverseOrder(CardPredicates.compareByCounterType(CounterType.QUEST))); + Collections.sort(prefs, Collections.reverseOrder(CardPredicates.compareByCounterType(CounterType.QUEST))); PaymentDecision result = PaymentDecision.card(prefs); result.ct = CounterType.QUEST; return result; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 1d5d4eb26e1..a5de6d50c5f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2196,8 +2196,8 @@ public class ComputerUtil { } } } - - goodChoices.sort(CardLists.TextLenComparator); + + Collections.sort(goodChoices, CardLists.TextLenComparator); CardLists.sortByCmcDesc(goodChoices); dChoices.add(goodChoices.get(0)); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index db112c4f973..bb8bc575f55 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -70,7 +70,7 @@ public class ComputerUtilCard { * @param list */ public static void sortByEvaluateCreature(final CardCollection list) { - list.sort(ComputerUtilCard.EvaluateCreatureComparator); + Collections.sort(list, ComputerUtilCard.EvaluateCreatureComparator); } // sortByEvaluateCreature() // The AI doesn't really pick the best artifact, just the most expensive. @@ -390,7 +390,7 @@ public class ComputerUtilCard { if (!Iterables.isEmpty(list)) { CardCollection cc = CardLists.filter(new CardCollection(list), Predicates.or(CardPredicates.isType("Instant"), CardPredicates.isType("Sorcery"))); - cc.sort(CardLists.CmcComparatorInv); + Collections.sort(cc, CardLists.CmcComparatorInv); if (cc.isEmpty()) { return null; @@ -802,9 +802,8 @@ public class ComputerUtilCard { if (color.hasGreen()) map.get(4).setValue(Integer.valueOf(map.get(4).getValue()+1)); } // for - map.sort(new Comparator>() { - @Override - public int compare(Pair o1, Pair o2) { + Collections.sort(map, new Comparator>() { + @Override public int compare(Pair o1, Pair o2) { return o2.getValue() - o1.getValue(); } }); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 1972cac990e..1a1b9fc6df5 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -128,7 +128,7 @@ public class ComputerUtilMana { } } } - orderedCards.sort(new Comparator() { + Collections.sort(orderedCards, new Comparator() { @Override public int compare(final Card card1, final Card card2) { return Integer.compare(manaCardMap.get(card1), manaCardMap.get(card2)); @@ -151,7 +151,7 @@ public class ComputerUtilMana { System.out.println("Unsorted Abilities: " + newAbilities); } - newAbilities.sort(new Comparator() { + Collections.sort(newAbilities, new Comparator() { @Override public int compare(final SpellAbility ability1, final SpellAbility ability2) { int preOrder = orderedCards.indexOf(ability1.getHostCard()) - orderedCards.indexOf(ability2.getHostCard()); diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 18750349f53..27700e2455b 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -579,7 +579,7 @@ public class SpecialCardAi { int changeNum = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("ChangeNum"), sa); CardCollection lib = CardLists.filter(ai.getCardsIn(ZoneType.Library), Predicates.not(CardPredicates.nameEquals(sa.getHostCard().getName()))); - lib.sort(CardLists.CmcComparatorInv); + Collections.sort(lib, CardLists.CmcComparatorInv); // Additional cards which are difficult to auto-classify but which are generally good to Intuition for List highPriorityNamedCards = Lists.newArrayList("Accumulated Knowledge", "Take Inventory"); @@ -679,7 +679,7 @@ public class SpecialCardAi { // If we're playing Reanimator, we're really interested just in the highest CMC spells, not the // ones we necessarily have multiples of if (ComputerUtil.isPlayingReanimator(ai)) { - libHighPriorityList.sort(CardLists.CmcComparatorInv); + Collections.sort(libHighPriorityList, CardLists.CmcComparatorInv); } // Otherwise, try to grab something that is hopefully decent to grab, in priority order @@ -1173,7 +1173,7 @@ public class SpecialCardAi { if (atTargetCMCInLib.isEmpty()) { atTargetCMCInLib = CardLists.filter(creatsInLib, CardPredicates.greaterCMC(numManaSrcs)); } - atTargetCMCInLib.sort(CardLists.CmcComparatorInv); + Collections.sort(atTargetCMCInLib, CardLists.CmcComparatorInv); if (atTargetCMCInLib.isEmpty()) { // Nothing to aim for? return null; @@ -1181,11 +1181,11 @@ public class SpecialCardAi { // Cards in hand that are below the max CMC affordable by the AI CardCollection belowMaxCMC = CardLists.filter(creatsInHand, CardPredicates.lessCMC(numManaSrcs - 1)); - belowMaxCMC.sort(Collections.reverseOrder(CardLists.CmcComparatorInv)); + Collections.sort(belowMaxCMC, Collections.reverseOrder(CardLists.CmcComparatorInv)); // Cards in hand that are above the max CMC affordable by the AI CardCollection aboveMaxCMC = CardLists.filter(creatsInHand, CardPredicates.greaterCMC(numManaSrcs + 1)); - aboveMaxCMC.sort(CardLists.CmcComparatorInv); + Collections.sort(aboveMaxCMC, CardLists.CmcComparatorInv); Card maxCMC = !aboveMaxCMC.isEmpty() ? aboveMaxCMC.getFirst() : null; Card minCMC = !belowMaxCMC.isEmpty() ? belowMaxCMC.getFirst() : null; @@ -1218,7 +1218,7 @@ public class SpecialCardAi { // worth to fill the graveyard now if (ComputerUtil.isPlayingReanimator(ai) && !creatsInLib.isEmpty()) { CardCollection creatsInHandByCMC = new CardCollection(creatsInHand); - creatsInHandByCMC.sort(CardLists.CmcComparatorInv); + Collections.sort(creatsInHandByCMC, CardLists.CmcComparatorInv); return creatsInHandByCMC.getFirst(); } @@ -1243,14 +1243,14 @@ public class SpecialCardAi { if (atTargetCMCInLib.isEmpty()) { atTargetCMCInLib = CardLists.filter(creatsInLib, CardPredicates.greaterCMC(numManaSrcs)); } - atTargetCMCInLib.sort(CardLists.CmcComparatorInv); + Collections.sort(atTargetCMCInLib, CardLists.CmcComparatorInv); Card bestInLib = atTargetCMCInLib != null ? atTargetCMCInLib.getFirst() : null; if (bestInLib == null && ComputerUtil.isPlayingReanimator(ai)) { // For Reanimator, we don't mind grabbing the biggest thing possible to recycle it again with SotF later. CardCollection creatsInLibByCMC = new CardCollection(creatsInLib); - creatsInLibByCMC.sort(CardLists.CmcComparatorInv); + Collections.sort(creatsInLibByCMC, CardLists.CmcComparatorInv); return creatsInLibByCMC.getFirst(); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index f677dcf779f..0a747747895 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1321,7 +1321,7 @@ public class ChangeZoneAi extends SpellAbilityAi { chance = aic.getIntProperty(AiProps.BLINK_RELOAD_PLANESWALKER_CHANCE); } if (MyRandom.percentTrue(chance)) { - aiPlaneswalkers.sort(new Comparator() { + Collections.sort(aiPlaneswalkers, new Comparator() { @Override public int compare(final Card a, final Card b) { return a.getCounters(CounterType.LOYALTY) - b.getCounters(CounterType.LOYALTY); diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 399e18456a6..7897017b187 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -547,7 +547,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { Map result = Maps.newHashMap(output); for (Map.Entry e : input.entrySet()) { String value = e.getValue(); - result.put(e.getKey(), output.getOrDefault(value, value)); + result.put(e.getKey(), output.containsKey(value) ? output.get(value) : value); } return result; } diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 6f2d66ffc95..e138ed9a402 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -202,7 +202,7 @@ public class Game { if (c == null) { return null; } - return changeZoneLKIInfo.getOrDefault(c.getId(), c); + return changeZoneLKIInfo.containsKey(c.getId()) ? changeZoneLKIInfo.get(c.getId()) : c; } public final void clearChangeZoneLKIInfo() { changeZoneLKIInfo.clear(); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 3346938c8fe..39f6041fefd 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -824,7 +824,7 @@ public class GameAction { .result(); } }; - staticAbilities.sort(comp); + Collections.sort(staticAbilities, comp); final Map affectedPerAbility = Maps.newHashMap(); for (final StaticAbilityLayer layer : StaticAbilityLayer.CONTINUOUS_LAYERS) { diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index 5afed3b31b3..8f714aac24a 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -403,7 +403,8 @@ public class GameFormat implements Comparable { naturallyOrdered = reader.naturallyOrdered; reverseDateOrdered = new ArrayList<>(naturallyOrdered); Collections.sort(naturallyOrdered); - reverseDateOrdered.sort(new InverseDateComparator()); + //Why this refactor doesnt work on some android phones? -> reverseDateOrdered.sort(new InverseDateComparator()); + Collections.sort(reverseDateOrdered, new InverseDateComparator()); } public Iterable getOrderedList() { diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index 9716126bd6b..0e100e9db4f 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -136,13 +136,13 @@ public class GameLogFormatter extends IGameEventVisitor.Base { for (final GameOutcome game : gamesPlayed) { RegisteredPlayer player = game.getWinningPlayer(); - int amount = winCount.getOrDefault(player, 0); + int amount = winCount.containsKey(player) ? winCount.get(player) : 0; winCount.put(player, amount + 1); } final StringBuilder sb = new StringBuilder(); for (Entry entry : players.entrySet()) { - int amount = winCount.getOrDefault(entry.getKey(), 0); + int amount = winCount.containsKey(entry.getKey()) ? winCount.get(entry.getKey()) : 0; sb.append(entry.getValue()).append(": ").append(amount).append(" "); } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index 2421f8416e0..1e770f1fce9 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -311,8 +311,8 @@ public final class AbilityFactory { } private static final TargetRestrictions readTarget(Map mapParams) { - final String min = mapParams.getOrDefault("TargetMin", "1"); - final String max = mapParams.getOrDefault("TargetMax", "1"); + final String min = mapParams.containsKey("TargetMin") ? mapParams.get("TargetMin") : "1"; + final String max = mapParams.containsKey("TargetMax") ? mapParams.get("TargetMax") : "1"; // TgtPrompt now optional diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index 15093f84f08..ef8dfcba924 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -11,6 +11,7 @@ import forge.game.spellability.SpellAbility; import forge.util.Lang; import forge.util.collect.FCollection; +import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -190,7 +191,7 @@ public class CharmEffect extends SpellAbilityEffect { } // Sort Chosen by SA order - chosen.sort(new Comparator() { + Collections.sort(chosen, new Comparator() { @Override public int compare(AbilitySub o1, AbilitySub o2) { return Integer.compare(o1.getSVarInt("CharmOrder"), o2.getSVarInt("CharmOrder")); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 78d1123680a..e877dd900be 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1330,7 +1330,7 @@ public class Card extends GameEntity implements Comparable { int counterAmount = 0; if (countersAddedBy.containsKey(source)) { final Map counterMap = countersAddedBy.get(source); - counterAmount = counterMap.getOrDefault(counterType, 0); + counterAmount = counterMap.containsKey(counterType) ? counterMap.get(counterType) : 0; countersAddedBy.remove(source); } return counterAmount; @@ -6188,7 +6188,7 @@ public class Card extends GameEntity implements Comparable { } return 0; } - return numberTurnActivations.getOrDefault(original, 0); + return numberTurnActivations.containsKey(original) ? numberTurnActivations.get(original) : 0; } public int getAbilityActivatedThisGame(SpellAbility ability) { @@ -6203,7 +6203,7 @@ public class Card extends GameEntity implements Comparable { } return 0; } - return numberGameActivations.getOrDefault(original, 0); + return numberGameActivations.containsKey(original) ? numberGameActivations.get(original) : 0; } public void resetTurnActivations() { diff --git a/forge-game/src/main/java/forge/game/card/CardLists.java b/forge-game/src/main/java/forge/game/card/CardLists.java index 844015cfeca..cbb9a147018 100644 --- a/forge-game/src/main/java/forge/game/card/CardLists.java +++ b/forge-game/src/main/java/forge/game/card/CardLists.java @@ -119,7 +119,7 @@ public class CardLists { * @param list */ public static void sortByCmcDesc(final List list) { - list.sort(CmcComparatorInv); + Collections.sort(list, CmcComparatorInv); } // sortByCmcDesc /** @@ -130,7 +130,7 @@ public class CardLists { * @param list */ public static void sortByToughnessAsc(final List list) { - list.sort(ToughnessComparator); + Collections.sort(list, ToughnessComparator); } // sortByToughnessAsc() /** @@ -141,7 +141,7 @@ public class CardLists { * @param list */ public static void sortByToughnessDesc(final List list) { - list.sort(ToughnessComparatorInv); + Collections.sort(list, ToughnessComparatorInv); } // sortByToughnessDesc() /** @@ -152,7 +152,7 @@ public class CardLists { * @param list */ public static void sortByPowerAsc(final List list) { - list.sort(PowerComparator); + Collections.sort(list, PowerComparator); } // sortAttackLowFirst() // the higher the attack the better @@ -164,7 +164,7 @@ public class CardLists { * @param list */ public static void sortByPowerDesc(final List list) { - list.sort(Collections.reverseOrder(PowerComparator)); + Collections.sort(list, Collections.reverseOrder(PowerComparator)); } // sortAttack() diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index ae24cc3a7a0..eb9cb92e1bf 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -449,7 +449,11 @@ public class CardState extends GameObject { return sVars; } public final String getSVar(final String var) { - return sVars.getOrDefault(var, ""); + if (sVars.containsKey(var)) { + return sVars.get(var); + } else { + return ""; + } } public final boolean hasSVar(final String var) { if (var == null) { diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index 01ff97a94f9..09f0b69b4d9 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -18,6 +18,7 @@ package forge.game.cost; import java.io.Serializable; +import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -125,7 +126,7 @@ public class Cost implements Serializable { // Things that are pretty much happen at the end (Untap) 16+ // Things that NEED to happen last 100+ - this.costParts.sort(new Comparator() { + Collections.sort(this.costParts, new Comparator() { @Override public int compare(CostPart o1, CostPart o2) { return o1.paymentOrder() - o2.paymentOrder(); diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index a64b3f2b118..75d87c49e64 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -96,7 +96,7 @@ public class CostAdjustment { return; } - final String scost = params.getOrDefault("Cost", "1"); + final String scost = params.containsKey("Cost") ? params.get("Cost") : "1"; Cost part = new Cost(scost, sa.isAbility()); int count = 0; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index aa6d211b49f..feb0bde0000 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -598,12 +598,12 @@ public class Player extends GameEntity implements Comparable { view.updateCommanderDamage(this); } - int old = assignedDamage.getOrDefault(source, 0); + int old = assignedDamage.containsKey(source) ? assignedDamage.get(source) : 0; assignedDamage.put(source, old + amount); source.getDamageHistory().registerDamage(this); if (isCombat) { - old = assignedCombatDamage.getOrDefault(source, 0); + old = assignedCombatDamage.containsKey(source) ? assignedCombatDamage.get(source) : 0; assignedCombatDamage.put(source, old + amount); for (final String type : source.getType().getCreatureTypes()) { source.getController().addProwlType(type); diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index 6304bf4870f..b3b9040bf61 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -89,8 +89,8 @@ public class AbilityManaPart implements java.io.Serializable { public AbilityManaPart(final Card sourceCard, final Map params) { this.sourceCard = sourceCard; - origProduced = params.getOrDefault("Produced", "1"); - this.manaRestrictions = params.getOrDefault("RestrictValid", ""); + origProduced = params.containsKey("Produced") ? params.get("Produced") : "1"; + this.manaRestrictions = params.containsKey("RestrictValid") ? params.get("RestrictValid") : ""; this.cannotCounterSpell = params.get("AddsNoCounter"); this.addsKeywords = params.get("AddsKeywords"); this.addsKeywordsType = params.get("AddsKeywordsType"); @@ -98,7 +98,7 @@ public class AbilityManaPart implements java.io.Serializable { this.addsCounters = params.get("AddsCounters"); this.triggersWhenSpent = params.get("TriggersWhenSpent"); this.persistentMana = (null != params.get("PersistentMana")) && "True".equalsIgnoreCase(params.get("PersistentMana")); - this.manaReplaceType = params.getOrDefault("ManaReplaceType", ""); + this.manaReplaceType = params.containsKey("ManaReplaceType") ? params.get("ManaReplaceType") : ""; } /** diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java index 602db1b7ccb..d670ab3414a 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java @@ -81,7 +81,7 @@ public class StaticAbilityCantBeCast { if (params.containsKey("NumLimitEachTurn") && activator != null) { int limit = Integer.parseInt(params.get("NumLimitEachTurn")); - String valid = params.getOrDefault("ValidCard", "Card"); + String valid = params.containsKey("ValidCard") ? params.get("ValidCard") : "Card"; List thisTurnCast = CardUtil.getThisTurnCast(valid, card); if (CardLists.filterControlledBy(thisTurnCast, activator).size() < limit) { return false; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java index cb150702654..1608837e826 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java @@ -83,7 +83,7 @@ public class StaticAbilityPreventDamage { if (params.containsKey("Optional")) { //Assume if param is present it should be optional if (!isTest) { - final String logic = params.getOrDefault("AILogic", ""); + final String logic = params.containsKey("AILogic") ? params.get("AILogic") : ""; final String message = "Apply the effect of " + hostCard + "? (Affected: " + target + ")"; boolean confirmed = hostCard.getController().getController().confirmStaticApplication(hostCard, target, logic, message); diff --git a/forge-gui-android/libs/arm64-v8a/libgdx-freetype.so b/forge-gui-android/libs/arm64-v8a/libgdx-freetype.so deleted file mode 100644 index 7565cedda9c3f61b20993a1bc0a57f8fa8d8ec77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 796504 zcmce<4`AKX{r`WZMYKg~9hr4pRa_Le6=YW2rqSLKTy1b!Cx35yqiJ#_DYtaoRcCkB zSy)+EXVG=rMQ33h*%WtON6?X35p-L09hntj9kCU^*Ez4}NnY<)ZazMrwcp=+JI?#{ zIIs8XocHw7kFb3gch|D59>ngtJi_L>%7ac$pQE^&Vsre%8D`PfO8gEA3rIc|Y4=h5TVg+; z_;KPlK=)o^jTCke_fy zIc5^Sh(afY&w|xZycOq0=L9(r@d*^N6uw6M zUw9{-k12RbbdaCzmxoZlJ}uF4?5?PyawlgB%Py4{uzafi9JN} z0Td?F`3&fg=u1+%IbI=_pztn>z8d0RBKdbDUubkFyaL^`DE=#@9ZBITI&Y@f92ZiU z3Y`Nf-a!24kWKnM6#hVAn-Su}y5gI&Z(^(g#Po?lRaD5-ePZ7JF!c&y~8w%#Qn`GnV{!QT-(z(V!9M4hw z9SS!P|2c&xNq2t==6ICCGj!f%C7+6JWol_%@PLR>S8zh0a$|=p*?^ip_Bsg$;Cm4~0YN{5A?dr0WhrI*GoE z>3ltG{@wr_pC|rR3csL`rqJsWD6Xe4n%G3T?r#(lBp*oO2NXsThs*ct)%!_3MmS8q%)u5pIB`ge{_Bn>EBIql45s!i_Q4Yd4 z2R_*;P+UssKcx5wN^7R@dkQZTixXQ<=Py$D6@{B9JVxOK3R5Wk8j7!=V2))R+5din z(l&#iO7Tk+W>EMlad%uu=XVji4&aw`?v9(q`SIc!ll};$9Y^69;$NWfA%zJfZ>RV= zikm2Wk-|wNKTY~`>HKRH-l6kWV$ace6@?wf7#){T7*E_BKPDdIQ{UUf4kGz!3O}Uq zGm?KnY5$`5s}!F^>~j?g#|p?Dp| z#T4G7^P4EGlY%+M5?e;0hk`klBHlvrCnUd0`fKU@mvsIZozFwM(Vau*ODIIaYKa{{ zI_6l0xSh_AqVzK}QIUAB zIL~#uir}e8xHyNxQD9%7coBu9(792Z|6fi|7s?mld_Kh$6qZ1qM)Btpvzln=uN$BPSZ5$ERgO$wU?yGop!)4eJDjlyOl(9z71{qIU~{%NPDkivEf z?+L}9iSu*l{45F^D4YZyKzu*NRXBIiB=S$6aRSAMkSvcj5++hOQ@{wFA1P#W8l>x9 zq__jT39*aH+zG`8lI~B1{0*G%E0{UGp2C@=yM^MQ0pfT9=c7^H(U8|ue6!Fqr(cBp znBd3K`B`-BuPE-P&?wRdPbvM}L4i+RgM2!rZKd<$C^knogg4}}mG-69BnBxer z&#~y6h4^yfSJL^PA-m{9I$4Zs47(EN*CPI+NV^pm)e&0({sFP?fgghS`$*db*+pZ8 zEyKR=5)fA+{u9NgLU#$p&yYNu;`foBPvu@G!C0O#&SiB=0TO zA)gWF&r+H>DiNFWy>Z@!_-X^`_!fmNU?p_^OL5JKbbdRrpHnc$k2$jc?WMGx6y74~ z74UsY9-wfC(EBIJ$D(XsC*DKhvlQN-FopQpl(p#{2z)zkUONPiQt;rEO4Z;;MiBu6M5 zLupSV?Oep&6wjy7NudzT*pSDaWMe9&1t=_q&OW3to_IgWw}QQc*j&3Gg{Y7XGsnM) z9Zg|1otGdzMs^Yu9!>)A{)n zmQ(nI!dn!63jIIRd4$fZD0W9B$%{z7lHxiFYbfE5BzMsH|8$I^r*iimSL%)OjrT?H zzSZ%9NmNh1vA!+aO^pn#`)X++VR-%X%qQT2QkrBBBKupulF#}m?=Pr>8~urYV*L>G zUnNIk^wamS{tobkG}#*c^4D0OQ)#|MzEfUi-VXg^DK>U8`>|#@_}sC^&UjyE|2Rt` z;5U(I^n(%Tqn!8CLeub-Z!ve{WX=Ixp2@Fpz6G%3rv;5I|5>bW=3R4KG8yGZy>Tk_ zDSB|R_w}mxzP@MgYrL;7k51?a*#FXd3|c^%@)zfO`Rl09o-J(0)&FE#{2BZ47rp!` zDzLFr2>T(}f0`ylqrVI75(Lkn{_|h*+KG~ax!*QBLU?^;E;*dk3~wLDce)aN@OfG| z8v7Y#=T%zd82!nUS$_laeGT>B($BmWJajVaZ@G-i-_&R3Iqp|kOX)oT>Sxu5 zY@h#2@1|&RY3iY9E88!C{$c1>JJFvVzl268QJ{YG+xhSt zu0Hppg}UwkW4QbQ=)X(-!SMdiFn9GF9mVBYje0JI{u&+jJm&4-FJfNstNycw44QHVMtk#p80GX& zWjh(zc@6d7KA!cn;0wrqnEp_|i1q8i@5lJ{^_v--=X4W4NjGlvCm+Q6DFf;FA^cnY z-*CU^SJPcTQS;gxpX2)3toqwu$MJo&DgXQv%ERP4?rzSv$mUA#i7~!fm7V42|KV#` z-;ImwV5b9i!myKuoe6)zctrWPp3V6NE5MlHV zr-%4l`i-ccwW^-~fq7>W>VdkwJ+7R}BTJkG~z@a_*YT^%jMlH-gN4 zA2WCJUB$s{C-4H7e**L$#drz4%Qw_Nn-dbpvYnpqvz;vZ)y0@+=VP9AxKMz1Xbic}Wvas_2WoPQ4`vlI{Je!&0i==P(lmnTUqaOCP>xc2a zE;UZSLKR~A&knUN%^t&cI__gTLD=~s{6rpROHm!g?m7o(rBvzly8z@&wu?Ifm`Hb)b1~YU*L2ob%m*@_#UedBm+Nz_Zpb zana>}lPJ#wRX(FYe9u{bzH&ZhYP1$^-vgicEe))n&@L`7^BV2e1Dk^A5F+ z`WnVjhZ^r69m(}S5%W|8cBX!b?G#+j^%DTUhE7bro91)A1*nHFO=3Iq|H}HVJaOc^ zTIG8%`bqL%Y-c*`Z@@YycnWj39{4QAX+9R1t?U+k&)~Ucm+B9vVLsie{L+KapRe@y zrUKjb!+zfNgLwyL?ss|{muD-=`N3hV->cSj|DtrGUyAu?74+xP<<>sNqw{aqqnu@G zUG!7*w}BeYcRTFd=K5h1^NHYp#{52RG4np~Z=S;CNvZzuebj&Nf5;Khk%s;}^sD3{ zY-bnMyE)AJEpuP>vzW&j`~G<>^RmO4yXV$@VShW;hby2z>Im*9-O6v*z<+M|JKI?c z{e41ge>41s%lAs__h{Yz0qgUB>Alo}Y=5;HcS)@03)OtR0Dg6a@~iv8&IaXAw%c{x zcwclMZ$H_Je!CX)i!1+%VlICx#*r(h`Ic(xb3&L&J^J%~xUVU=uLSDh609e)YTav! zZR`}k!3O-$4^gw4{+4`({eK+%Y0NL-&0fAY+TDleAlI+HMfQ!I)N8Dtg`H*ShZAF5 z{weSS8%wx6(<|8zR6_qj^oPkEtlt9uTll>RzvS|}{V&VlPsXYHU1Hx$jP*@X>#Mah zINu`V%em0IEHZ2ACvHAk)8XceBJf_k2guq~+Rrqa^*hYVPdc`MAK>PTgZREm$-kSU z;Rx<;+f{%5J?yMAFUIIt%eUt{8|}Cj?>%T5<%0@l=F>{$C;Mh|dA4Hya_#tQTYh)( zQ2g;^Zm$TQYr;rMp?}5`Tr<Zj7rd>QyB)E}(BddJ&O%yXg9UkU#lg8qGW z9FcQX{&O1U_sBkEkdD!Gy*aL+VC-b@92zo^j$5f1hVM9u%TvVF=bK^2FZDw_SB9)M zee(*i{`zXxZv`(yzP%rCdnM3b|3vv$T*&%;(9c7EX!`+k{x5wqf?w*x`yAJQ(&*3e zT~vW|xOSXz0+(mi{cOSQc{ttrlkvXvD6il65tYlddnx=CxeI%|2tN=XU^^?pA1dT_ z$teFblj_OT+w@ylzYF@09?AM~HBYTUe_MfdHJP=?^H!hU%V8dO_q8s>_7iIT_AvZO z=xJ|1xdHvZa~n5c2<>=-oj1q&mSOyIX?;FF{OwBRx5u8&`BtiR$QI~thrY9O7TUc$ zpZnVZ)UM{Z662y()x%4qZ|ZF=#>G06vmXAf|75o8%Ktgk+XnSKav6A;8o%>U{$f@B zdob_s#JumfrKIm00WME_l=IyR{s`vx&TET??U-Ess7M|agp812HG)xUzy6~oR9Uhn=gKD`#+3|=nZRsysvd{Z~vbUe;!o+ zvl#PcQmtEdV!X6G&EvY8hoA3mv}3^l1Lrrsf%RS~-g~?L{0YYCE{tpUEiO$8W;{+* z@5%4L{cgXI^PP@*I2_Lx6E9`H3HLnPuJdVJtA6s(5wMT(<;LB9=x@tz;&!a3dC?qK zl4$&Jv3jn54)s>1#?jx8;dUuE3r;%BH#T!@#BUQ+X!a@xhMy zCT7OVL_9yP$2Idp%;U;GT#bCQYQ6m@_<_}U4@S*xkH<#nKWCvGi?J*nqM)AHP0e(3A(tNyE>;(T9{j*f{ z&nqTzzGZ5DIf=??>Y?*3Zm%%xoD9DaSAJtD{CxHP?B{(LkJn&cSciGR4?DlW`?~3` zdFy`)-Jq$5aqc}W^q)p~lJ9bPLg078POo~7m;t{!9qnEQ{S~&}Ac*J$^ykUSFTIF) zVLRppa!2;qhl*k9r_jg#GYcMsA4?-&Kl=ZCjNbvZKDh(=hSfOwEM;WsVL(0av|{{j zQTq7-?kCGG<$mS-?Gbj}g2IXDhZv9fsLu$}UZsh{+*jYed|zbN9-Z*#;RS5J8|}M} z)J!=y<9mnmpKrkrB*t?4x_)~L-cOFkdfVyO*m;Efs#=eQFkYq{#`(JXtattVtIWrt zo?plOz7_LS5z2p<>z@a5|9tcnPI#NHGvjgdQEaCi`o9BTJAt`t_tofEsRHIJkndmV zI%8+YHg*90;8Ri0?O3;mVE+x&XE)xrkQ=neI~b3fF&=~9KRS}@c^v$+AN)?d&xt6% zv5^!^yX;Wo-RvKtE;Q`uJeA9z#=3~_j`k+Q5BGQTxXa?oBd4%_@DA4O20wfs=IvOw zw}Rg@mASv1`$He<=cGfqoNIfT`=Ngt-UF;s<^TH(wlhJ!KRgEWLQ>5O&r$JAyX-ud z%jx!pq|RWTQFbb+!x;U9;;YfGI?=COe;$SVn)n~K@79Ogu`bGgi0`Y8{H8fhI+5-B z`&fSyW8ay6<^$(a1=10*|D}CS?)`@Pe)ou5Z!7sI)U2cynuuiB~>%$4~doB0!eN9LE9)|J+-sAoghMo7}4=2M<7Jx56f9v}_ z>&L-=VDqK#o@)NR-p}RlN4;_Gw2x{w^DU|!zZ7KN`XOt&arZX-$!PPyOGhy`gYP0c z9_f9%dXD}l?yKt)E~jg+%i*8bDgV3@er)p>*nXwWh5q&n{U@Z>?e~&@HT^I$jrCK| ze-7_~+thu1mu|%9SH8{_zXJZb6zv;Q?R(#`tlxeC+i!*aMYylH+9%^X4fUq_&sfaA z8chB$Ju1`yunSG_RZEAv-Sk zT>ke&JdaFP&!-2#KWuuHE&I_AzlM1^tLEji$*5`fEyu7v+>GzLXs>qFUbF3bfb=o% zWKpP2>NdtsIlf;c!GA=<-|#5j3%T}MZQFOOZ!OkE0q9RWg8lhu^*nU~=6#=&XK!uccM}q{6xPpL~e-c-#NP{)&ockF9?0hY>Y?e}eiiR`%y%JPyF0yYD`~ zr5iN$P(PRJ*^QU==+9g5-0JGT1^uT7`xaK9Jb$M4G~=Q}z3&af&W^X)ej5JsyWrbj zW4?oAbL>5X%TuZP`3cZ(hn+H3_Z>q0)8rde^T-=0=LF@4A4fkKQ188)s9zg9N%g(# zA86nCsQ&`wdjkA zma~3}mx;a$@t(Fv&1+p4M{VkT``wn0_qD73{E&OTQ}c2K{OV}spSO+X@^WgT2+0IU`2H$}*xqepT`$ZDmyl2Wa?>va{ zl`YucYKEatuNiE+Z<)pRLn!CMqnPh{ka-;XTWOtO##bkv%bXv()6REeeCxl-`d!e! z1^saS)y#Ln{s8*z7Sz9MucB$3?P8ThH`$mIiJQ7#)*W1)TbJhQ`w)|s#?P`8` z-{w2s7gqD;9L$ev@w^j9IS)p8*5kf{;P?2s{2SEx3ZVal&gVO-MExh-^NZ5|5Bhl$ z^Ywh#kKjGSeDrfypQEVZOucQ!`xClNdz?Yt%=DA2+K2Wdv`ek3hZ}AGBtNG1xqTkv zr~uyq-TZYU)*;*RoYI4Q_lLh-kLO~?8?e4@naK6v_RRkx!2O~0V`?}$5;T6y@hkLm zAJ&=fzP6)&I`RIzh}C`X`nevqD*y96noo1}hi&lZ3GCAd!A=7GGl};wDey!6Y=6D7 ze*@~L_5r@HR_LFJ`kb%)+Z@!-Cip|XiuU;*&Fz($;PnsYZ`w^ey8ZT9*xw8Fw(6&B zVF!4fpX)P%^{1=nd#DmjKj~9`brZ(j6y^U5;7_)y?~GU2en|VB)Vh5iYCcoWlzJ}P zZr1~2eJkIwDn*JW48GJPJZ`pD}Nkktb z--No~3F!Yj)VzP&B(9&8>b=UGBbiUfxZvFBZ)C7OT#x%IM&4u5j#=yzcK+csH;-J- z7TTfzC)9sP)&C*ZKacnM_wx3K+hJ!k>R~19Jb5P9TdP{{&A|G(Q>`~1Aa`o&xeNOc zT43iTtgn)4eYGH*`#H#b{>U}HCI{Gl$7OuKu6+x!K8&dK;pNcZ^kvrf!B38ZpIoW@ z()&}{{wnOluSEGxe>eBFa}C?+0O14bSRd}d`jgzOJ#ME4 zHTDbgr~>J5?fw_a&hQl8Bf0vVh5j}{`P&`v8`EFna=Q1EpT|0F{cCJLZgZjip|CSu z*?Ek{fys9}UYG@-|1cHUjQ7##pU!`7b@gx%=j-%aa9?HrW}bnaEvK;kap+gnE$!h) z{fAKx?tRXQ$ak0e&ier7&6TSBFVg@wKZts(SM%>|tV1f_Wc_u}f9(jahwbni z0q~$*577Jq|Ii736xLUp)pK6~@{Ou>+RPEw`7A|?*BNNvWorHkpr7P_#OpfeAAWE3$NSpUdi!Ry`((UN;L?)cv;CI#k17BE zvK^=NeND}4pI}@U;rWH!f<11x?L~jbcRX8eK|lWpel@A;?INsC)?*}A@@@DwVV$rH z>jXExs<5uxpw@LixBB#VL+W|_Dd?v#AC;k;zo!MZX~(T<-npJ06it69g@1GFqIu!m z^YR#~Pvd|3)!zX+r~;WsjD-uElm?^WL^!su7wvD}VseQSP;CYPT)3(vnDOIhFf z$!9Pg3)THTbqtq30>9+;OCN>#C9Ur32(;r)%wLr#|4i#QX#beR zfnTas?`eCfpPF{xiRTMfKVOHP;?dkL?dZ>Q;s1AHekn$I_OtIjXn%tGe!7t^H}<1g z2Ri@!IL1r&G%n{R*m>e;*3V!cva{b3&i&r?eE6B2%0IMG2R8lFhrdG%!2Wlsf8}b& zzzF^4V$936zuOd|}hpL|oET{c%YCiR!%Jq;| z{?K$wQ=j1gm#2^F(HuX-IGS=Ux0hQF9|%8F3P0fd)#F%)v?xFD4*J_>?B}dy^S*n~ z&)b)Az8k>b9>e$5igD!p)tcE{>{HJT$EAu@>vkiE5r*Mg=qX)vEgc-^ifxCw}#u zwKvuk6L)&ca{&BUFZN%#@_fb4*YsSuKXqU_GN`w7ICsA~3HLkUTDHH|UPZqRf$|io zeHxFV|5vK^-H7?rujZqh(69R1**3`L8{TVe z2LC%5H2M)WFBGBQ_M_j{Lw`^aADFA+p?N>C9GC^f{5NDZrZ(2y>AJU^EA9&JzxKtt~K`+!uu{NwmtrU{yG0(ZpVpe_qX8>d(?R8 z#5y6Z%74?5+^@pwxn?`~I>leK>n_?yr`ECN@x=I(sOl$&;yrCbjnhlf4-?mM`2(Z* zzD_-Y>mjMuUC&^hyh^R}e}i#Rk8$DJF^c{iMt|m9==b>G2UbDf&)ND;F5!BfsQhFR z#?g+?u!TW^-Dy7${9YJ*GS)MtAMyfr z0PVXF?bxo`F$_Pm7V{2OmpzPoH~nXN-zY1Org_U8>(Kwp_hNstfwA3RpKBg}7Jhpt z{_bfz^nDc-HOZ=q1$7No^>x?8AXc@+l65V+Wo&#OvQoFBW|oS(O(zO?Qtb2cwl zAFFApI4{=HR9Dk%NlR0#YH`KP`o`v%kk4*ti8ak?s#@%UWLvY@v6hR<8XFdhYaJ>( zTfuqp#wJ_1d7PL`fr^|kVzjE*kbAoFBt zsV?0R^ytou#TJR2=Pja=R#Y^%RMjl1sEIGCSWs10?_1DPv9Nw=BHmoz*iundU*A|$ zQC-)vxGG^%7RMGdbHakASj?R_#jLs$n_HS{m)NVCV@+4p)x;|5>zZ3C>Khvu0WWQ6 ziN~6$3shVcYig;hsj8<8xOpj~n#59HqGmxwZBrd3SJc#3H8=anXwBk;iRxnw=3c0G z%&JS8Gis8GnenQoia8Cnu|aZPW9^c9+Y?MWOQbqy~wp7w+ zZ8%omRMpVDps{JO$;t!ksplFvH+JQc7~P=gp>rFTG}OZQJQUB=Bx$1`MH-t;eZ{Mq z;}s1{7FX0Y&=~Lnsy#0nszG}h)kTGD22(|er46>-I-N2@mNI}x3d@W zsGeCdXK~fS*f70ebRKnySQAy3=L%=!ys8GW(o|8}*kBr9W`zTs^(<~*jprGcBek`; zxiM2E=IS}69>uvaQwQeK^BZep6&E!$#THm`UP)ccu$$3P+{;iByxfeMmb$B`8&#li z_LeGe11!uoW0G=X$?2IsJ(yC~SXDbDk?BEmuJ3t3q%Ik&x5RoLx(Di-6*C(f%wRM* zfuMSwILGu*N;Q6t>Y%1^aiS?kBa_g1RV_8~p*+}Ao}FxIs;U|0d}kTQLDyg$7&mzy zReaM@0gW4*A-%2vW{7)q>SI;SG4|~q-$jijJl9n;*VIhE3bH4vXo}T1G&L8SmP7C49IR+K%W-KAty70zSUen6 zENQ5#G2PYPi!Jrlbq(eoJ$`klCCZzYnrik{*DBZRypr)Z9yi6ncfMxkxQysu)y}tiWrT^ z+Pa2?qP+*xhIa*%9$c# zeHvdi&vd-=u{84lay&~KxZaH$vx?z9Tl&0A7!*|5||Q!G){WF3>dXl{(gOs%hK!Qu)^rk-B0U`YclLQVBmFR80H z#TX*B)V+rY&8c1$Gs#LLB)6Cwg@r_O)sm$5hH0Ypnjm0Y5w~%y+04W&FKKRRTr8U2 zCB%|uQqPe+L|)IP=)?8!vLv1q&9?nD!+W&;o9- z#MTQLF)x{d9E7vvJ^&^I=nN_HKMp+LrYW9k%+WN&6wF~OW2emAvrs9dgB{VcPRMQ+} zTrI5<7gB?`l;)bIx&-Qd5PH>`s;YBaHVL^co0MUe4OEsFH;iDJ5=O90DZ?!j^jcoh z(zu|mg}gFN1a2j5Zuu(mm^o|7B;?M~qzuc^Ku?a%M%{&GzlF9#R0}yqj)^L)dP$syPmXS76LM#6E*X}&fu783 zsutz$ur?v5Wt*ZcTc|8IH0LaH4Lu;`t}vT2+%l;v%T0A7Sf+##%1kN4Efe%wj#F37 zRnPRG(lml)lQPV*fnLj3EULJ=sjkJ$xXnvxp#tw~TDPW=hJMamO+xPbF)71xHPD-D zf}D9y%O)YWWs@?@vVmU9OPlH|YNpjBw4$lhW8!OTNbIO>HKL z8k*U1B@8RQG1E+o+1%Rn0wH(8lIrFW5@;&Um2pd53uTm}sGh2;ja^lhvr%k9&Wf-p z`nD|eT5cYpxob^AZp$WRm}LXKmX|DEymZ749BYZ^9*{O6XTCN?=WC%S--WTpMLFxr zCgikiQ?z9ZwdLGHom58{>NX{ZWi`|n)>q}8DQrUSGMh_=SvJsHX7f~&YX~hg3Arts zlwp<)^jdC;(W|{2!+9Ym3?I%mA!k|46}ih|QgRJvYb)1qwh6;ZZ_MNx&a9ndICDad z;f#dg!`UX}8qPMsTXjpW7@;GXgxnQjQik1@fy#1I?#0Z)C6q9NWl9-tnV`pVys9Dh zfVBxZE!z}r*+Q@7Sat5&h?|7mmQBhq%LaNZ(}PuA&4?~&5xus_IW%lS&U|f(&euXu zzKi0EbKj9o$ZgqNGR(4p+H&p{5?LN$g=AB5SXL{fMf9weyEaTh?lPN{VU`W_l)1jD zF{fd}bJ{ft+N@#9YD?~i8+vCx!o!VC8E%-=wdJ~o5qk|8X~^mJkTBfs*@Rqf&nApe z1C&WFw`VWO<@Rhsj(ekZP>xj$Yv*u#oRGuqAz`@NvkAG}o=wmdn;4-dv?NCA3Y3!L zwi2qz>K2dC8B9X%DmE#@EF0)8b6s<8he{uuMsTP$Ww>Qh_gG$Bzclw_lugK4W}Bid zTj;gCbOiUa*d*k(Y*L0A*W@VqAgqKwJhGD z@vF7wcon_Qq_-#ZjNKG7pI_-|TfkcS4BOPWRM3U=;;*Kj-j33Tgdtr^>04hDeMVH6 zHXAGkx;kgar0lNFU12t5*lihg?`_pJ7mUy`ZOSmqM%`<9=t&jzMPH$F--JoX z-8Lp=SXKslvszl8+t)Okgxr=*$}r0YdMvk8Ew0a5W}A@HvQ5#JEmW4T%Kh@BrHT?p zuuLh#Efe%wj@9R$hgwWRZp$WRm}LXKmKV_brCk28#U$jmY*L0EnDcZoa;WYVI;cB^NpFlJD86X_M_9# z2Qu-MYo>K{_G7yFND*F|5ML?r3Cw-5x zo@ln|-b$wLSNIU-zLJ_RXM>->1|d}o)o4X2?v6JN*>8mgvuNthels>38OoO?>^DOT z%Id0{s(2rRm4~)9n5`2PQr}dpP&eX`_B`qjt_Ts{l~c#JKe$JSzb??;o)#a?Ww8dk zQEsN$C{`z3z{)%i42 z1v6S`_gI`hlk*-ch}@}6y4}lXs=*4eI=9toChdEoWV6M^bbQnIF0N{-t7>Q&+`W}6 ztr-=fuWi0y0WOy*K>UfXvB{Go(&$3h?`?jfqD}E=4?~mKUWQMR{MneA$KKs68YndQ zN!^TKi^}LL;1XI?RM;Iv%=rVOcXQgTI{MmfH?6tLXVEaL@LDttNuL*-hWUE#wL*Ky zTHxADqEnoUEfP+)pVUps%Bu#AiO=jPzxy;!SuALDm(q3vTA!=L9^6!bfYpTQ>z$xZdFYUZ4tBMptP!`iZ=z=Q6!VXv|%9D)n)z|{s@k2WS2J3C^AQ4WK+e~)Gwlub_FxAR?Wrth6WMM^^_AVM#LuAt$ zd2s8ERWSQm>^7Cb@iMQD_Z1B76UH70V~-)~9Fo~dWNejJ*$C6`tR~vX5oxUF&2E4+ zA1`dNy8r>K0&i$^`xfRl+BujELgylEDK*=s5>>TkbC8`-=~E^4=hE)aiYsY-VK)1k zq@j&*O-mZ=mRs^~G}knkEx8monH{8*f$33^S#$Lc4TF@gFi7l+9o%ck-5a9pv_PmS z>kZ7#tBMP*ZV;W=6kz6@QkuJ{vUu$@IDNRZIn9F|ns!nd?Q>&GW4vVum(PtYq`h8E zOKEQibwKkecis|OtHl=6MiG0Tc409SgOT&G=CMbZNqM6znZ0DFuTZU4^9IX>Hib8k z5N*VsV-K#eTiO@UPF&i?OAS-&qg^z#cY6UnNYwilb3>s4N=j$h8KjwRW@x%G)D1&( z3wCm|{>8cN2(8qxKguRj-@d3JVPUK`OiNTT=S1eQH+N&xHau8_R(e=oN=$2qC3Y$b zS2b7A^;}10ej1!TFR5#obv`X+?Xb5afTkJjzIL0z%*?~cPHj|SwJ|e7?XEMrFY5u% zJFkMKbJrtDDxuBcwX|fVx3ly|1}#HbDowM$j{LQKEr9AILlrZUw4$FypXmmRYUqeY zO=2nSV_(>yvo!ur>wTWG)%8BrY+xLDMv|=9wva=*FDSH)$oF zu1ub(aS<;hY;R?`gsPKgS8*kkudX(hGl{gkX>5jSlEzyDEi|YLT4&}sJ!90>l-pIu zAX-wbk(&ga%GnLIIc%MsObq?S2Hi|k1(TtYy6fro8QL9)w#h}(a9Bo*9d99r{JG62 zVs`hTicF_;*076E5Nb1{U}gYr8Z6fbfn0%`W}02qY}X)mG+Bozo#qg|pt`<}{u%+f zo4=AVCQE3`_B7u)RkTlmHsDrN)2_D0h4k@lVQq5g5pLnMTKne&Ew-=V;ie)O3{ES8 zQ(j0FwqyZK#(Tun`AZhhrhUG9#8#w^HlXhzOSCzjp7dgS#M<1(tDEzP*-95 zB(nz$xn$^DwrXM(MBC_E5j8r@sKOPvW~-B4cNdjLl~I zN2+_GYc#V*+(V}9-+CEayVH2KhVT?;{ycEE2l_CB^xE9*_W$o&G?&$q7`t(nr8iP7d%g~g)&B=|Ak6N`I@n!zZ=1@lj;WWTGIzV_mA&1*UuTaO)w|n+ zyw=KM3tIN9#q!3)o-&BH+q*fy-3{Be-cv<0k9Ji};XUVuTq)V`9vs`wuzRVtCu);k zuF~>hk5nlCnc!{~%FHo)W^@=!dtyu&J9}Ux&?iUpeg&^0cDI&V8h5*r+~*McWaz$U z{`ci_<{DyG^XJUneA;yOxZ0Y`>z4n%aAp-G7BPF^307I$6Az!to;fS#lG7jaZW>>ufDE&@rliiCT?!2tvUX92sMan>&;0;jDFjpihj(d znm#kq3v>Db3vpgi0m*z7Fz1LVGIr_p=Lz(cC1&1u8e?U1O6ZrM_}GhnocjOI|K;s= zZpOlYYvt3f`?U1`|7z<0eM$Z|IY=FO{(r59T-WAeBia4G=#FIL)44Ynuk`6x?->ow z_0#hHv~*dP|E=z)>3v$d%=3Rb|8zT_uJJ$F=QL--#sBjadH=OX@#f~uC3oJrsrSm< zlDX0xCbfiq6wm$MWzGKP2ki2E?f9X*&?EfIlcVtafvvOox=O`U)%-hmDaAKKKdtx{ z@K(ipz&jM*4&JHw<~dxRUd1P$iy!pE?|-`T_g=s}U-9)3<^_tczShqe<7DMs`UNf?mDO610GlUz2Hg3S1o4yDaF@;rxjlh-l}*( z1Ka6Ve10SMlYYflL4QE;qDHpkd(_(xi^2Vhmx2crFT9@Z1Qp+uVqUCx>TAqHithvu zD;{3X`Vqy;!J~?=zLE7S6)*Y*^SI(2-(sFneDb%MrxdS7J*O4-J;wFes`%B=Z&N%U z`t6Flex6Z$(t2*+4#k(ley8Gvu%A`jjf*bDL(uP5{8rfSQ9J_uUd8W(exKq|=(~Dy z<7gA=+0}>Ro52fko#O-G?*1GvznR<1uk=@d2NYig9#niac(LM}z}$v=B z#czaur{doM?^FCX@WS7C^ZgNcSn+k>NyQ%m&nTV+?@|0I@cfP5d|wAIR(uP1T=8D; zHpSls?^65&@Bzg?0uTJwTb}$Yxt^nn9|WFOd?I+K;#0u;6kh^AS-8oY@2SuaEBOGJN1z?^pYYyS+rz9MQ2bihFIK$$G1iYNegpL5ig!Rit#}*s+Z0b`*?y3LP&>v8I+$Pp9e9~JF`~H&qb3pOv?^r*n__)6_Pbr>ylX+V4o#3sC z2mZnOZHo7TXA}?aVEqood%!ytZ|maw%qkvzkL`3RzG5fyZpAl)_bBel->Z1n`)sFQ zaaaBU#a;P*D6gA;yCCN)zUe<~zd-TCF6M=bSN?^$U-2aL1B$nT7c0K=Ew&ROS%sj1lIe4q$Yr)$U4?n|pGKxpuWu8?$1>UW= zv(uxvv(vA5@ibS~?+DPDFl^LE8oUcx-1czKk0hvNO0GVfG8`xWL{ z#Z#9v?@~Na&AeOjD0q+JaqwQnv$brePx1Z*%=;BDt7D%3w6~x8T6jM4YmV!SHAlY< zD?Sc9s(2xIrQ*flZHl*mw<|t*FD`$F;x6B;;-%2 z7b@NZ9#Gu359? z9tZDId^LEt;yb|e@$cQZepNYv?H4FM0AoP0`pMvuDDIS8pyARj@-FhY;>5g}%xLpbqpZ+!G?*5#9E4aH4$2)If z{eZGF10>y(5vVO7R>%gOm zZ(Yy&m5O)#l6hQl_nthV`0r5uq~h+rQi``hcCqUx;~wICGfLn0F!N5ur+{Y_4}tss z;H@_|PJ@akp&wCv1$b2P`e(R2DaG?QGjCUX{_k;LiU*%%-l4cFXQ$%5kh6-rcIi?) zv6TCjyUx|~3gp|T^jCuqDBhjN{~nm{d2fC8gXb$g0A8SYbQIeODSmtnmouvP;%k^E z6u%xkt@v%=?TY^lyi@TlsGn}d-@|vzKE+=H_x;gZ56fVuQ1L$SpyKa=hZX+>yi)P8 zD1TD%F7Q^xCxT}be+1>vD*ht$dlb(ux4rxbq!yiM_cfp;iA>RP_9F2yf_ey`#OL4QE;Bftw@@YX{actG*XVLzmJ9e7mn zYrzwW-vXXi{2uUj#XG?}72gEjt@!iceTx4T-1nmQe%}QzRQwb0pyCIhe!_}>0lZT2 zDd0)PPX}*RJPe*u{1Wi2;#Yw8D1JS7zv8!n=fC8whYYx1@lNn!#k;^GivI~buJ}9P zDaH4~IBiqB5WGY2Ab6MJXMp!AegXJ^;uYWpJ>GhF5`HG2_!jVx;$Lw7U-41k3B|vR zdPpnY0zcEPcmwo16~6(zTk$)<`xIXX?t9sLzZ<{{72gaVRQxsYu;Tv&uT*?*)N@kt ziQuh@N5M0Sk4JrG6)%E*kK$K=_bZ+PFL=dU551V*3l%RP&GWur@hEse@k;QZ;;Y86 zov`A&zRLbQuJ~H$rxo7<-m3U^@HWLmV>#b;#pB>v#Yf@0cCX^DJib@G^|lOl@)dXG zDNx*%r%-WMo?^uhKzX8yyYeIzUxD(Z6nEuGEAGnEs<F-8#aEob`f0`c!CMt~?>*WS?}gm1xO=aXQM?~=hvI|#rW7B5oK<}A zxkm9XyYZ#?{1f?p`xH-uyK=ebpb00jzRTb7iQv9JdHYWpc)sHE!3z|x1@|lN_VYv( zcl&u#io5+h9g4gCJiUs${X7MK_Lkr6=Lsq9_VXkZcl&wT6?gl2x)pc(d3=BI=Ii!{ z1QmDtLn;+_`$Jk4cl$%Kio5+G{ffJN9ll;~c~-i1QQYn82r9lI$o(XuxZ9^usd&LD zte;Z6d_B)ot%~=35&c&2EoU(AS9}NffZ{vBeXn`%x8O{+Q>=Iycu4V;;9w^XCv6pt=oKA`x9h0J~1y!Ey$&OBf7 zE#L);_ktHHK5!-52`FCF#5}0@re@~Fiq|h;9#Y)-$*|&EQU4Le-G0%i;{A{-6+Zy) zE#r!Z{>t^0P~7?Xq~a;)rxbVdNLuj>^jj4loTn7;fPTB;?tObk@htQ^6z@g7bt>Kk z{jB1H`+F7dg?_i<+hM;)@qXz05WD$k^wr$%`HB~S7brdvyioA~xL@%i@POhW@Sx&l z;KhnZ!9$AIgC`YFf~OQ;0iITT>r$?VR>f1-GS4W!61+ok-!j(kRD2hBR`LAnSiej0 z)!^NVue+Z0dlc^h?^nDi#rgw^mxKGZd;L=Da@NmRy!Zy@1&U|DGk^2i8T~ER?^8VT z9p>rRz50Ev&{urIt<3Y^@apdX&%Ej7F5mD!yu5N1+ledg@=Yr~Xy+}joej>8;w`ta z{Vv73f57wdfa2@lW_{n=Ui&@J&sRJMxj^w9&@WWH7_z(0jrT0_b?J_8so+0c3Mo7J zW0;2(kAg=O-wGa8+&7NxR4U%LKl6m*Wd|}(DZYI?^H#-sCNOVTe9OViGm1y2GVf4) zD|n~k@snAPpBC_Z#mlN# zzd-R&HS43^;u~&e``wCHeusIF;+?I`dlm1vg?XRi1Gh5oSA70=nGY!5 za~pGCzqkLFwlmLHya&8Mao^pn?^nF2gLy#lTJWIaE#Sq94}d2W?|gvmClz=0Q;IwL zX~muWtm1vJ-=%oLgPd=-;)UQnibuc;-u2e=YVbnEyTJX5?*b1fKJFK&2gSqpFi$C- ze=qa2;z96M#cRRa6kiYCu6Xo5wx3bF7raC9i9cigPQ`n{vx*o0ob|gDcm26v@#()~ z{Q<>Sf&1R`w#!=Ze8tP2WIM%*zkt7&i74KU{1S?P*um?Wq~duGFi$By4m_>+XTe() zcYoi}rnvh%k#@!1-N#V3PzD}Ew)kK$hf?^S#j zc%R}C@P5TBzy}mx2=4o*w?AA3p0D@{@B+ne0WVa%9o(<@I`DwvzXA^`{sefj;_iK8 zNOAZ6Ev&eE?-xbhu|4b?VA@tLV?*eaC+=u?z zrub;^cE$6-Gm4J^?@+uDyi@W0@I5`NxO;EhrTApn=~g@d-lO<5@Lt7dg7+yt54>OT zKKP#j#jBz3+v)B93GjTyuLmzs{5#-31Ky_i zbKvcYKM$T!+dq133{4n=DLUH## zwoUO~$nA=|_q`d#`yh8HKKOoB@q+icJ+g`qzF$>50DV_3_nxF^1=oYi-|;ATzp}Fu z+~x1|SA!QKAIH1E{fch|FIKz>^&D6HI`B5dzYX4{_#NN_imw3=eBkZR_kl+he+WFS z_+#Lmia!J1r}!Vi3kSUUz6u^z+d5jN)#c(4)9phva|g&DZ&pV#VFOA6MLc z_iR(#`S~uzou402+y@-3|)%5-(eU~-2Dzi z;3IE&-0v_%72ksSG_AP%9fnTD-TI+VakqXb{MehX`yGa`;_i1Cl8U?EVaO;xQUUSxAQ;o=6fvKw@~pN&MztMzK@3$pME3z&$#05cOjCBulok;cPsAyHuE0Emx1>x zo(Atzyazns+uzRT&JWk(exr)F+|2nV6;FYu6rb<|)^F4NF6Qlumw{&#&wzI*-k(7| zC>}@odlk>$i|?~faW{|mE8YS-?mAaLk$X7b0@!nW2Y8|4p>?buRD1{QS1R89IP1q1 z-wFMM;%Ue(cIDX$JFQB8-8Q!0rg(fi^LEAS`vw#x0&}SzH`(*wjcK@-nTdNKE+e}Fz;8qa9`#FimwOv<$1@;=6u%ASA6?^ z%nKCn9>YAK_=ZE62NhpAk$Fh*9`LZ@JHaE0r@p{;(uz+!ig~Nz5%5mMH@w0Avsdva z!1G6W>*qP}pyDrpM-_hsJf-+H@QmVbf_E$a9{7Obd-ZYo{iD6*+z&jg_-DWqiXRT% zruZ@7S;eP<_bGlFc){M@^2`J;R{T8hO2sb(Pb*#p-l6zn@E*mNfcy6GmS+WcK=GTv zBZ}V&o>crU@OH)T2Jce*9`Js}e+FK-ueY4P1P>|xD0p1)-+;F&{v>#(;?IHiD*h^X ze!jOne*q6F{swqd@qdD+6p#I5jP-9B#Xp38x8fgx4=A4Zcl7`LyyYAR9#;Hd@Py)r zfww7sBzRWwW5D|qKOVebjJG@|ffp-&8hEARXMv{`p9$Wf_yyoSinrpsfN!j~JdOuO z;E@q{Qt>Y%-&Vy#$FLu6Q+(&C%rlCIPGjDo_H_G~4e}d=+@V z;vL`viciOVbryK*Gd+{-cPn0l`sr6Zb1v%-DBcV18}GHh9Xwxg_uivG@c?8OyLD9H z4$e2I^jH0Wd9mVKvdlw@Zv_u4z8$<$@kiY6xhd}QODW#7p7TvB-tkN39g6SW!hWDz z@wQi3zen*5c(3B?z)-z>+sRivxSe@{;{D)-ijVsn>-!ZCf(I3!4qmKyb_d%D zE4~XnqImRe){iRQ{toj>#ocp6T=5S4&SXMyw_h}=csJyf;%>iaT5KZ<9dA5y#rJgj*4lWaet_>?Z@QN_!_`POd)75D$1c}Vdvctr8Uv#ejKc=>b86N(pgGfyd=25(h-D|ox& zqn~FxS;fcwgL#+YS@3SfyTN-E9{~3q?5)qD9c({e@zvl3imwANR6PGJw&Pd43_PHC zIe1X_ywaB<~S+{wVAh2z|+Wg+Bf%2zynf(3iYV=wB)Bw@2tpUVwc~ zru;t=`h|kyCr53*e!-s?_uG#5a>mXJf@cJ87WdmF_;n)RZozrP@kRZDmkRp>f}bwz z7vlY!DbF#2`vpH!bG_gNf}beL85I0j!HWgY7x_j7KTYsT!S51wQiAUz^wWZm z7v;=IF7!JDA1&;63+{fR(U|KI{EtF^K=7kQzCOISH1#%CH z;619TH~h4^O(+!nWnrgS@XaFMkl^@y%j1F{BJ89Ee@NupD)6rtZE_-!KJ0m1Q;)0~R;_NLzOQ^J<}1@9L51_Ylg z@(l|66bOE>;Dv&}B?8$0Tkw?NhYCAs!S5IK)++d8LcdM$>xBJw!B+~N5gb2B zZ&N!2|Fy`sQ}7c7&kAn(t~`QJxOL7Yg1f_$|UtR`9z8?-Kl9 z!cMo~zZbkmaQx)AP3;x@2f}`z;I|7q{es^j_<-QQ6n1=sLN?|7~_(_6C1jj!;W$i=-pC|My z1wTfVCocH+#eF3N|CO+l6deDQn!PF|_yfXDT5zAR(<*p@;BA7h5anza{IkM-MsWNS zJ~p*O@QBdw6ud(4tl%dL-X-{Xf_DpEB+A(%_zH1fy@D4CJAHz$5&Hdt=L!1*fO-!J&*g?>QrzY6`J;Om5bvEWY&9umA!@UY;& z6+9w%so+t;@lWg7)JnmBE9xgMIR2?HtDg{jim;y)9RKu}O-%{@sHlgu;G0Cgt%Cnb z*zXhk5usm+@4Tjc4-mXf@a4izyWl5@@?;J}KcU6IWTD?7_;G@F3Vxd4S;5Z~yi4%e zf_DoZ6TC<8MS}MVo)ElG@TB1Vf?q56fZ%rv?i1^%#{|z8yj$=>!Cw^IFZip12L$gI zJSg~R(JsY;A0T*0@Xre#7W`zvBZ7ZX@TlPD3LY0cDtJQhnBXbF6N0A&ZxXy!@TG#c z3H}|yGlD-Sc!%Klrx|Unb_%{r=w}80q8Kk-g4YS&E%+6J_X_@X!TSVXC3wH!-xqv9 z@QmQeLLQHKG#>XA{Ujy$7{Swmj}yFAaJI;aZGs;t^xFkLRPc=869w-O{0PB21)n5% zR`7t}U4kDkc(>p|!FvRsCU~#l#e(+<{w2Zt1)nbXfZ%5c?)%(OyOao?FZfKs3j_}f zUMTn+!To}tBX~gY3j_}eexcySg3lE^B>1I*hXub(@QC1F7Cb8We8DRPzg+OR;MIaB z1g{Z1DfpFwrvzUjcv|qQ1#cDn8o}EHUnY3F;9nIyBX~;i4#95_yi@RR2%Z%@EqIsU z-xR!C@S6nh5&YYN_X>Wq;C+IBNAP~ZzbE*B;BA8Y4jtQf@cIT6#O2+ z{es^octG%n1rG}TsNltdKQ4Gk@ZSg?7JQ@N5y77nJSzB8f>#RuoZxZ6pBFqK_!hyF zg1;nqO7I@R(}HgmyjAc&3En37-vnO_Kyio9C1@{Yn zoZtb$PZ2yQ_^E;y3x2xbA;Cj}hXtQ0ctr59;8DTL1g{kQJi+6FpD%bq@CyV_3VxyB zDZwumJT3TTg0~9(Wx?A7uN1sp@CAZr1aB0)L-4Bw?-cx6!Lx#YRq!ssZxp;+@NWv< zBlx!k?-jgN@IJwB6}(^YRe}!){yo8c6NmbLo8b9^uNAyN@E;3aDELnW_Y0m8JRtbJ zf(Hd(CwQ^oj|d(T{7J#Xf#Ni z7Ca_+tKjv5w+Y@Tc)Q?Df@cJ87Q937YX$EVe3{@`!M`SWm*C3j5{F{RJ3x1Q}1A^ZyxDW5m%zKGe!Se;bL+}E@e;|0F;CBn|7ksVY0l|MFcu?^B z1TPkRo!}wCe zBlY=@+2XjLvo3b&nLNB$a6_vF64_zUL)koNZu&q%SqlQT>zMj_ut@-`u_Avy1;q5OYB@+2YOOLB>j?h4_PZIK*B$o*JZIY{n{2s~6h5SCrYlQr7k~a$ZW0JQCIqz)BKQNU4J|s^P z@)(j!gnR(W)j~dqnB+A=K9uB*LOzV-Z9<+za^A5+`5#U4Bq1M1a*2>nB)MA1 z(@0(}@+2X@Npgvh-zK?Q$nTN7T*&W} zyhh0XCV8WfKPGvbkn?6y{=uRA_aS+bkjIc*BIE-|t`_n^Brg~8!6dH{@}VSe6!Kvt zZxiw)lJlkx<$pBElZ1R6$t6NQk>qM2Pa}D`kWVFfjgU_#d83feBzc>VOGwU}HkAJ? zk|zoI9Fj|fd_Kw5LY_UrzEiAy<=}ck)pF3rLw@I!R@_QsN7xMcguMzUUN!}>rk4fGpz&Y?D5ek z-z_1ZkG6cD_2Ng@{w9+hRq^6$qkQ+$&nFta))Lb7B@Vmg?N2^Aq<7Te$C-2!+V}ST zf84!$d{ouB@W1vFI=ME#4p?CLvY_ z0v<=G9I-uIyfiavFB+`V({l*WV?(j$NNH_PPv4g$v~@zX6}inuaNh5;_Y4N4_Wb_+ z{V|`t_u6Z(^{i(-xAi>FTJxduelb}4Njxv!sU3(l+CnF9w}+0;PYIn}l^Qx*qXqAH z=i1-sd0ykV-RAlBquz~!_MGrByB0o4`_VDVU|qjyn_W%ow@(N+E469)pgq`c&kGOO zbHmr2jc?YA)OhD4wTyhV24WP{v);}4B)%CRa>cp#nrg7#O$bXL55J_0<%^YZx3sUU z_KDSQ0{(Jxle3Sj*o?q+YJ4>Dj=1lp{xoO#mAsQNUe4A3eXkKnQ9Tcay+#99hvuzx zYZJ?>UeuQDwyOq5YU25q+A^O!I}*?T#(Uu9_<|sNvEM0KpU#+a!YhHfI7Lk}%U-a` z9-^#Qsfv;m^7wTkv!&u0kf>d#?%(mZ{)?-5Ea2Z=&D| zJP(cW8cxkI%=*6J?5Z1>i|d(_noz8a0WW!|I>|I`h?>U;J3ANf`9M=sU>Q8Yst zN0?s|wm(Rp+2MKgDRtY=#4C>TZje4=jX$M5jdpF!u|0HluL>SxE+24!r>}aAMdN*j zeEW0iE=srV+s13gUY;Ma`HZ%7&8PsE{?opQGgU2{1Kv&o|0%mFf76!R6;o>GIB+j@ z-(9SNr$(uul;ijA(d=Hc?H|fm%e<9NyE6Kizn#3_o^HJh@orbTGW@4IB5|8Oy#H*x zLD~|S2AG5Gyl=B<#-g8C^&f)XzC+ofTxRWz>xN(0D%WWlbJqQfio9K39a*31 zefpJ>w+q*2sqyPm)h%1$x$a`skOlp|>T?8NX?^9*^;%X}yXJg%?j$vC{c8KdvCLCb zO8Ww0joHFG2G_Z>t#|A1b&l8Nd3EBsdGdJNSJ`vVCZ4}GY5e*fDss=0PcFE8wRhvx zn_s!V>(YF;jAi}PD&oZd;b1&&M|*4i*9sSYgF1rWdagRp`~S4^V0xxK_6k@16%}%E z&D^Gi`YydA#9;B|Hx?alq3VlXjM*fV~GgQwy-nUh&qh;x;q2(`+JUtBk z*J>GE&9;pF+eX>u`%+WqFCL}M?@S#v|9yK#_@U0j0D<6A7zwf0N#@_e6 z7sg&0!cW_WHd4D0*>T%H$X3y_9m@eIN3>den9Iz1UDX|2=+J-BvpP zY04hs{(;G*d{;_arF>h)w`KEQZwe }{YO{Hyz5gt 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

G0Rra_cq{SH!-ic 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

#SAVdQoN0K9X!;oPQZy{OexEY{BsWFp+=H9l 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�MBk@XyA|0(n5F!zEZi$xDHE?$HGxs%B7cVqLt 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 BngRd- diff --git a/forge-gui-android/libs/arm64-v8a/libgdx.so b/forge-gui-android/libs/arm64-v8a/libgdx.so deleted file mode 100644 index 258b198378c9416887e099b69f16efa5db019186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170288 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 diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index e07a0c1d1bc..c19d9c5b10f 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -446,7 +446,7 @@ public class ImportSourceAnalyzer { analyzeListedDir(root, ForgeConstants.CACHE_ICON_PICS_DIR, new ListedAnalyzer() { @Override public String map(final String filename) { - return iconFileNames.getOrDefault(filename, null); + return iconFileNames.containsKey(filename) ? iconFileNames.get(filename) : null; } @Override @@ -618,7 +618,7 @@ public class ImportSourceAnalyzer { analyzeListedDir(root, targetDir, new ListedAnalyzer() { @Override public String map(final String filename) { - return fileDb.getOrDefault(filename, null); + return fileDb.containsKey(filename) ? fileDb.get(filename) : null; } @Override diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index 11ee664dc7c..e11b200275c 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -857,7 +857,11 @@ public abstract class ItemManager extends JPanel implem @SuppressWarnings("unchecked") public void addFilter(final ItemFilter filter) { final Class> filterClass = (Class>) filter.getClass(); - List> classFilters = this.filters.computeIfAbsent(filterClass, k -> new ArrayList<>()); + List> classFilters = this.filters.get(filterClass); + if (classFilters == null) { + classFilters = new ArrayList<>(); + this.filters.put(filterClass, classFilters); + } if (classFilters.size() > 0) { //if filter with the same class already exists, try to merge if allowed //NOTE: can always use first filter for these checks since if diff --git a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java index c0e1db5b9a2..6aed9f95289 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java @@ -36,7 +36,7 @@ class AsyncSoundRegistry { } public synchronized static int getNumIterations(String soundName) { - return soundsPlayed.getOrDefault(soundName, 0); + return soundsPlayed.containsKey(soundName) ? soundsPlayed.get(soundName) : 0; } } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java index 974aaddb753..4f58b2f0437 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java @@ -294,7 +294,11 @@ public class QuestEventDraft implements IQuestEvent { int value; final String boosterName = FModel.getMagicDb().getEditions().get(boosterSet).getName() + " Booster Pack"; - value = MAP_PRICES.getOrDefault(boosterName, 395); + if (MAP_PRICES.containsKey(boosterName)) { + value = MAP_PRICES.get(boosterName); + } else { + value = 395; + } boosterPrices += value; @@ -514,7 +518,11 @@ public class QuestEventDraft implements IQuestEvent { final String boosterName = booster.getName(); - value = MAP_PRICES.getOrDefault(boosterName, 395); + if (MAP_PRICES.containsKey(boosterName)) { + value = MAP_PRICES.get(boosterName); + } else { + value = 395; + } return value; @@ -941,7 +949,11 @@ public class QuestEventDraft implements IQuestEvent { int value; final String boosterName = FModel.getMagicDb().getEditions().get(boosterSet).getName() + " Booster Pack"; - value = MAP_PRICES.getOrDefault(boosterName, 395); + if (MAP_PRICES.containsKey(boosterName)) { + value = MAP_PRICES.get(boosterName); + } else { + value = 395; + } entryFee += value; From f64b59a140028030f81634de6d5890ab7a3df87c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 7 Sep 2019 20:51:14 +0300 Subject: [PATCH 62/68] - Preparing Forge for Android publish 1.6.28.002. --- forge-gui-android/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile/src/forge/Forge.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 93bcc51d651..bc51f044742 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.28.001 + 1.6.28.002 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 550be4903b2..f7344581e61 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.28.001 + 1.6.28.002 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 15f603356ca..abc06720dd2 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Stack; public class Forge implements ApplicationListener { - public static final String CURRENT_VERSION = "1.6.28.001"; + public static final String CURRENT_VERSION = "1.6.28.002"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 357f146742db3ec2a6975e6f83fb25de89a64e9c Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 1 Sep 2019 10:41:32 +0200 Subject: [PATCH 63/68] CanBlockAny: rewrite for 'can block an additional' and 'can block any number' --- .../java/forge/ai/AiAttackController.java | 6 +- .../main/java/forge/ai/ability/AttachAi.java | 3 - .../java/forge/ai/ability/PumpAiBase.java | 18 +--- .../main/java/forge/game/StaticEffect.java | 96 ++----------------- .../game/ability/effects/PumpEffect.java | 16 +++- .../src/main/java/forge/game/card/Card.java | 44 +++++++++ .../main/java/forge/game/card/CardView.java | 14 --- .../java/forge/game/combat/CombatUtil.java | 11 +-- .../game/staticability/StaticAbility.java | 2 +- .../StaticAbilityContinuous.java | 32 +++---- .../forge/trackable/TrackableProperty.java | 1 - 11 files changed, 87 insertions(+), 156 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 277128eb06d..b120235014f 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -547,8 +547,7 @@ public class AiAttackController { remainingAttackers.removeAll(unblockedAttackers); for (Card blocker : this.blockers) { - if (blocker.hasKeyword("CARDNAME can block any number of creatures.") - || blocker.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat.")) { + if (blocker.canBlockAny()) { for (Card attacker : this.attackers) { if (CombatUtil.canBlock(attacker, blocker)) { remainingAttackers.remove(attacker); @@ -564,6 +563,7 @@ public class AiAttackController { if (remainingAttackers.isEmpty() || maxBlockersAfterCrew == 0) { break; } + // TODO replace with better amount if (blocker.hasKeyword("CARDNAME can block an additional creature each combat.")) { blockedAttackers.add(remainingAttackers.get(0)); remainingAttackers.remove(0); @@ -884,7 +884,7 @@ public class AiAttackController { final int outNumber = computerForces - humanForces; for (Card blocker : this.blockers) { - if (blocker.hasKeyword("CARDNAME can block any number of creatures.")) { + if (blocker.canBlockAny()) { aiLifeToPlayerDamageRatio--; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index dec1aaa9f06..a33a8a1e84d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -1581,9 +1581,6 @@ public class AttachAi extends SpellAbilityAi { && CombatUtil.canBlock(card, true); } else if (keyword.equals("Reach")) { return !card.hasKeyword(Keyword.FLYING) && CombatUtil.canBlock(card, true); - } else if (keyword.endsWith("CARDNAME can block an additional creature each combat.")) { - return CombatUtil.canBlock(card, true) && !card.hasKeyword("CARDNAME can block any number of creatures.") - && !card.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat."); } else if (keyword.equals("CARDNAME can attack as though it didn't have defender.")) { return card.hasKeyword(Keyword.DEFENDER) && card.getNetCombatDamage() + powerBonus > 0; } else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 3f178539be2..9f2f3c61fff 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -256,7 +256,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { } } return false; - } else if (keyword.equals("Bushido")) { + } else if (keyword.startsWith("Bushido")) { return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) && !opp.getCreaturesInPlay().isEmpty() @@ -335,22 +335,6 @@ public abstract class PumpAiBase extends SpellAbilityAi { && !CardLists.getKeyword(game.getCombat().getAttackers(), Keyword.FLYING).isEmpty() && !card.hasKeyword(Keyword.FLYING) && CombatUtil.canBlock(card); - } else if (keyword.endsWith("CARDNAME can block an additional creature each combat.")) { - if (ph.isPlayerTurn(ai) - || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } - int canBlockNum = 1 + CombatUtil.numberOfAdditionalCreaturesCanBlock(card); - int possibleBlockNum = 0; - for (Card attacker : game.getCombat().getAttackers()) { - if (CombatUtil.canBlock(attacker, card)) { - possibleBlockNum++; - if (possibleBlockNum > canBlockNum) { - break; - } - } - } - return possibleBlockNum > canBlockNum; } else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) { return ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(card); } else if (keyword.equals("Persist")) { diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index 31fe957de37..b27ed2f3d20 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -47,11 +47,8 @@ public class StaticEffect { private final Card source; private StaticAbility ability; - private int keywordNumber = 0; private CardCollectionView affectedCards = new CardCollection(); private List affectedPlayers = Lists.newArrayList(); - private int xValue = 0; - private int yValue = 0; private long timestamp = -1; private String chosenType; @@ -88,11 +85,8 @@ public class StaticEffect { private StaticEffect makeMappedCopy(GameObjectMap map) { StaticEffect copy = new StaticEffect(map.map(this.source)); copy.ability = this.ability; - copy.keywordNumber = this.keywordNumber; copy.affectedCards = map.mapCollection(this.affectedCards); copy.affectedPlayers = map.mapList(this.affectedPlayers); - copy.xValue = this.xValue; - copy.yValue = this.yValue; copy.timestamp = this.timestamp; copy.chosenType = this.chosenType; copy.mapParams = this.mapParams; @@ -627,29 +621,6 @@ public class StaticEffect { return this.source; } - /** - *

- * Setter for the field keywordNumber. - *

- * - * @param i - * a int. - */ - public final void setKeywordNumber(final int i) { - this.keywordNumber = i; - } - - /** - *

- * Getter for the field keywordNumber. - *

- * - * @return a int. - */ - public final int getKeywordNumber() { - return this.keywordNumber; - } - /** *

* Getter for the field affectedCards. @@ -692,52 +663,6 @@ public class StaticEffect { this.affectedPlayers = list; } - /** - *

- * Setter for the field xValue. - *

- * - * @param x - * a int. - */ - public final void setXValue(final int x) { - this.xValue = x; - } - - /** - *

- * Getter for the field xValue. - *

- * - * @return a int. - */ - public final int getXValue() { - return this.xValue; - } - - /** - *

- * Setter for the field yValue. - *

- * - * @param y - * a int. - */ - public final void setYValue(final int y) { - this.yValue = y; - } - - /** - *

- * Getter for the field yValue. - *

- * - * @return a int. - */ - public final int getYValue() { - return this.yValue; - } - /** * setParams. TODO Write javadoc for this method. * @@ -788,7 +713,6 @@ public class StaticEffect { String changeColorWordsTo = null; - int keywordMultiplier = 1; boolean setPT = false; String[] addHiddenKeywords = null; String addColors = null; @@ -805,15 +729,6 @@ public class StaticEffect { setPT = true; } - if (params.containsKey("KeywordMultiplier")) { - String multiplier = params.get("KeywordMultiplier"); - if (multiplier.equals("X")) { - keywordMultiplier = getXValue(); - } else { - keywordMultiplier = Integer.valueOf(multiplier); - } - } - if (params.containsKey("AddHiddenKeyword")) { addHiddenKeywords = params.get("AddHiddenKeyword").split(" & "); } @@ -906,9 +821,7 @@ public class StaticEffect { if (addHiddenKeywords != null) { for (final String k : addHiddenKeywords) { - for (int j = 0; j < keywordMultiplier; j++) { - affectedCard.removeHiddenExtrinsicKeyword(k); - } + affectedCard.removeHiddenExtrinsicKeyword(k); } } @@ -949,6 +862,13 @@ public class StaticEffect { affectedCard.removeGoad(getTimestamp()); } + if (params.containsKey("CanBlockAny")) { + affectedCard.removeCanBlockAny(getTimestamp()); + } + if (params.containsKey("CanBlockAmount")) { + affectedCard.removeCanBlockAdditional(getTimestamp()); + } + affectedCard.updateAbilityTextForView(); // only update keywords and text for view to avoid flickering } return affectedCards; diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 4bd8a310b2c..e9c8012375d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -64,7 +64,15 @@ public class PumpEffect extends SpellAbilityEffect { if (redrawPT) { gameCard.updatePowerToughnessForView(); } - + + if (sa.hasParam("CanBlockAny")) { + gameCard.addCanBlockAny(timestamp); + } + if (sa.hasParam("CanBlockAmount")) { + int v = AbilityUtils.calculateAmount(host, sa.getParam("CanBlockAmount"), sa, true); + gameCard.addCanBlockAdditional(v, timestamp); + } + if (sa.hasParam("LeaveBattlefield")) { addLeaveBattlefieldReplacement(gameCard, sa, sa.getParam("LeaveBattlefield")); } @@ -77,6 +85,9 @@ public class PumpEffect extends SpellAbilityEffect { @Override public void run() { gameCard.removePTBoost(timestamp); + boolean updateText = false; + updateText = gameCard.removeCanBlockAny(timestamp) || updateText; + updateText = gameCard.removeCanBlockAdditional(timestamp) || updateText; if (keywords.size() > 0) { @@ -88,6 +99,9 @@ public class PumpEffect extends SpellAbilityEffect { gameCard.removeChangedCardKeywords(timestamp); } gameCard.updatePowerToughnessForView(); + if (updateText) { + gameCard.updateAbilityTextForView(); + } game.fireEvent(new GameEventCardStatsChanged(gameCard)); } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index e877dd900be..7c33c468ddb 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -123,6 +123,8 @@ public class Card extends GameEntity implements Comparable { private final NavigableMap clonedStates = Maps.newTreeMap(); private final NavigableMap textChangeStates = Maps.newTreeMap(); + private final Map canBlockAdditional = Maps.newTreeMap(); + private final Set canBlockAny = Sets.newHashSet(); // changes that say "replace each instance of one [color,type] by another - timestamp is the key of maps private final CardChangedWords changedTextColors = new CardChangedWords(); @@ -2045,6 +2047,17 @@ public class Card extends GameEntity implements Comparable { sb.append("is goaded by: ").append(Lang.joinHomogenous(getGoaded())); sb.append("\r\n"); } + + // maybe move to CardView for better output + if (canBlockAny()) { + sb.append("CARDNAME can block any number of creatures."); + sb.append("\r\n"); + } else if (!canBlockAdditional.isEmpty()){ + sb.append("CARDNAME can block an additional "); + sb.append(Lang.nounWithNumeral(canBlockAdditional(), "creature")); + sb.append(" creatures each combat."); + sb.append("\r\n"); + } // replace triple line feeds with double line feeds int start; final String s = "\r\n\r\n\r\n"; @@ -6224,4 +6237,35 @@ public class Card extends GameEntity implements Comparable { numberTurnActivations.clear(); numberTurnActivationsStatic.clear(); } + + public void addCanBlockAdditional(int n, long timestamp) { + if (n <= 0) { + return; + } + canBlockAdditional.put(timestamp, n); + } + + public boolean removeCanBlockAdditional(long timestamp) { + return canBlockAdditional.remove(timestamp) != null; + } + + public int canBlockAdditional() { + int result = 0; + for (Integer v : canBlockAdditional.values()) { + result += v; + } + return result; + } + + public void addCanBlockAny(long timestamp) { + canBlockAny.add(timestamp); + } + + public boolean removeCanBlockAny(long timestamp) { + return canBlockAny.remove(timestamp) != null; + } + + public boolean canBlockAny() { + return !canBlockAny.isEmpty(); + } } diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index d452b7d8123..9636e19ff5a 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -581,16 +581,6 @@ public class CardView extends GameEntityView { } String nonAbilityText = get(TrackableProperty.NonAbilityText); - int blockAdditional = state.getBlockAdditional(); - if (blockAdditional > 1) { - final StringBuilder ab = new StringBuilder(); - ab.append("CARDNAME can block an additional "); - ab.append(blockAdditional); - ab.append(" creatures each combat."); - nonAbilityText = nonAbilityText.replaceFirst("CARDNAME can block an additional creature each combat.", ab.toString()); - nonAbilityText = nonAbilityText.replaceAll("CARDNAME can block an additional creature each combat.", ""); - nonAbilityText = nonAbilityText.replaceAll("\r\n\r\n\r\n", ""); - } if (!nonAbilityText.isEmpty()) { sb.append("\r\n \r\nNon ability features: \r\n"); sb.append(nonAbilityText.replaceAll("CARDNAME", getName())); @@ -989,9 +979,6 @@ public class CardView extends GameEntityView { return get(TrackableProperty.HasTrample); } - public int getBlockAdditional() { - return get(TrackableProperty.BlockAdditional); - } public String getAbilityText() { return get(TrackableProperty.AbilityText); } @@ -1005,7 +992,6 @@ public class CardView extends GameEntityView { set(TrackableProperty.HasInfect, c.hasKeyword(Keyword.INFECT, state)); set(TrackableProperty.HasStorm, c.hasKeyword(Keyword.STORM, state)); set(TrackableProperty.HasTrample, c.hasKeyword(Keyword.TRAMPLE, state)); - set(TrackableProperty.BlockAdditional, c.getAmountOfKeyword("CARDNAME can block an additional creature each combat.", state)); updateAbilityText(c, state); } diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 50d7c7aae98..1879bbca6d7 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -430,20 +430,13 @@ public class CombatUtil { } public static boolean canBlockMoreCreatures(final Card blocker, final CardCollectionView blockedBy) { - if (blockedBy.isEmpty() || blocker.hasKeyword("CARDNAME can block any number of creatures.")) { + if (blockedBy.isEmpty() || blocker.canBlockAny()) { return true; } - int canBlockMore = numberOfAdditionalCreaturesCanBlock(blocker); + int canBlockMore = blocker.canBlockAdditional(); return canBlockMore >= blockedBy.size(); } - public static int numberOfAdditionalCreaturesCanBlock(final Card blocker) { - // If Wizards makes a few more of these, we should really just make a generic version - return blocker.getAmountOfKeyword("CARDNAME can block an additional creature each combat.") + - blocker.getAmountOfKeyword("CARDNAME can block an additional ninety-nine creatures.") * 99 + - blocker.getAmountOfKeyword("CARDNAME can block an additional seven creatures each combat.") * 7; - } - // can the attacker be blocked at all? /** *

diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index d429b7e3d70..21d4edff7d5 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -166,7 +166,7 @@ public class StaticAbility extends CardTraitBase implements Comparable addHiddenKeywords = Lists.newArrayList(); @@ -186,16 +185,6 @@ public final class StaticAbilityContinuous { toughnessBonus = AbilityUtils.calculateAmount(hostCard, addT, stAb, true); } - if (params.containsKey("KeywordMultiplier")) { - final String multiplier = params.get("KeywordMultiplier"); - if (multiplier.equals("X")) { - keywordMultiplier = AbilityUtils.calculateAmount(hostCard, "X", stAb); - se.setXValue(keywordMultiplier); - } else { - keywordMultiplier = Integer.valueOf(multiplier); - } - } - if (layer == StaticAbilityLayer.ABILITIES2 && params.containsKey("AddKeyword")) { addKeywords = params.get("AddKeyword").split(" & "); final Iterable chosencolors = hostCard.getChosenColors(); @@ -448,9 +437,7 @@ public final class StaticAbilityContinuous { // add keywords if (addKeywords != null) { - for (int i = 0; i < keywordMultiplier; i++) { - p.addChangedKeywords(addKeywords, removeKeywords == null ? new String[0] : removeKeywords, se.getTimestamp()); - } + p.addChangedKeywords(addKeywords, removeKeywords == null ? new String[0] : removeKeywords, se.getTimestamp()); } // add static abilities @@ -577,9 +564,7 @@ public final class StaticAbilityContinuous { // add HIDDEN keywords if (!addHiddenKeywords.isEmpty()) { for (final String k : addHiddenKeywords) { - for (int j = 0; j < keywordMultiplier; j++) { - affectedCard.addHiddenExtrinsicKeyword(k); - } + affectedCard.addHiddenExtrinsicKeyword(k); } } @@ -718,8 +703,17 @@ public final class StaticAbilityContinuous { } } - if (layer == StaticAbilityLayer.RULES && params.containsKey("Goad")) { - affectedCard.addGoad(se.getTimestamp(), hostCard.getController()); + if (layer == StaticAbilityLayer.RULES) { + if (params.containsKey("Goad")) { + affectedCard.addGoad(se.getTimestamp(), hostCard.getController()); + } + if (params.containsKey("CanBlockAny")) { + affectedCard.addCanBlockAny(se.getTimestamp()); + } + if (params.containsKey("CanBlockAmount")) { + int v = AbilityUtils.calculateAmount(hostCard, params.get("CanBlockAmount"), stAb, true); + affectedCard.addCanBlockAdditional(v, se.getTimestamp()); + } } if (mayLookAt != null) { diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 232788992bd..47b975554f9 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -88,7 +88,6 @@ public enum TrackableProperty { HasTrample(TrackableTypes.BooleanType), YouMayLook(TrackableTypes.BooleanType), OpponentMayLook(TrackableTypes.BooleanType), - BlockAdditional(TrackableTypes.IntegerType), AbilityText(TrackableTypes.StringType), NonAbilityText(TrackableTypes.StringType), FoilIndex(TrackableTypes.IntegerType), From 4663c5b06f4a2963ba1fa2b6821f8c1aea4ca5e2 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 1 Sep 2019 10:43:12 +0200 Subject: [PATCH 64/68] cards: update card scripts for can block additional --- .../res/cardsfolder/a/act_of_heroism.txt | 2 +- .../res/cardsfolder/a/anurid_swarmsnapper.txt | 2 +- .../res/cardsfolder/a/avatar_of_hope.txt | 2 +- .../res/cardsfolder/b/blaze_of_glory.txt | 2 +- .../res/cardsfolder/b/brave_the_sands.txt | 2 +- .../res/cardsfolder/c/cenns_tactician.txt | 2 +- .../res/cardsfolder/c/coastline_chimera.txt | 2 +- forge-gui/res/cardsfolder/e/echo_circlet.txt | 2 +- forge-gui/res/cardsfolder/e/entangler.txt | 2 +- .../res/cardsfolder/e/entourage_of_trest.txt | 4 ++-- .../res/cardsfolder/f/foriysian_brigade.txt | 2 +- .../cardsfolder/f/foriysian_interceptor.txt | 2 +- .../res/cardsfolder/f/foriysian_totem.txt | 2 +- .../res/cardsfolder/g/ghastbark_twins.txt | 4 ++-- .../res/cardsfolder/g/give_no_ground.txt | 2 +- .../g/guardian_of_the_gateless.txt | 2 +- forge-gui/res/cardsfolder/h/high_ground.txt | 2 +- .../res/cardsfolder/h/hundred_handed_one.txt | 2 +- .../res/cardsfolder/i/ionas_blessing.txt | 2 +- .../res/cardsfolder/i/ironfist_crusher.txt | 2 +- forge-gui/res/cardsfolder/k/kembas_legion.txt | 2 +- .../res/cardsfolder/k/knight_of_sorrows.txt | 2 +- .../res/cardsfolder/l/lairwatch_giant.txt | 2 +- .../res/cardsfolder/l/luminous_guardian.txt | 2 +- .../res/cardsfolder/m/mounted_archers.txt | 2 +- .../res/cardsfolder/n/night_market_guard.txt | 4 ++-- forge-gui/res/cardsfolder/p/palace_guard.txt | 2 +- .../res/cardsfolder/s/selesnya_sagittars.txt | 2 +- .../cardsfolder/s/spike_tailed_ceratops.txt | 4 ++-- .../tangleclaw_werewolf_fibrous_entangler.txt | 23 ++----------------- .../res/cardsfolder/t/thoughtweft_trio.txt | 2 +- .../res/cardsfolder/t/trueheart_duelist.txt | 4 ++-- .../res/cardsfolder/t/two_headed_dragon.txt | 2 +- .../t/two_headed_giant_of_foriys.txt | 2 +- .../t/two_headed_giant_of_foriys_avatar.txt | 4 ++-- .../res/cardsfolder/v/valor_made_real.txt | 2 +- .../res/cardsfolder/v/vanguards_shield.txt | 2 +- forge-gui/res/cardsfolder/w/wall_of_glare.txt | 2 +- .../res/cardsfolder/w/watcher_in_the_web.txt | 4 ++-- forge-gui/res/cardsfolder/y/yare.txt | 2 +- 40 files changed, 48 insertions(+), 67 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/act_of_heroism.txt b/forge-gui/res/cardsfolder/a/act_of_heroism.txt index 2052d53734a..9b7127436b9 100644 --- a/forge-gui/res/cardsfolder/a/act_of_heroism.txt +++ b/forge-gui/res/cardsfolder/a/act_of_heroism.txt @@ -2,6 +2,6 @@ Name:Act of Heroism ManaCost:1 W Types:Instant A:SP$ Untap | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBPump | SpellDescription$ Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn. -SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ +2 | KW$ CARDNAME can block an additional creature each combat. +SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ +2 | CanBlockAmount$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/act_of_heroism.jpg Oracle:Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt b/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt index affd95a84f2..ae4329ff07b 100644 --- a/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt +++ b/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Frog Beast PT:1/4 K:Reach -A:AB$ Pump | Cost$ 1 G | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ 1 G | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/anurid_swarmsnapper.jpg Oracle:Reach (This creature can block creatures with flying.)\n{1}{G}: Anurid Swarmsnapper can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/a/avatar_of_hope.txt b/forge-gui/res/cardsfolder/a/avatar_of_hope.txt index 9c647850ee1..c925f3c80f5 100644 --- a/forge-gui/res/cardsfolder/a/avatar_of_hope.txt +++ b/forge-gui/res/cardsfolder/a/avatar_of_hope.txt @@ -4,7 +4,7 @@ Types:Creature Avatar PT:4/9 S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 6 | EffectZone$ All | CheckSVar$ NeedHope | SVarCompare$ LE3 | Description$ If you have 3 or less life, CARDNAME costs {6} less to cast. K:Flying -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:NeedHope:Count$YourLifeTotal SVar:Picture:http://www.wizards.com/global/images/magic/general/avatar_of_hope.jpg Oracle:If you have 3 or less life, this spell costs {6} less to cast.\nFlying\nAvatar of Hope can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/b/blaze_of_glory.txt b/forge-gui/res/cardsfolder/b/blaze_of_glory.txt index 4834b48c1dc..9c04e8eba0d 100644 --- a/forge-gui/res/cardsfolder/b/blaze_of_glory.txt +++ b/forge-gui/res/cardsfolder/b/blaze_of_glory.txt @@ -1,7 +1,7 @@ Name:Blaze of Glory ManaCost:W Types:Instant -A:SP$ Pump | Cost$ W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | KW$ HIDDEN CARDNAME can block any number of creatures. | SubAbility$ GoingDownInStyle | ActivationPhases$ BeginCombat->Declare Attackers | StackDescription$ {c:Targeted} can block any number of creatures this turn. It blocks each attacking creature this turn if able. | SpellDescription$ Cast CARDNAME only during combat before blockers are declared. Target creature defending player controls can block any number of creatures this turn. It blocks each attacking creature this turn if able. +A:SP$ Pump | Cost$ W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | CanBlockAny$ True | SubAbility$ GoingDownInStyle | ActivationPhases$ BeginCombat->Declare Attackers | StackDescription$ {c:Targeted} can block any number of creatures this turn. It blocks each attacking creature this turn if able. | SpellDescription$ Cast CARDNAME only during combat before blockers are declared. Target creature defending player controls can block any number of creatures this turn. It blocks each attacking creature this turn if able. SVar:GoingDownInStyle:DB$ MustBlock | Defined$ ParentTarget | DefinedAttacker$ Valid Card.attacking | BlockAllDefined$ True | StackDescription$ None AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blaze_of_glory.jpg diff --git a/forge-gui/res/cardsfolder/b/brave_the_sands.txt b/forge-gui/res/cardsfolder/b/brave_the_sands.txt index f8fc947dec6..e423f20ec3d 100644 --- a/forge-gui/res/cardsfolder/b/brave_the_sands.txt +++ b/forge-gui/res/cardsfolder/b/brave_the_sands.txt @@ -2,7 +2,7 @@ Name:Brave the Sands ManaCost:1 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddKeyword$ Vigilance | Description$ Creatures you control have vigilance. -S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.YouCtrl | CanBlockAmount$ 1 | Description$ Each creature you control can block an additional creature each combat. SVar:NonStackingEffect:True SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/brave_the_sands.jpg diff --git a/forge-gui/res/cardsfolder/c/cenns_tactician.txt b/forge-gui/res/cardsfolder/c/cenns_tactician.txt index 613adaa7e18..39de7253d3d 100644 --- a/forge-gui/res/cardsfolder/c/cenns_tactician.txt +++ b/forge-gui/res/cardsfolder/c/cenns_tactician.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Kithkin Soldier PT:1/1 A:AB$ PutCounter | Cost$ W T | ValidTgts$ Creature.Soldier | TgtPrompt$ Select target soldier creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target Soldier creature. -S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control with a +1/+1 counter on it can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | CanBlockAmount$ 1 | Description$ Each creature you control with a +1/+1 counter on it can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/cenns_tactician.jpg Oracle:{W}, {T}: Put a +1/+1 counter on target Soldier creature.\nEach creature you control with a +1/+1 counter on it can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/c/coastline_chimera.txt b/forge-gui/res/cardsfolder/c/coastline_chimera.txt index 934123897f6..9041b5b6cfd 100644 --- a/forge-gui/res/cardsfolder/c/coastline_chimera.txt +++ b/forge-gui/res/cardsfolder/c/coastline_chimera.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Creature Chimera PT:1/5 K:Flying -A:AB$ Pump | Cost$ 1 W | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ 1 W | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/coastline_chimera.jpg Oracle:Flying\n{1}{W}: Coastline Chimera can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/e/echo_circlet.txt b/forge-gui/res/cardsfolder/e/echo_circlet.txt index 38743d1c66d..4ff2047aeee 100644 --- a/forge-gui/res/cardsfolder/e/echo_circlet.txt +++ b/forge-gui/res/cardsfolder/e/echo_circlet.txt @@ -2,6 +2,6 @@ Name:Echo Circlet ManaCost:2 Types:Artifact Equipment K:Equip:1 -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Equipped creature can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | CanBlockAmount$ 1 | Description$ Equipped creature can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_circlet.jpg Oracle:Equipped creature can block an additional creature each combat.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/e/entangler.txt b/forge-gui/res/cardsfolder/e/entangler.txt index 98668f72c4d..e876b4aab98 100644 --- a/forge-gui/res/cardsfolder/e/entangler.txt +++ b/forge-gui/res/cardsfolder/e/entangler.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 W W | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can block any number of creatures. | Description$ Enchanted creature can block any number of creatures. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | CanBlockAny$ True | Description$ Enchanted creature can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/entangler.jpg Oracle:Enchant creature\nEnchanted creature can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/e/entourage_of_trest.txt b/forge-gui/res/cardsfolder/e/entourage_of_trest.txt index a82d59e278b..8b0c23ee88b 100644 --- a/forge-gui/res/cardsfolder/e/entourage_of_trest.txt +++ b/forge-gui/res/cardsfolder/e/entourage_of_trest.txt @@ -4,6 +4,6 @@ Types:Creature Elf Soldier PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMonarch | TriggerDescription$ When CARDNAME enters the battlefield, you become the monarch. SVar:TrigMonarch:DB$ BecomeMonarch | Defined$ You -S:Mode$ Continuous | Affected$ Card.Self | Condition$ You.isMonarch | AddKeyword$ CARDNAME can block an additional creature each combat. | Description$ CARDNAME can block an additional creature each combat as long as you're the monarch. +S:Mode$ Continuous | Affected$ Card.Self | Condition$ You.isMonarch | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat as long as you're the monarch. SVar:Picture:http://www.wizards.com/global/images/magic/general/entourage_of_trest.jpg -Oracle:When Entourage of Trest enters the battlefield, you become the monarch.\nEntourage of Trest can block an additional creature each combat as long as you're the monarch. \ No newline at end of file +Oracle:When Entourage of Trest enters the battlefield, you become the monarch.\nEntourage of Trest can block an additional creature each combat as long as you're the monarch. diff --git a/forge-gui/res/cardsfolder/f/foriysian_brigade.txt b/forge-gui/res/cardsfolder/f/foriysian_brigade.txt index 036019926c1..7593086bafa 100644 --- a/forge-gui/res/cardsfolder/f/foriysian_brigade.txt +++ b/forge-gui/res/cardsfolder/f/foriysian_brigade.txt @@ -2,6 +2,6 @@ Name:Foriysian Brigade ManaCost:3 W Types:Creature Human Soldier PT:2/4 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/foriysian_brigade.jpg Oracle:Foriysian Brigade can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt b/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt index effcce187bb..6bc1f0fc258 100644 --- a/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt +++ b/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:0/5 K:Flash K:Defender -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/foriysian_interceptor.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nDefender\nForiysian Interceptor can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/f/foriysian_totem.txt b/forge-gui/res/cardsfolder/f/foriysian_totem.txt index fd96f56d4ed..573f8a3891e 100644 --- a/forge-gui/res/cardsfolder/f/foriysian_totem.txt +++ b/forge-gui/res/cardsfolder/f/foriysian_totem.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Animate | Cost$ 4 R | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Artifact,Creature,Giant | Colors$ Red | Keywords$ Trample | SpellDescription$ CARDNAME becomes a 4/4 red Giant artifact creature with trample until end of turn. -S:Mode$ Continuous | Affected$ Creature.Self | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ As long as CARDNAME is a creature, it can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.Self | CanBlockAmount$ 1 | Description$ As long as CARDNAME is a creature, it can block an additional creature each combat. DeckNeeds:Color$Red #TODO: The AI won't block multiple creatures yet, it seems. Can be improved. SVar:Picture:http://www.wizards.com/global/images/magic/general/foriysian_totem.jpg diff --git a/forge-gui/res/cardsfolder/g/ghastbark_twins.txt b/forge-gui/res/cardsfolder/g/ghastbark_twins.txt index 345eebe9ef7..cd8f7c7cceb 100644 --- a/forge-gui/res/cardsfolder/g/ghastbark_twins.txt +++ b/forge-gui/res/cardsfolder/g/ghastbark_twins.txt @@ -1,7 +1,7 @@ Name:Ghastbark Twins ManaCost:5 G G Types:Creature Treefolk +PT:7/7 K:Trample -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nGhastbark Twins can block an additional creature each combat. -PT:7/7 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/give_no_ground.txt b/forge-gui/res/cardsfolder/g/give_no_ground.txt index dccad2edbcf..d77822c38d3 100644 --- a/forge-gui/res/cardsfolder/g/give_no_ground.txt +++ b/forge-gui/res/cardsfolder/g/give_no_ground.txt @@ -1,6 +1,6 @@ Name:Give No Ground ManaCost:3 W Types:Instant -A:SP$ Pump | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +6 | AddHiddenKeyword$ CARDNAME can block any number of creatures. | SpellDescription$ Target creature gets +2/+6 and can block any number of creatures this turn. +A:SP$ Pump | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +6 | CanBlockAny$ True | SpellDescription$ Target creature gets +2/+6 and can block any number of creatures this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/give_no_ground.jpg Oracle:Target creature gets +2/+6 and can block any number of creatures this turn. diff --git a/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt b/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt index 9ee1627543e..ba79078d93f 100644 --- a/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt +++ b/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt @@ -3,7 +3,7 @@ ManaCost:4 W Types:Creature Angel PT:3/3 K:Flying -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +1/+1 until end of turn for each creature it's blocking. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | NumDef$ X | References$ X SVar:X:Count$Valid Creature.blockedBySource diff --git a/forge-gui/res/cardsfolder/h/high_ground.txt b/forge-gui/res/cardsfolder/h/high_ground.txt index 743af4eb4a3..673b11004ad 100644 --- a/forge-gui/res/cardsfolder/h/high_ground.txt +++ b/forge-gui/res/cardsfolder/h/high_ground.txt @@ -1,6 +1,6 @@ Name:High Ground ManaCost:W Types:Enchantment -S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.YouCtrl | CanBlockAmount$ 1 | Description$ Each creature you control can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/high_ground.jpg Oracle:Each creature you control can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/h/hundred_handed_one.txt b/forge-gui/res/cardsfolder/h/hundred_handed_one.txt index 4cdf94ba357..18d6f075025 100644 --- a/forge-gui/res/cardsfolder/h/hundred_handed_one.txt +++ b/forge-gui/res/cardsfolder/h/hundred_handed_one.txt @@ -4,7 +4,7 @@ Types:Creature Giant PT:3/5 K:Vigilance K:Monstrosity:3:3 W W W -S:Mode$ Continuous | Affected$ Card.Self+IsMonstrous | AddKeyword$ Reach & CARDNAME can block an additional ninety-nine creatures each combat. | Description$ As long as CARDNAME is monstrous, it has reach and can block an additional ninety-nine creatures each combat. +S:Mode$ Continuous | Affected$ Card.Self+IsMonstrous | AddKeyword$ Reach | CanBlockAmount$ 99 | Description$ As long as CARDNAME is monstrous, it has reach and can block an additional ninety-nine creatures each combat. DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/hundred_handed_one.jpg Oracle:Vigilance\n{3}{W}{W}{W}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.)\nAs long as Hundred-Handed One is monstrous, it has reach and can block an additional ninety-nine creatures each combat. diff --git a/forge-gui/res/cardsfolder/i/ionas_blessing.txt b/forge-gui/res/cardsfolder/i/ionas_blessing.txt index 13708dcafdf..4df8dc72a55 100644 --- a/forge-gui/res/cardsfolder/i/ionas_blessing.txt +++ b/forge-gui/res/cardsfolder/i/ionas_blessing.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 3 W | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Enchanted creature gets +2/+2, has vigilance, and can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | CanBlockAmount$ 1 | Description$ Enchanted creature gets +2/+2, has vigilance, and can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/ionas_blessing.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2, has vigilance, and can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/i/ironfist_crusher.txt b/forge-gui/res/cardsfolder/i/ironfist_crusher.txt index 76953216b1d..5f2cbbef88f 100644 --- a/forge-gui/res/cardsfolder/i/ironfist_crusher.txt +++ b/forge-gui/res/cardsfolder/i/ironfist_crusher.txt @@ -2,7 +2,7 @@ Name:Ironfist Crusher ManaCost:4 W Types:Creature Human Soldier PT:2/4 -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. K:Morph:3 W SVar:Picture:http://www.wizards.com/global/images/magic/general/ironfist_crusher.jpg Oracle:Ironfist Crusher can block any number of creatures.\nMorph {3}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/k/kembas_legion.txt b/forge-gui/res/cardsfolder/k/kembas_legion.txt index a9e89be1ca3..b8ce046c287 100644 --- a/forge-gui/res/cardsfolder/k/kembas_legion.txt +++ b/forge-gui/res/cardsfolder/k/kembas_legion.txt @@ -3,7 +3,7 @@ ManaCost:5 W W Types:Creature Cat Soldier PT:4/6 K:Vigilance -S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | KeywordMultiplier$ X | Description$ CARDNAME can block an additional creature each combat for each Equipment attached to CARDNAME. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ X | References$ X | Description$ CARDNAME can block an additional creature each combat for each Equipment attached to CARDNAME. SVar:X:Count$Valid Equipment.Attached SVar:Picture:http://www.wizards.com/global/images/magic/general/kembas_legion.jpg SVar:EquipMe:Multiple diff --git a/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt b/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt index 4e38776c875..0c6f7e3af07 100644 --- a/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt +++ b/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt @@ -2,7 +2,7 @@ Name:Knight of Sorrows ManaCost:4 W Types:Creature Human Knight PT:3/3 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. K:Afterlife:1 DeckHas:Ability$Token Oracle:Knight of Sorrows can block an additional creature each combat.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/l/lairwatch_giant.txt b/forge-gui/res/cardsfolder/l/lairwatch_giant.txt index 9ab7f303d22..270f0ea6387 100644 --- a/forge-gui/res/cardsfolder/l/lairwatch_giant.txt +++ b/forge-gui/res/cardsfolder/l/lairwatch_giant.txt @@ -2,7 +2,7 @@ Name:Lairwatch Giant ManaCost:5 W Types:Creature Giant Warrior PT:5/3 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. T:Mode$ Blocks | ValidCard$ Card.Self | CheckSVar$ X | NoResolvingCheck$ True | SVarCompare$ GE2 | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks two or more creatures, it gains first strike until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. SVar:X:Count$Valid Creature.blockedBySource diff --git a/forge-gui/res/cardsfolder/l/luminous_guardian.txt b/forge-gui/res/cardsfolder/l/luminous_guardian.txt index 6dee45f14de..61b27a4f768 100644 --- a/forge-gui/res/cardsfolder/l/luminous_guardian.txt +++ b/forge-gui/res/cardsfolder/l/luminous_guardian.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Human Nomad PT:1/4 A:AB$ Pump | Cost$ W | Defined$ Self | NumDef$ 1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -A:AB$ Pump | Cost$ 2 | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ 2 | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/luminous_guardian.jpg Oracle:{W}: Luminous Guardian gets +0/+1 until end of turn.\n{2}: Luminous Guardian can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/m/mounted_archers.txt b/forge-gui/res/cardsfolder/m/mounted_archers.txt index aed5f718c18..b1d2be563f7 100644 --- a/forge-gui/res/cardsfolder/m/mounted_archers.txt +++ b/forge-gui/res/cardsfolder/m/mounted_archers.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Human Soldier Archer PT:2/3 K:Reach -A:AB$ Pump | Cost$ W | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ W | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/mounted_archers.jpg Oracle:Reach (This creature can block creatures with flying.)\n{W}: Mounted Archers can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/n/night_market_guard.txt b/forge-gui/res/cardsfolder/n/night_market_guard.txt index fde1f44b062..12e693a737a 100644 --- a/forge-gui/res/cardsfolder/n/night_market_guard.txt +++ b/forge-gui/res/cardsfolder/n/night_market_guard.txt @@ -2,6 +2,6 @@ Name:Night Market Guard ManaCost:3 Types:Artifact Creature Construct PT:3/1 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/night_market_guard.jpg -Oracle:Night Market Guard can block an additional creature each combat. \ No newline at end of file +Oracle:Night Market Guard can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/p/palace_guard.txt b/forge-gui/res/cardsfolder/p/palace_guard.txt index 47a1f4bb919..cb2bf7f3e90 100644 --- a/forge-gui/res/cardsfolder/p/palace_guard.txt +++ b/forge-gui/res/cardsfolder/p/palace_guard.txt @@ -2,6 +2,6 @@ Name:Palace Guard ManaCost:2 W Types:Creature Human Soldier PT:1/4 -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/palace_guard.jpg Oracle:Palace Guard can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt b/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt index fa6614fd227..ea7f32e53b6 100644 --- a/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt +++ b/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt @@ -3,6 +3,6 @@ ManaCost:3 G W Types:Creature Elf Archer PT:2/5 K:Reach -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_sagittars.jpg Oracle:Reach (This creature can block creatures with flying.)\nSelesnya Sagittars can block an additional creature each combat diff --git a/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt b/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt index 6fe1a1e9547..6e84ba97e92 100644 --- a/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt +++ b/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt @@ -2,6 +2,6 @@ Name:Spike-Tailed Ceratops ManaCost:4 G Types:Creature Dinosaur PT:4/4 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_tailed_ceratops.jpg -Oracle:Spike-Tailed Ceratops can block an additional creature each combat. \ No newline at end of file +Oracle:Spike-Tailed Ceratops can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt b/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt index e66cae7ddd6..46defcba3d4 100644 --- a/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt +++ b/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt @@ -1,41 +1,22 @@ Name:Tangleclaw Werewolf - ManaCost:2 G G - Types:Creature Werewolf Horror - PT:2/4 - -K:CARDNAME can block an additional creature each combat. - +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. A:AB$SetState | Cost$ 6 G | Defined$ Self | Mode$ Transform | SpellDescription$ Transform CARDNAME. - SVar:Picture:http://www.wizards.com/global/images/magic/general/tangleclaw_werewolf.jpg - AlternateMode:DoubleFaced - Oracle:Tangleclaw Werewolf can block an additional creature each combat.\n{6}{G}: Transform Tangleclaw Werewolf. - - ALTERNATE - Name:Fibrous Entangler - ManaCost:no cost - Types:Creature Eldrazi Werewolf - PT:4/6 - K:Vigilance - K:CARDNAME must be blocked if able. - -K:CARDNAME can block an additional creature each combat. - +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/fibrous_entangler.jpg - Oracle:Vigilance\nFibrous Entangler must be blocked if able.\nFibrous Entangler can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt b/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt index a3388561ea8..a6eca7e32cb 100644 --- a/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt +++ b/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt @@ -5,6 +5,6 @@ PT:5/5 K:First Strike K:Vigilance K:Champion:Kithkin -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtweft_trio.jpg Oracle:First strike, vigilance\nChampion a Kithkin (When this enters the battlefield, sacrifice it unless you exile another Kithkin you control. When this leaves the battlefield, that card returns to the battlefield.)\nThoughtweft Trio can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/t/trueheart_duelist.txt b/forge-gui/res/cardsfolder/t/trueheart_duelist.txt index 6133dad36ef..842e8c74369 100644 --- a/forge-gui/res/cardsfolder/t/trueheart_duelist.txt +++ b/forge-gui/res/cardsfolder/t/trueheart_duelist.txt @@ -2,8 +2,8 @@ Name:Trueheart Duelist ManaCost:1 W Types:Creature Human Warrior PT:2/2 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. K:Embalm:2 W DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/trueheart_duelist.jpg -Oracle:Trueheart Duelist can block an additional creature each combat.\nEmbalm {2}{W} ({2}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie Human Warrior with no mana cost. Embalm only as a sorcery.) \ No newline at end of file +Oracle:Trueheart Duelist can block an additional creature each combat.\nEmbalm {2}{W} ({2}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie Human Warrior with no mana cost. Embalm only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/t/two_headed_dragon.txt b/forge-gui/res/cardsfolder/t/two_headed_dragon.txt index 88952a8c92f..c104e2a08bd 100644 --- a/forge-gui/res/cardsfolder/t/two_headed_dragon.txt +++ b/forge-gui/res/cardsfolder/t/two_headed_dragon.txt @@ -4,7 +4,7 @@ Types:Creature Dragon PT:4/4 K:Flying K:Menace -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. A:AB$ Pump | Cost$ 1 R | NumAtt$ +2 | NumDef$ +0 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/two_headed_dragon.jpg Oracle:Flying\nMenace (This creature can't be blocked except by two or more creatures.)\nTwo-Headed Dragon can block an additional creature each combat.\n{1}{R}: Two-Headed Dragon gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt index d408f474bdf..09c8eef1615 100644 --- a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt +++ b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Creature Giant PT:4/4 K:Trample -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/two_headed_giant_of_foriys.jpg Oracle:Trample\nTwo-Headed Giant of Foriys can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt index e8cb3bc6ded..2c9038a5e81 100644 --- a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt +++ b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+1/-4 S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddKeyword$ Menace | Description$ Creatures you control have menace. (They can't be blocked except by two or more creatures.) -S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control can block an additional creature each combat. +S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | CanBlockAmount$ 1 | Description$ Each creature you control can block an additional creature each combat. SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Two-Headed Giant of Foriys Avatar.full.jpg -Oracle:Hand +1, life -4\nCreatures you control have menace. (They can't be blocked except by two or more creatures.)\nEach creature you control can block an additional creature each combat. \ No newline at end of file +Oracle:Hand +1, life -4\nCreatures you control have menace. (They can't be blocked except by two or more creatures.)\nEach creature you control can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/v/valor_made_real.txt b/forge-gui/res/cardsfolder/v/valor_made_real.txt index f379a1c3649..e8d4b21359a 100644 --- a/forge-gui/res/cardsfolder/v/valor_made_real.txt +++ b/forge-gui/res/cardsfolder/v/valor_made_real.txt @@ -1,7 +1,7 @@ Name:Valor Made Real ManaCost:W Types:Instant -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can block any number of creatures. | SpellDescription$ Target creature can block any number of creatures this turn. +A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | CanBlockAny$ True | SpellDescription$ Target creature can block any number of creatures this turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/valor_made_real.jpg Oracle:Target creature can block any number of creatures this turn. diff --git a/forge-gui/res/cardsfolder/v/vanguards_shield.txt b/forge-gui/res/cardsfolder/v/vanguards_shield.txt index d4a6ebdd5e2..b93594e1094 100644 --- a/forge-gui/res/cardsfolder/v/vanguards_shield.txt +++ b/forge-gui/res/cardsfolder/v/vanguards_shield.txt @@ -2,6 +2,6 @@ Name:Vanguard's Shield ManaCost:2 Types:Artifact Equipment K:Equip:3 -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | AddToughness$ 3 | Description$ Equipped creature gets +0/+3 and can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | CanBlockAmount$ 1 | AddToughness$ 3 | Description$ Equipped creature gets +0/+3 and can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/vanguards_shield.jpg Oracle:Equipped creature gets +0/+3 and can block an additional creature each combat.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/w/wall_of_glare.txt b/forge-gui/res/cardsfolder/w/wall_of_glare.txt index dfd1b83510a..18b87e38225 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_glare.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_glare.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Creature Wall PT:0/5 K:Defender -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_glare.jpg Oracle:Defender (This creature can't attack.)\nWall of Glare can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt b/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt index 17bafa233a8..a83ed2e9075 100644 --- a/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt +++ b/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt @@ -3,5 +3,5 @@ ManaCost:4 G Types:Creature Spider PT:2/5 K:Reach -K:CARDNAME can block an additional seven creatures each combat. -Oracle:Reach (This creature can block creatures with flying.)\nWatcher in the Web can block an additional seven creatures each combat. \ No newline at end of file +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 7 | Description$ CARDNAME can block an additional seven creatures each combat. +Oracle:Reach (This creature can block creatures with flying.)\nWatcher in the Web can block an additional seven creatures each combat. diff --git a/forge-gui/res/cardsfolder/y/yare.txt b/forge-gui/res/cardsfolder/y/yare.txt index 22465525609..8ff601136a8 100644 --- a/forge-gui/res/cardsfolder/y/yare.txt +++ b/forge-gui/res/cardsfolder/y/yare.txt @@ -1,7 +1,7 @@ Name:Yare ManaCost:2 W Types:Instant -A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | NumAtt$ 3 | KW$ HIDDEN CARDNAME can block an additional creature each combat. & HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. +A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | NumAtt$ 3 | CanBlockAmount$ 2 | SpellDescription$ Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/yare.jpg Oracle:Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. From e21f23f9ab136ccac05edeac8da0eb2366b72cb8 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 1 Sep 2019 20:50:45 +0200 Subject: [PATCH 65/68] Card: fix code --- forge-game/src/main/java/forge/game/card/Card.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 7c33c468ddb..b62d6ab0312 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6262,7 +6262,7 @@ public class Card extends GameEntity implements Comparable { } public boolean removeCanBlockAny(long timestamp) { - return canBlockAny.remove(timestamp) != null; + return canBlockAny.remove(timestamp); } public boolean canBlockAny() { From ad2565305fd1b26423b1281b0b62d848a6e61152 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 2 Sep 2019 09:04:07 +0300 Subject: [PATCH 66/68] - Rewire the AI support for AttachAi and PumpAi --- .../main/java/forge/ai/ability/AttachAi.java | 17 +++++++++++++---- .../src/main/java/forge/ai/ability/PumpAi.java | 2 ++ .../main/java/forge/ai/ability/PumpAiBase.java | 18 ++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index a33a8a1e84d..bbf17fa1069 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -1145,6 +1145,7 @@ public class AttachAi extends SpellAbilityAi { int totPower = 0; final List keywords = new ArrayList<>(); boolean grantingAbilities = false; + boolean grantingExtraBlock = false; for (final StaticAbility stAbility : attachSource.getStaticAbilities()) { final Map stabMap = stAbility.getMapParams(); @@ -1163,6 +1164,7 @@ public class AttachAi extends SpellAbilityAi { totPower += AbilityUtils.calculateAmount(attachSource, stabMap.get("AddPower"), stAbility); grantingAbilities |= stabMap.containsKey("AddAbility"); + grantingExtraBlock |= stabMap.containsKey("CanBlockAmount") || stabMap.containsKey("CanBlockAny"); String kws = stabMap.get("AddKeyword"); if (kws != null) { @@ -1192,20 +1194,27 @@ public class AttachAi extends SpellAbilityAi { } //only add useful keywords unless P/T bonus is significant - if (totToughness + totPower < 4 && !keywords.isEmpty()) { + if (totToughness + totPower < 4 && (!keywords.isEmpty() || grantingExtraBlock)) { final int pow = totPower; + final boolean extraBlock = grantingExtraBlock; prefList = CardLists.filter(prefList, new Predicate() { @Override public boolean apply(final Card c) { - for (final String keyword : keywords) { - if (isUsefulAttachKeyword(keyword, c, sa, pow)) { - return true; + if (!keywords.isEmpty()) { + for (final String keyword : keywords) { + if (isUsefulAttachKeyword(keyword, c, sa, pow)) { + return true; + } } } + if (c.hasKeyword(Keyword.INFECT) && pow >= 2) { // consider +2 power a significant bonus on Infect creatures return true; } + if (extraBlock && CombatUtil.canBlock(c, true) && !c.canBlockAny()) { + return true; + } return false; } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index d29e5c39c0d..31c4c7a8ddd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -387,6 +387,8 @@ public class PumpAi extends PumpAiBase { return ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped); } + return true; + } else if (grantsUsefulExtraBlockOpts(ai, card)) { return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 9f2f3c61fff..eb2ab18e1d1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -37,6 +37,24 @@ public abstract class PumpAiBase extends SpellAbilityAi { } + public boolean grantsUsefulExtraBlockOpts(final Player ai, final Card card) { + PhaseHandler ph = ai.getGame().getPhaseHandler(); + if (ph.isPlayerTurn(ai) || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { + return false; + } + int canBlockNum = 1 + card.canBlockAdditional(); + int possibleBlockNum = 0; + for (Card attacker : ai.getGame().getCombat().getAttackers()) { + if (CombatUtil.canBlock(attacker, card)) { + possibleBlockNum++; + if (possibleBlockNum > canBlockNum) { + break; + } + } + } + return possibleBlockNum > canBlockNum; + } + /** * Checks if is useful keyword. * From d11fc1b6fe0cb86103505a50b7023f0d7064245a Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 2 Sep 2019 09:29:04 +0300 Subject: [PATCH 67/68] - Rewire AI logic for AiAttackController. --- .../main/java/forge/ai/AiAttackController.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index b120235014f..51798704399 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -563,15 +563,19 @@ public class AiAttackController { if (remainingAttackers.isEmpty() || maxBlockersAfterCrew == 0) { break; } - // TODO replace with better amount - if (blocker.hasKeyword("CARDNAME can block an additional creature each combat.")) { - blockedAttackers.add(remainingAttackers.get(0)); - remainingAttackers.remove(0); - maxBlockersAfterCrew--; - if (remainingAttackers.isEmpty()) { - break; + + int numExtraBlocks = blocker.canBlockAdditional(); + if (numExtraBlocks > 0) { + while (numExtraBlocks-- > 0 && !remainingAttackers.isEmpty()) { + blockedAttackers.add(remainingAttackers.get(0)); + remainingAttackers.remove(0); + maxBlockersAfterCrew--; } } + + if (remainingAttackers.isEmpty()) { + break; + } blockedAttackers.add(remainingAttackers.get(0)); remainingAttackers.remove(0); maxBlockersAfterCrew--; From 51e231a08e32d1e59776dee17083fee0121c658c Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 7 Sep 2019 17:36:55 +0200 Subject: [PATCH 68/68] CanBlockAdditional: moved to CardView for better display --- .../game/ability/effects/PumpEffect.java | 24 ++++++++++++++- .../src/main/java/forge/game/card/Card.java | 26 ++++++++-------- .../main/java/forge/game/card/CardView.java | 30 +++++++++++++++++++ .../forge/trackable/TrackableProperty.java | 2 ++ 4 files changed, 68 insertions(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index e9c8012375d..1c89e3a66ff 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -203,7 +203,12 @@ public class PumpEffect extends SpellAbilityEffect { final int atk = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumAtt"), sa, true); final int def = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDef"), sa, true); - sb.append("gains "); + boolean gains = sa.hasParam("NumAtt") || sa.hasParam("NumDef") || !keywords.isEmpty(); + + if (gains) { + sb.append("gains "); + } + if (sa.hasParam("NumAtt") || sa.hasParam("NumDef")) { if (atk >= 0) { sb.append("+"); @@ -221,8 +226,25 @@ public class PumpEffect extends SpellAbilityEffect { sb.append(keywords.get(i)).append(" "); } + if (sa.hasParam("CanBlockAny")) { + if (gains) { + sb.append(" and "); + } + sb.append("can block any number of creatures "); + } else if (sa.hasParam("CanBlockAmount")) { + if (gains) { + sb.append(" and "); + } + String n = sa.getParam("CanBlockAmount"); + sb.append("can block an additional "); + sb.append("1".equals(n) ? "creature" : Lang.nounWithNumeral(n, "creature")); + sb.append(" each combat "); + } + if (!sa.hasParam("Permanent")) { sb.append("until end of turn."); + } else { + sb.append("."); } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index b62d6ab0312..9a10954b1f2 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2048,16 +2048,6 @@ public class Card extends GameEntity implements Comparable { sb.append("\r\n"); } - // maybe move to CardView for better output - if (canBlockAny()) { - sb.append("CARDNAME can block any number of creatures."); - sb.append("\r\n"); - } else if (!canBlockAdditional.isEmpty()){ - sb.append("CARDNAME can block an additional "); - sb.append(Lang.nounWithNumeral(canBlockAdditional(), "creature")); - sb.append(" creatures each combat."); - sb.append("\r\n"); - } // replace triple line feeds with double line feeds int start; final String s = "\r\n\r\n\r\n"; @@ -6243,12 +6233,17 @@ public class Card extends GameEntity implements Comparable { return; } canBlockAdditional.put(timestamp, n); + getView().updateBlockAdditional(this); } public boolean removeCanBlockAdditional(long timestamp) { - return canBlockAdditional.remove(timestamp) != null; + boolean result = canBlockAdditional.remove(timestamp) != null; + if (result) { + getView().updateBlockAdditional(this); + } + return result; } - + public int canBlockAdditional() { int result = 0; for (Integer v : canBlockAdditional.values()) { @@ -6259,10 +6254,15 @@ public class Card extends GameEntity implements Comparable { public void addCanBlockAny(long timestamp) { canBlockAny.add(timestamp); + getView().updateBlockAdditional(this); } public boolean removeCanBlockAny(long timestamp) { - return canBlockAny.remove(timestamp); + boolean result = canBlockAny.remove(timestamp); + if (result) { + getView().updateBlockAdditional(this); + } + return result; } public boolean canBlockAny() { diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 9636e19ff5a..732cb4374a8 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -18,6 +18,7 @@ import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; import forge.trackable.Tracker; +import forge.util.Lang; import forge.util.collect.FCollectionView; import org.apache.commons.lang3.StringUtils; @@ -608,6 +609,22 @@ public class CardView extends GameEntityView { sb.append("\r\n"); } + if (getCanBlockAny()) { + sb.append("\r\n\r\n"); + sb.append("CARDNAME can block any number of creatures.".replaceAll("CARDNAME", getName())); + sb.append("\r\n"); + } else { + int i = getBlockAdditional(); + if (i > 0) { + sb.append("\r\n\r\n"); + sb.append("CARDNAME can block an additional ".replaceAll("CARDNAME", getName())); + sb.append(i == 1 ? "creature" : Lang.nounWithNumeral(i, "creature")); + sb.append(" each combat."); + sb.append("\r\n"); + } + + } + String cloner = get(TrackableProperty.Cloner); if (!cloner.isEmpty()) { sb.append("\r\nCloned by: ").append(cloner); @@ -712,6 +729,19 @@ public class CardView extends GameEntityView { set(TrackableProperty.HiddenId, hiddenId); } + int getBlockAdditional() { + return get(TrackableProperty.BlockAdditional); + } + + boolean getCanBlockAny() { + return get(TrackableProperty.BlockAny); + } + + void updateBlockAdditional(Card c) { + set(TrackableProperty.BlockAdditional, c.canBlockAdditional()); + set(TrackableProperty.BlockAny, c.canBlockAny()); + } + @Override public String toString() { String name = getName(); diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 47b975554f9..1f446791f85 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -88,6 +88,8 @@ public enum TrackableProperty { HasTrample(TrackableTypes.BooleanType), YouMayLook(TrackableTypes.BooleanType), OpponentMayLook(TrackableTypes.BooleanType), + BlockAdditional(TrackableTypes.IntegerType), + BlockAny(TrackableTypes.BooleanType), AbilityText(TrackableTypes.StringType), NonAbilityText(TrackableTypes.StringType), FoilIndex(TrackableTypes.IntegerType),