diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index 17a58d5eaf1..e0794076723 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -150,12 +150,15 @@ public class AiCardMemory { */ public boolean isRememberedCardByName(String cardName, MemorySet set) { Set memorySet = getMemorySet(set); - Iterator it = memorySet.iterator(); - while (it.hasNext()) { - Card c = it.next(); - if (c.getName().equals(cardName)) { - return true; + if (memorySet != null) { + Iterator it = memorySet.iterator(); + + while (it.hasNext()) { + Card c = it.next(); + if (c.getName().equals(cardName)) { + return true; + } } } @@ -174,12 +177,15 @@ public class AiCardMemory { */ public boolean isRememberedCardByName(String cardName, MemorySet set, Player owner) { Set memorySet = getMemorySet(set); - Iterator it = memorySet.iterator(); - while (it.hasNext()) { - Card c = it.next(); - if (c.getName().equals(cardName) && c.getOwner().equals(owner)) { - return true; + if (memorySet != null) { + Iterator it = memorySet.iterator(); + + while (it.hasNext()) { + Card c = it.next(); + if (c.getName().equals(cardName) && c.getOwner().equals(owner)) { + return true; + } } } @@ -197,7 +203,12 @@ public class AiCardMemory { if (c == null) return false; - getMemorySet(set).add(c); + Set memorySet = getMemorySet(set); + + if (memorySet != null) { + memorySet.add(c); + } + return true; } @@ -216,7 +227,12 @@ public class AiCardMemory { return false; } - getMemorySet(set).remove(c); + Set memorySet = getMemorySet(set); + + if (memorySet != null) { + memorySet.remove(c); + } + return true; } @@ -229,12 +245,15 @@ public class AiCardMemory { */ public boolean forgetAnyCardWithName(String cardName, MemorySet set) { Set memorySet = getMemorySet(set); - Iterator it = memorySet.iterator(); - while (it.hasNext()) { - Card c = it.next(); - if (c.getName().equals(cardName)) { - return forgetCard(c, set); + if (memorySet != null) { + Iterator it = memorySet.iterator(); + + while (it.hasNext()) { + Card c = it.next(); + if (c.getName().equals(cardName)) { + return forgetCard(c, set); + } } } @@ -251,15 +270,18 @@ public class AiCardMemory { */ public boolean forgetAnyCardWithName(String cardName, MemorySet set, Player owner) { Set memorySet = getMemorySet(set); - Iterator it = memorySet.iterator(); - while (it.hasNext()) { - Card c = it.next(); - if (c.getName().equals(cardName) && c.getOwner().equals(owner)) { - return forgetCard(c, set); + if (memorySet != null) { + Iterator it = memorySet.iterator(); + + while (it.hasNext()) { + Card c = it.next(); + if (c.getName().equals(cardName) && c.getOwner().equals(owner)) { + return forgetCard(c, set); + } } } - + return false; } @@ -269,14 +291,16 @@ public class AiCardMemory { * @return true, if the given memory set contains no remembered cards. */ public boolean isMemorySetEmpty(MemorySet set) { - return getMemorySet(set).isEmpty(); + return set == null ? true : getMemorySet(set).isEmpty(); } /** * Clears the given memory set. */ public void clearMemorySet(MemorySet set) { - getMemorySet(set).clear(); + if (set != null) { + getMemorySet(set).clear(); + } } /** diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index de72afa9903..bc548e7079f 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -655,10 +655,10 @@ public class AiController { return false; } - AiCardMemory.MemorySet memSet; + AiCardMemory.MemorySet memSet = null; if (phaseType == null && forNextSpell) { memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_SPELL; - } else { + } else if (phaseType != null) { switch (phaseType) { case MAIN2: memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 89dfbcc4252..4ca0b574cdb 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1612,7 +1612,7 @@ public class ComputerUtil { } if (saviourApi == ApiType.PutCounter || saviourApi == ApiType.PutCounterAll) { - if (saviour.getParam("CounterType").equals("P1P1")) { + if (saviour != null && saviour.getParam("CounterType").equals("P1P1")) { toughness = AbilityUtils.calculateAmount(saviour.getHostCard(), saviour.getParam("CounterNum"), saviour); } else { return threatened; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 1e7069df2e2..f562e7a3a01 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -926,7 +926,7 @@ public class ComputerUtilCard { } else if (logic.equals("MostProminentInComputerDeckButGreen")) { List prominence = ComputerUtilCard.getColorByProminence(CardLists.filterControlledBy(game.getCardsInGame(), ai)); - if (prominence.get(0) == MagicColor.Constant.GREEN) { + if (prominence.get(0).equals(MagicColor.Constant.GREEN)) { chosen.add(prominence.get(1)); } else { chosen.add(prominence.get(0)); @@ -1878,7 +1878,7 @@ public class ComputerUtilCard { // A special case which checks that this creature will attack if it's the AI's turn if (needsToPlay.equalsIgnoreCase("WillAttack")) { - if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { + if (sa != null && game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { return ComputerUtilCard.doesSpecifiedCreatureAttackAI(sa.getActivatingPlayer(), card) ? AiPlayDecision.WillPlay : AiPlayDecision.BadEtbEffects; } else { diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 984bb2dc9b6..a7477639ce4 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -631,7 +631,9 @@ public abstract class GameState { // Note: triggers may fire during combat declarations ("whenever X attacks, ...", etc.) if (newPhase == PhaseType.COMBAT_DECLARE_ATTACKERS || newPhase == PhaseType.COMBAT_DECLARE_BLOCKERS) { boolean toDeclareBlockers = newPhase == PhaseType.COMBAT_DECLARE_BLOCKERS; - handleCombat(game, newPlayerTurn, newPlayerTurn.getSingleOpponent(), toDeclareBlockers); + if (newPlayerTurn != null) { + handleCombat(game, newPlayerTurn, newPlayerTurn.getSingleOpponent(), toDeclareBlockers); + } } game.getStack().setResolving(false); @@ -891,7 +893,9 @@ public abstract class GameState { } } - sa.setActivatingPlayer(c.getController()); + if (sa != null) { + sa.setActivatingPlayer(c.getController()); + } handleScriptedTargetingForSA(game, sa, tgtID); if (putOnStack) { diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 2d427ef70e1..b7a2bf62e89 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -733,6 +733,7 @@ public class PlayerControllerAi extends PlayerController { return true; } } + break; case "BetterTgtThanRemembered": if (source.getRememberedCount() > 0) { Card rem = (Card) source.getFirstRemembered(); @@ -746,6 +747,7 @@ public class PlayerControllerAi extends PlayerController { } return false; } + break; default: break; } diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 29e7c233aa0..1b3afb1d8c1 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -172,7 +172,7 @@ public class SpecialCardAi { } } - return best.getName(); + return best != null ? best.getName() : ""; } } @@ -1231,7 +1231,7 @@ public class SpecialCardAi { // no options with smaller CMC, so discard the one that is harder to cast for the one that is // easier to cast right now, but only if the best card in the library is at least CMC 3 // (probably not worth it to grab low mana cost cards this way) - if (maxCMC != null && maxCMC.getCMC() < bestInLib.getCMC() && bestInLib.getCMC() >= 3) { + if (maxCMC != null && bestInLib != null && maxCMC.getCMC() < bestInLib.getCMC() && bestInLib.getCMC() >= 3) { return maxCMC; } // We appear to be playing Reanimator (or we have a reanimator card in hand already), so it's diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 99993629485..b8fa75f9f13 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -311,6 +311,7 @@ public final class GameActionUtil { break; case Flash: result.getRestrictions().setInstantSpeed(true); + break; default: break; } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/SaveOpenDialog.java b/forge-gui-desktop/src/main/java/forge/toolbox/SaveOpenDialog.java index 8bae5713a34..9a4fe486e70 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/SaveOpenDialog.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/SaveOpenDialog.java @@ -111,7 +111,7 @@ public class SaveOpenDialog extends JPanel { RetFile = fc.getSelectedFile(); /* Adds extension if it is known and not given */ - if (type != null & !(RetFile.getAbsolutePath().endsWith(type.TypeExtension))) { + if (type != null && !(RetFile.getAbsolutePath().endsWith(type.TypeExtension))) { RetFile = new File(RetFile.getAbsolutePath() + "." + type.TypeExtension); } diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java b/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java index 6a7904a4eb3..d7c0c88ddd3 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java @@ -214,13 +214,13 @@ public class GuiDownloadZipService extends GuiDownloadService { protected void copyInputStream(final InputStream in, final String outPath) throws IOException { final byte[] buffer = new byte[1024]; int len; - final BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outPath)); - while((len = in.read(buffer)) >= 0) { - out.write(buffer, 0, len); + try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outPath))) { + while ((len = in.read(buffer)) >= 0) { + out.write(buffer, 0, len); + } } in.close(); - out.close(); } } 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 f527276d2d5..826dd0ea895 100644 --- a/forge-gui/src/main/java/forge/net/server/FServerManager.java +++ b/forge-gui/src/main/java/forge/net/server/FServerManager.java @@ -218,28 +218,26 @@ public final class FServerManager { // https://stackoverflow.com/a/34873630 // https://stackoverflow.com/a/901943 private String getRoutableAddress(boolean preferIpv4, boolean preferIPv6) throws SocketException, UnknownHostException { - DatagramSocket s = new DatagramSocket(); - s.connect(InetAddress.getByAddress(this.externalAddress), 0); - NetworkInterface n = NetworkInterface.getByInetAddress(s.getLocalAddress()); - Enumeration en = n.getInetAddresses(); - while (en.hasMoreElements()) { - InetAddress addr = (InetAddress) en.nextElement(); - if (addr instanceof Inet4Address) { - if (preferIPv6) { - continue; + try (DatagramSocket s = new DatagramSocket()) { + s.connect(InetAddress.getByAddress(this.externalAddress), 0); + NetworkInterface n = NetworkInterface.getByInetAddress(s.getLocalAddress()); + Enumeration en = n.getInetAddresses(); + while (en.hasMoreElements()) { + InetAddress addr = (InetAddress) en.nextElement(); + if (addr instanceof Inet4Address) { + if (preferIPv6) { + continue; + } + return addr.getHostAddress(); } - s.close(); - return addr.getHostAddress(); - } - if (addr instanceof Inet6Address) { - if (preferIpv4) { - continue; + if (addr instanceof Inet6Address) { + if (preferIpv4) { + continue; + } + return addr.getHostAddress(); } - s.close(); - return addr.getHostAddress(); } } - s.close(); return null; } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index efaf8a53e5a..c7fefdc1b5d 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -2040,9 +2040,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final File f = GuiBase.getInterface().getSaveFile(new File(ForgeConstants.USER_GAMES_DIR, "state.txt")); if (f != null && (!f.exists() || getGui().showConfirmDialog("Overwrite existing file?", "File exists!"))) { - final BufferedWriter bw = new BufferedWriter(new FileWriter(f)); - bw.write(state.toString()); - bw.close(); + try (BufferedWriter bw = new BufferedWriter(new FileWriter(f))) { + bw.write(state.toString()); + } } } catch (final Exception e) { String err = e.getClass().getName();