From 3bee592eff3ab267a9ee2a8f2c50875cbbca7c97 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 5 Nov 2024 18:01:50 +0100 Subject: [PATCH 01/57] rename TroopSpace to InfantryCompartment --- megamek/src/megamek/common/Entity.java | 10 +++++----- .../{TroopSpace.java => InfantryCompartment.java} | 12 ++++++------ megamek/src/megamek/common/Tank.java | 2 +- .../conversion/ASSpecialAbilityConverter.java | 2 +- megamek/src/megamek/common/loaders/BLKFile.java | 2 +- megamek/src/megamek/common/templates/TROView.java | 2 +- .../megamek/common/verifier/TestSupportVehicle.java | 6 +++--- megamek/src/megamek/common/verifier/TestTank.java | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) rename megamek/src/megamek/common/{TroopSpace.java => InfantryCompartment.java} (98%) diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java index 06d10d45800..5e0b3a3974c 100644 --- a/megamek/src/megamek/common/Entity.java +++ b/megamek/src/megamek/common/Entity.java @@ -8918,7 +8918,7 @@ public String getUnusedString(ViewFormatting formatting) { } else { result.append(next.getUnusedString()); } - if (isOmni() && ((next instanceof TroopSpace) + if (isOmni() && ((next instanceof InfantryCompartment) || (next instanceof Bay))) { if (omniPodTransports.contains(next)) { result.append(" (Pod)"); @@ -10123,8 +10123,8 @@ public boolean isEligibleForTargetingPhase() { public double getTroopCarryingSpace() { double space = 0; for (Transporter t : transports) { - if (t instanceof TroopSpace) { - space += ((TroopSpace) t).totalSpace; + if (t instanceof InfantryCompartment) { + space += ((InfantryCompartment) t).totalSpace; } } return space; @@ -10133,8 +10133,8 @@ public double getTroopCarryingSpace() { public double getPodMountedTroopCarryingSpace() { double space = 0; for (Transporter t : omniPodTransports) { - if (t instanceof TroopSpace) { - space += ((TroopSpace) t).totalSpace; + if (t instanceof InfantryCompartment) { + space += ((InfantryCompartment) t).totalSpace; } } return space; diff --git a/megamek/src/megamek/common/TroopSpace.java b/megamek/src/megamek/common/InfantryCompartment.java similarity index 98% rename from megamek/src/megamek/common/TroopSpace.java rename to megamek/src/megamek/common/InfantryCompartment.java index 82e6ba524d6..e753648b27c 100644 --- a/megamek/src/megamek/common/TroopSpace.java +++ b/megamek/src/megamek/common/InfantryCompartment.java @@ -23,14 +23,14 @@ * Represents a volume of space set aside for carrying troops and their equipment under battle * conditions. Typically, a component of an APC. */ -public final class TroopSpace implements Transporter { +public final class InfantryCompartment implements Transporter { private static final long serialVersionUID = 7837499891552862932L; /** * The troops being carried. */ Map troops = new HashMap<>(); - + /** * The total amount of space available for troops. */ @@ -46,7 +46,7 @@ public final class TroopSpace implements Transporter { /** * The default constructor is only for serialization. */ - private TroopSpace() { + private InfantryCompartment() { totalSpace = 0; currentSpace = 0; } @@ -58,7 +58,7 @@ private TroopSpace() { * * @param space The weight of troops (in tons) this space can carry. */ - public TroopSpace(double space) { + public InfantryCompartment(double space) { totalSpace = space; currentSpace = space; } @@ -125,7 +125,7 @@ public Vector getLoadedUnits() { for (Map.Entry entry : troops.entrySet()) { int key = entry.getKey(); Entity entity = game.getEntity(key); - + if (entity != null) { loaded.add(entity); } @@ -240,7 +240,7 @@ public String toString() { public void setGame(Game game) { this.game = game; } - + @Override public void resetTransporter() { troops = new HashMap<>(); diff --git a/megamek/src/megamek/common/Tank.java b/megamek/src/megamek/common/Tank.java index a5fece70f62..6aa3a0a4efd 100644 --- a/megamek/src/megamek/common/Tank.java +++ b/megamek/src/megamek/common/Tank.java @@ -2498,7 +2498,7 @@ public int getFreeSlots() { // total) boolean infantryBayCounted = false; for (Transporter transport : getTransports()) { - if (transport instanceof TroopSpace) { + if (transport instanceof InfantryCompartment) { usedSlots++; infantryBayCounted = true; break; diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java b/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java index 9a848aed646..3362941fcec 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java @@ -450,7 +450,7 @@ protected void processTransports() { assign("Docking Collar", DT, 1); } else if (t instanceof InfantryBay) { assign("Infantry Bay", IT, ((InfantryBay) t).getCapacity()); - } else if (t instanceof TroopSpace) { + } else if (t instanceof InfantryCompartment) { assign("Troop Space", IT, t.getUnused()); } else if (t instanceof MekBay) { assign("Mek Bay", MT, (int) ((MekBay) t).getCapacity()); diff --git a/megamek/src/megamek/common/loaders/BLKFile.java b/megamek/src/megamek/common/loaders/BLKFile.java index 05a8659090f..635fd9b8811 100644 --- a/megamek/src/megamek/common/loaders/BLKFile.java +++ b/megamek/src/megamek/common/loaders/BLKFile.java @@ -1193,7 +1193,7 @@ protected void addTransports(Entity e) throws EntityLoadingException { case "troopspace": // Everything after the ':' should be the space's size. double fsize = Double.parseDouble(numbers); - e.addTransporter(new TroopSpace(fsize), isPod); + e.addTransporter(new InfantryCompartment(fsize), isPod); break; case "cargobay": pbi = new ParsedBayInfo(numbers, usedBayNumbers); diff --git a/megamek/src/megamek/common/templates/TROView.java b/megamek/src/megamek/common/templates/TROView.java index e30ebd14fd2..fef8b33fbd4 100644 --- a/megamek/src/megamek/common/templates/TROView.java +++ b/megamek/src/megamek/common/templates/TROView.java @@ -684,7 +684,7 @@ protected String formatLocationTableEntry(Entity entity, Mounted mounted) { */ protected @Nullable Map formatTransporter(Transporter transporter, String loc) { final Map retVal = new HashMap<>(); - if (transporter instanceof TroopSpace) { + if (transporter instanceof InfantryCompartment) { retVal.put("name", Messages.getString("TROView.TroopSpace")); retVal.put("tonnage", transporter.getUnused()); } else if (transporter instanceof Bay) { diff --git a/megamek/src/megamek/common/verifier/TestSupportVehicle.java b/megamek/src/megamek/common/verifier/TestSupportVehicle.java index afdf415e453..4e0f8775af3 100644 --- a/megamek/src/megamek/common/verifier/TestSupportVehicle.java +++ b/megamek/src/megamek/common/verifier/TestSupportVehicle.java @@ -1512,7 +1512,7 @@ public StringBuffer printSlotCalculation() { boolean troopSpaceFound = false; for (Transporter transport : supportVee.getTransports()) { - if ((transport instanceof TroopSpace) && !troopSpaceFound) { + if ((transport instanceof InfantryCompartment) && !troopSpaceFound) { buff.append(StringUtil.makeLength("Troop Space", 30)); buff.append("1\n"); troopSpaceFound = true; @@ -1702,7 +1702,7 @@ public int getCrewSlots() { } /** - * Each distinct bay requires a slot, regardless of size. All {@link TroopSpace} + * Each distinct bay requires a slot, regardless of size. All {@link InfantryCompartment} * is treated as a single bay. * * @return The number of slots required by transporters. @@ -1714,7 +1714,7 @@ public int getTransportSlots() { for (Transporter transporter : supportVee.getTransports()) { if ((transporter instanceof Bay transportBay) && !transportBay.isQuarters()) { slots++; - } else if ((transporter instanceof TroopSpace) && !foundTroopSpace) { + } else if ((transporter instanceof InfantryCompartment) && !foundTroopSpace) { slots++; foundTroopSpace = true; } diff --git a/megamek/src/megamek/common/verifier/TestTank.java b/megamek/src/megamek/common/verifier/TestTank.java index cd0ec0ed217..9a569837d4f 100755 --- a/megamek/src/megamek/common/verifier/TestTank.java +++ b/megamek/src/megamek/common/verifier/TestTank.java @@ -667,7 +667,7 @@ public StringBuffer printSlotCalculation() { // total) boolean infantryBayCounted = false; for (Transporter transport : tank.getTransports()) { - if (transport instanceof TroopSpace) { + if (transport instanceof InfantryCompartment) { buff.append(StringUtil.makeLength("Troop Space", 30)); buff.append("1\n"); infantryBayCounted = true; From 7c4ab9bb5816fc1d6b155d8688caa3612a27a8f3 Mon Sep 17 00:00:00 2001 From: Coppio Date: Tue, 5 Nov 2024 21:01:32 -0300 Subject: [PATCH 02/57] feat: adds slash kill command for GMs --- .../common/options/messages.properties | 2 + .../megamek/common/options/GameOptions.java | 1 + .../common/options/OptionsConstants.java | 1 + .../megamek/server/commands/KillCommand.java | 78 +++++++++++++++++++ .../server/totalwarfare/TWGameManager.java | 1 + 5 files changed, 83 insertions(+) create mode 100644 megamek/src/megamek/server/commands/KillCommand.java diff --git a/megamek/i18n/megamek/common/options/messages.properties b/megamek/i18n/megamek/common/options/messages.properties index 78fd3cd33c0..e1a5a134ba3 100644 --- a/megamek/i18n/megamek/common/options/messages.properties +++ b/megamek/i18n/megamek/common/options/messages.properties @@ -140,6 +140,8 @@ GameOptionsInfo.option.allow_nukes.displayableName=Allow command-line nukes. GameOptionsInfo.option.allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. GameOptionsInfo.option.really_allow_nukes.displayableName=REALLY allow command-line nukes. GameOptionsInfo.option.really_allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. +GameOptionsInfo.option.gm_can_kill_units.displayableName=Allow command-line kill (GM only). +GameOptionsInfo.option.gm_can_kill_units.description=This must be checked to allow the GM to kill units using command line. If this is not checked, the command is disabled. GameOptionsInfo.group.advancedRules.displayableName=Advanced Rules diff --git a/megamek/src/megamek/common/options/GameOptions.java b/megamek/src/megamek/common/options/GameOptions.java index 77fae48cbde..1bcf6c0ce8d 100755 --- a/megamek/src/megamek/common/options/GameOptions.java +++ b/megamek/src/megamek/common/options/GameOptions.java @@ -93,6 +93,7 @@ public synchronized void initialize() { addOption(allowed, OptionsConstants.ALLOWED_NO_CLAN_PHYSICAL, false); addOption(allowed, OptionsConstants.ALLOWED_ALLOW_NUKES, false); addOption(allowed, OptionsConstants.ALLOWED_REALLY_ALLOW_NUKES, false); + addOption(allowed, OptionsConstants.ALLOWED_GM_CAN_KILL_UNITS, false); IBasicOptionGroup advancedRules = addGroup("advancedRules"); addOption(advancedRules, OptionsConstants.ADVANCED_MINEFIELDS, false); diff --git a/megamek/src/megamek/common/options/OptionsConstants.java b/megamek/src/megamek/common/options/OptionsConstants.java index 0a46c5d48e7..9a757bc9897 100644 --- a/megamek/src/megamek/common/options/OptionsConstants.java +++ b/megamek/src/megamek/common/options/OptionsConstants.java @@ -330,6 +330,7 @@ public class OptionsConstants { public static final String ALLOWED_NO_CLAN_PHYSICAL = "no_clan_physical"; public static final String ALLOWED_ALLOW_NUKES = "allow_nukes"; public static final String ALLOWED_REALLY_ALLOW_NUKES = "really_allow_nukes"; + public static final String ALLOWED_GM_CAN_KILL_UNITS = "gm_can_kill_units"; public static final String ADVANCED_MINEFIELDS = "minefields"; public static final String ADVANCED_HIDDEN_UNITS = "hidden_units"; public static final String ADVANCED_BLACK_ICE= "black_ice"; diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java new file mode 100644 index 00000000000..365438eae7d --- /dev/null +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.options.OptionsConstants; +import megamek.server.Server; +import megamek.server.totalwarfare.TWGameManager; + +/** + * @author Luana Scoppio + */ +public class KillCommand extends ServerCommand { + + private final TWGameManager gameManager; + + /** Creates new KillCommand */ + public KillCommand(Server server, TWGameManager gameManager) { + super(server, "kill", "Allows a GM to destroy a single unit instantly" + + "Allowed format:"+ + "/kill " + + "where id is the units ID. The units ID can be found by hovering over the unit."); + this.gameManager = gameManager; + } + + /** + * Run this command with the arguments supplied + */ + @Override + public void run(int connId, String[] args) { + + // Check to make sure gm kills are allowed! + if (!(server.getGame().getOptions().booleanOption(OptionsConstants.ALLOWED_GM_CAN_KILL_UNITS))) { + server.sendServerChat(connId, "Command-line kill is not enabled in this game."); + return; + } + if (!server.getPlayer(connId).getGameMaster()) { + server.sendServerChat(connId, "You are not a Game Master."); + return; + } + // Check argument integrity. + if (args.length == 2) { + // Check command + try { + int unitId = Integer.parseInt(args[1]); + // is the unit on the board? + var unit = gameManager.getGame().getEntity(unitId); + if (unit == null) { + server.sendServerChat(connId, "Specified unit is not on the board."); + return; + } + gameManager.destroyEntity(unit, "Act of God", false, false); + server.sendServerChat(connId, unit.getDisplayName() + " has been destroyed."); + } catch (NumberFormatException e) { + server.sendServerChat(connId, "Kill command failed (2). Proper format is \"/kill \" where id is the units numerical ID"); + } + } else { + // Error out; it's not a valid call. + server.sendServerChat(connId, "Kill command failed (1). Proper format is \"/kill \" where id is the units ID"); + } + } +} diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 0b452fa59b6..e61c40b7f7f 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -187,6 +187,7 @@ public List getCommandList(Server server) { commands.add(new CheckBVCommand(server)); commands.add(new CheckBVTeamCommand(server)); commands.add(new NukeCommand(server, this)); + commands.add(new KillCommand(server, this)); commands.add(new TraitorCommand(server, this)); commands.add(new ListEntitiesCommand(server, this)); commands.add(new AssignNovaNetServerCommand(server, this)); From f61455783325e27ced1f9766be4247757f3b7ba0 Mon Sep 17 00:00:00 2001 From: Coppio Date: Tue, 5 Nov 2024 22:50:19 -0300 Subject: [PATCH 03/57] feat: added nosmoke and change weather commands, disaster is currently WIP --- .../commands/AllowGameMasterCommand.java | 2 +- .../server/commands/ChangeWeatherCommand.java | 131 ++++++++++++++++++ .../server/commands/DisasterCommand.java | 63 +++++++++ .../megamek/server/commands/KillCommand.java | 2 +- .../server/commands/RemoveSmokeCommand.java | 60 ++++++++ .../server/totalwarfare/TWGameManager.java | 2 + 6 files changed, 258 insertions(+), 2 deletions(-) create mode 100644 megamek/src/megamek/server/commands/ChangeWeatherCommand.java create mode 100644 megamek/src/megamek/server/commands/DisasterCommand.java create mode 100644 megamek/src/megamek/server/commands/RemoveSmokeCommand.java diff --git a/megamek/src/megamek/server/commands/AllowGameMasterCommand.java b/megamek/src/megamek/server/commands/AllowGameMasterCommand.java index 839ea433b00..b8189ae330c 100644 --- a/megamek/src/megamek/server/commands/AllowGameMasterCommand.java +++ b/megamek/src/megamek/server/commands/AllowGameMasterCommand.java @@ -34,7 +34,7 @@ public class AllowGameMasterCommand extends ServerCommand { public AllowGameMasterCommand(Server server, TWGameManager gameManager) { super(server, "allowGM", "Allows a player become Game Master " - + "Usage: /allowGameMaster used in respond to another " + + + "Usage: /allowGM used in respond to another " + "Player's request to become Game Master. All players assigned to" + " a team must allow the change."); this.gameManager = gameManager; diff --git a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java new file mode 100644 index 00000000000..4eccef2e475 --- /dev/null +++ b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.planetaryconditions.*; +import megamek.server.Server; +import megamek.server.totalwarfare.TWGameManager; + +/** + * @author Luana Scoppio + */ +public class ChangeWeatherCommand extends ServerCommand { + + private final TWGameManager gameManager; + + /** Creates new ChangeWeatherCommand */ + public ChangeWeatherCommand(Server server, TWGameManager gameManager) { + super(server, "weather", "GM changes (weather) planetary conditions. The parameters are optional and unordered " + + "and the effects are applied at the beggining of the next turn. The square brackets means that argument is optional. " + + "Usage format: /weather [fog=0-2] [wind=0-6] [winddir=0-6] [light=0-6] [atmo=0-5] [blowsand=0-1] [weather=0-14] " + + "light= 0: daylight, 1: dusk, 2: full moon, 3: glare, 4: moonless night, 5: solar flare, 6: pitch black " + + "fog= 0: none, 1: light, 2: heavy " + + "wind= 0: calm, 1: light gale, 2: moderate gale, 3: strong gale, 4: storm, 5: tornado F1-F3, 6: tornado F4 " + + "winddir= 0: south, 1: southwest, 2: northwest, 3: north, 4: northeast, 5: southeast, 6: random " + + "atmo= 0: vacuum, 1: trace, 2: thin, 3: standard, 4: high, 5: very high " + + "blowsand= 0: no, 1: yes " + + "weather= 0: clear, 1: light rain, 2: moderate rain, 3: heavy rain, 4: gusting rain, 5: downpour, 6: light snow " + + "7: moderate snow, 8: snow flurries, 9: heavy snow, 10: sleet, 11: ice storm, 12: light hail, 13: heavy hail " + + "14: lightning storm"); + this.gameManager = gameManager; + } + + /** + * Run this command with the arguments supplied + */ + @Override + public void run(int connId, String[] args) { + if (!server.getPlayer(connId).getGameMaster()) { + server.sendServerChat(connId, "You are not a Game Master."); + return; + } + + // Check argument integrity. + if (args.length > 1) { + // Check command + var planetaryConditions = gameManager.getGame().getPlanetaryConditions(); + + for (var arg : args) { + if (arg.startsWith("fog=")) { + var fog = Integer.parseInt(arg.substring(4)); + if (fog >= 0 && fog < Fog.values().length) { + planetaryConditions.setFog(Fog.values()[fog]); + server.sendServerChat(connId, "The fog has changed."); + } else { + server.sendServerChat(connId, "Invalid fog value. Must be between 0 and " + Fog.values().length); + } + } else if (arg.startsWith("wind=")) { + var wind = Integer.parseInt(arg.substring(5)); + if (wind >= 0 && wind < Wind.values().length) { + planetaryConditions.setWind(Wind.values()[wind]); + server.sendServerChat(connId, "The wind strength has changed."); + } else { + server.sendServerChat(connId, "Invalid wind value. Must be between 0 and " + Wind.values().length); + } + } else if (arg.startsWith("winddir=")) { + var windDir = Integer.parseInt(arg.substring(8)); + if (windDir >= 0 && windDir < WindDirection.values().length) { + planetaryConditions.setWindDirection(WindDirection.values()[windDir]); + server.sendServerChat(connId, "The wind direction has changed."); + } else { + server.sendServerChat(connId, "Invalid wind direction value. Must be between 0 and " + WindDirection.values().length); + } + } else if (arg.startsWith("light=")) { + var light = Integer.parseInt(arg.substring(6)); + if (light >= 0 && light < Light.values().length) { + planetaryConditions.setLight(Light.values()[light]); + server.sendServerChat(connId, "The light has changed."); + } else { + server.sendServerChat(connId, "Invalid light value. Must be between 0 and " + Light.values().length); + } + } else if (arg.startsWith("atmo=")) { + var atmo = Integer.parseInt(arg.substring(5)); + if (atmo >= 0 && atmo < Atmosphere.values().length) { + planetaryConditions.setAtmosphere(Atmosphere.values()[atmo]); + server.sendServerChat(connId, atmo == 0 ? "The air has vanished, put your vac suits!" : "The air is changing."); + } else { + server.sendServerChat(connId, "Invalid atmosphere value. Must be between 0 and " + Atmosphere.values().length); + } + } else if (arg.startsWith("blowsand=")) { + var blowSand = Integer.parseInt(arg.substring(9)); + if (blowSand >= 0 && blowSand < BlowingSand.values().length) { + planetaryConditions.setBlowingSand(BlowingSand.values()[blowSand]); + server.sendServerChat(connId, blowSand == 1 ? "Sand started blowing." : "The sand has settled."); + } else { + server.sendServerChat(connId, "Invalid blowsand value. Must be between 0 and " + BlowingSand.values().length); + } + } else if (arg.startsWith("weather=")) { + var weather = Integer.parseInt(arg.substring(8)); + if (weather >= 0 && weather < Weather.values().length) { + planetaryConditions.setWeather(Weather.values()[weather]); + server.sendServerChat(connId, "The weather has changed."); + } else { + server.sendServerChat(connId, "Invalid weather value. Must be between 0 and " + Weather.values().length); + } + } + } + + gameManager.getGame().setPlanetaryConditions(planetaryConditions); + } else { + // Error out; it's not a valid call. + server.sendServerChat(connId, "weather command failed."); + } + } +} diff --git a/megamek/src/megamek/server/commands/DisasterCommand.java b/megamek/src/megamek/server/commands/DisasterCommand.java new file mode 100644 index 00000000000..acee28bce21 --- /dev/null +++ b/megamek/src/megamek/server/commands/DisasterCommand.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.server.Server; +import megamek.server.totalwarfare.TWGameManager; + +/** + * @author Luana Scoppio + */ +public class DisasterCommand extends ServerCommand { + + private final TWGameManager gameManager; + + /** Creates new DisasterCommand */ + public DisasterCommand(Server server, TWGameManager gameManager) { + super(server, "disaster", "GM calls a disaster at random, arguments in square brackets are optional. Usage: /disaster [type] " + + "if not type is passed, one is chosen at random. " + + "type= 0: hurricane, 1: lightning storm, 2: meteor shower, 3: orbital bombardment, 4: wildfire, 5: sandstorm, 6: hailstorm, " + + "7: heatwave"); + this.gameManager = gameManager; + } + + /** + * Run this command with the arguments supplied + */ + @Override + public void run(int connId, String[] args) { + if (!server.getPlayer(connId).getGameMaster()) { + server.sendServerChat(connId, "You are not a Game Master."); + return; + } + + // Check argument integrity. + if (args.length == 1) { + // Check command + // NOT IMPLEMENTED + server.sendServerChat(connId, "Oh no..."); + } else if (args.length == 2) { + // Error out; it's not a valid call. + server.sendServerChat(connId, "Oh no..."); + } else { + server.sendServerChat(connId, "disaster command failed (1)."); + } + } +} diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index 365438eae7d..387dbb855c7 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -33,7 +33,7 @@ public class KillCommand extends ServerCommand { /** Creates new KillCommand */ public KillCommand(Server server, TWGameManager gameManager) { super(server, "kill", "Allows a GM to destroy a single unit instantly" + - "Allowed format:"+ + "Usage: "+ "/kill " + "where id is the units ID. The units ID can be found by hovering over the unit."); this.gameManager = gameManager; diff --git a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java new file mode 100644 index 00000000000..ae28fd7a61e --- /dev/null +++ b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.planetaryconditions.Fog; +import megamek.common.planetaryconditions.Wind; +import megamek.server.Server; +import megamek.server.totalwarfare.TWGameManager; + +/** + * @author Luana Scoppio + */ +public class RemoveSmokeCommand extends ServerCommand { + + private final TWGameManager gameManager; + + /** Creates new KillCommand */ + public RemoveSmokeCommand(Server server, TWGameManager gameManager) { + super(server, "nosmoke", "GM removes all smoke cloud hexes. Usage: /nosmoke"); + this.gameManager = gameManager; + } + + /** + * Run this command with the arguments supplied + */ + @Override + public void run(int connId, String[] args) { + if (!server.getPlayer(connId).getGameMaster()) { + server.sendServerChat(connId, "You are not a Game Master."); + return; + } + + // Check argument integrity. + if (args.length == 1) { + // Check command + gameManager.getSmokeCloudList().forEach(gameManager::removeSmokeTerrain); + server.sendServerChat(connId, "GM cleared the smoke clouds."); + } else { + // Error out; it's not a valid call. + server.sendServerChat(connId, "nosmoke command failed (1)."); + } + } +} diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index e61c40b7f7f..13065fedbd0 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -188,6 +188,8 @@ public List getCommandList(Server server) { commands.add(new CheckBVTeamCommand(server)); commands.add(new NukeCommand(server, this)); commands.add(new KillCommand(server, this)); + commands.add(new RemoveSmokeCommand(server, this)); + commands.add(new ChangeWeatherCommand(server, this)); commands.add(new TraitorCommand(server, this)); commands.add(new ListEntitiesCommand(server, this)); commands.add(new AssignNovaNetServerCommand(server, this)); From f7d8a48b190043b5ae33f512f311ae94cad08b9c Mon Sep 17 00:00:00 2001 From: Coppio Date: Tue, 5 Nov 2024 23:34:33 -0300 Subject: [PATCH 04/57] feat: added change ownership command, disaster is still WIP --- .../commands/ChangeOwnershipCommand.java | 76 +++++++++++++++++++ .../server/commands/ChangeWeatherCommand.java | 1 - .../server/commands/DisasterCommand.java | 1 - .../megamek/server/commands/KillCommand.java | 1 - .../server/totalwarfare/TWGameManager.java | 2 + 5 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 megamek/src/megamek/server/commands/ChangeOwnershipCommand.java diff --git a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java new file mode 100644 index 00000000000..48691c02742 --- /dev/null +++ b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.Entity; +import megamek.common.Player; +import megamek.server.Server; +import megamek.server.totalwarfare.TWGameManager; + +/** + * The Server Command "/changeOwner" that will switch an entity's owner to another player. + * + * @author Luana Scoppio + */ +public class ChangeOwnershipCommand extends ServerCommand { + + private final TWGameManager gameManager; + + public ChangeOwnershipCommand(Server server, TWGameManager gameManager) { + super(server, + "changeOwner", + "Switches ownership of a player's entity to another player during the end phase. " + + "Usage: /changeOwner " + + "The following is an example of changing unit ID 7 to player ID 2: /changeOwner 7 2 "); + this.gameManager = gameManager; + } + + /** + * Run this command with the arguments supplied + * + * @see ServerCommand#run(int, String[]) + */ + @Override + public void run(int connId, String[] args) { + try { + var currentPlayer = server.getGame().getPlayer(connId); + if (!currentPlayer.isGameMaster()) { + server.sendServerChat(connId, "You are not a Game Master."); + return; + } + + int eid = Integer.parseInt(args[1]); + Entity ent = gameManager.getGame().getEntity(eid); + int pid = Integer.parseInt(args[2]); + Player player = server.getGame().getPlayer(pid); + if (null == ent) { + server.sendServerChat(connId, "No such entity."); + } else if (null == player) { + server.sendServerChat(connId, "No such player."); + } else if (player.getTeam() == Player.TEAM_UNASSIGNED) { + server.sendServerChat(connId, "Player must be assigned a team."); + } else { + server.sendServerChat(connId, ent.getDisplayName() + " will switch to " + player.getName() + "'s side at the end of this turn."); + ent.setTraitorId(pid); + } + } catch (NumberFormatException ignored) { + } + } + +} diff --git a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java index 4eccef2e475..f18c5926e17 100644 --- a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java +++ b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java @@ -1,5 +1,4 @@ /* - * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * * This file is part of MegaMek. diff --git a/megamek/src/megamek/server/commands/DisasterCommand.java b/megamek/src/megamek/server/commands/DisasterCommand.java index acee28bce21..0a7137cd88b 100644 --- a/megamek/src/megamek/server/commands/DisasterCommand.java +++ b/megamek/src/megamek/server/commands/DisasterCommand.java @@ -1,5 +1,4 @@ /* - * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * * This file is part of MegaMek. diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index 387dbb855c7..837bcce266e 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -1,5 +1,4 @@ /* - * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * * This file is part of MegaMek. diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 13065fedbd0..95aabd23203 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -188,6 +188,8 @@ public List getCommandList(Server server) { commands.add(new CheckBVTeamCommand(server)); commands.add(new NukeCommand(server, this)); commands.add(new KillCommand(server, this)); + commands.add(new ChangeOwnershipCommand(server, this)); + commands.add(new DisasterCommand(server, this)); commands.add(new RemoveSmokeCommand(server, this)); commands.add(new ChangeWeatherCommand(server, this)); commands.add(new TraitorCommand(server, this)); From 2860d27c88dbe12d430dba1487790d243e2411d3 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 7 Nov 2024 12:23:24 +0100 Subject: [PATCH 05/57] allow pausing a Princess-only game --- .../i18n/megamek/client/messages.properties | 4 + megamek/mmconf/defaultKeyBinds.xml | 167 ++++++++++-------- .../src/megamek/client/AbstractClient.java | 10 ++ .../ui/swing/StatusBarPhaseDisplay.java | 17 ++ .../client/ui/swing/util/KeyCommandBind.java | 4 +- .../common/net/enums/PacketCommand.java | 4 + megamek/src/megamek/server/Server.java | 31 +++- 7 files changed, 157 insertions(+), 80 deletions(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 4c96ba383f0..c6b459d8112 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -1972,6 +1972,10 @@ KeyBinds.cmdNames.undoSingleStep=Undo Single Step KeyBinds.cmdDesc.undoSingleStep=Undo single step in movement phase KeyBinds.cmdNames.extendTurnTimer=Activates Turn Timer Extension KeyBinds.cmdDesc.extendTurnTimer=When Turn Timer gets to 2 seconds left, reset timer. +KeyBinds.cmdNames.pause=Pause the Game +KeyBinds.cmdDesc.pause=Pauses the game. Works only when only Princess players with active units remain. +KeyBinds.cmdNames.unpause=Unpause the Game +KeyBinds.cmdDesc.unpause=Unpauses the game #Key Bindings Overlay KeyBindingsDisplay.fixedBinds=Toggle Unit Display and Minimap: Mouse Button 4\nZoom: Mouse Wheel\nTurn / Torso twist: Shift + Left-Click\nLine of Sight tool: Ctrl + Left-Click (two hexes)\nRuler tool: Alt + Left-Click (two hexes) diff --git a/megamek/mmconf/defaultKeyBinds.xml b/megamek/mmconf/defaultKeyBinds.xml index 2df36f7a237..9103c3086f8 100644 --- a/megamek/mmconf/defaultKeyBinds.xml +++ b/megamek/mmconf/defaultKeyBinds.xml @@ -1,494 +1,507 @@ - + - scrollN + scrollN 87 0 true - scrollS + scrollS 83 0 true - scrollE + scrollE 68 0 true - scrollW + scrollW 65 0 true - toggleChat + toggleChat 10 0 false - toggleChatCmd + toggleChatCmd 47 0 false - turnLeft + turnLeft 65 64 false - turnRight + turnRight 68 64 false - twistLeft + twistLeft 65 64 false - twistRight + twistRight 68 64 false - fire + fire 70 0 false - nextWeapon - 40 + nextWeapon + 521 0 false - prevWeapon - 38 + prevWeapon + 520 0 false - nextUnit + nextUnit 9 0 false - prevUnit + prevUnit 9 64 false - nextTarget + nextTarget 39 0 false - prevTarget + prevTarget 37 0 false - nextTargetValid + nextTargetValid 39 64 false - prevTargetValid + prevTargetValid 37 64 false - nextTargetNoAllies + nextTargetNoAllies 39 128 false - prevTargetNoAllies + prevTargetNoAllies 37 128 false - nextTargetValidNoAllies + nextTargetValidNoAllies 39 192 false - prevTargetValidNoAllies + prevTargetValidNoAllies 37 192 false - viewActingUnit + viewActingUnit 86 0 false - undoLastStep + undoLastStep 8 0 false - undo + undo 90 128 false - redo + redo 89 128 false - centerOnSelected + centerOnSelected 32 0 false - autoArtyDeployZone + autoArtyDeployZone 90 64 false - cancel + cancel 27 0 false - done + done 10 128 false - doneNoAction + doneNoAction 10 192 false - udGeneral + udGeneral 112 0 false - udPilot + udPilot 113 0 false - udArmor + udArmor 114 0 false - udSystems - 115 + udWeapons + 116 0 false - udWeapons - 116 + udSystems + 115 0 false - udExtras + udExtras 117 0 false - toggleJump + toggleJump 74 0 false - toggleConversion + toggleConversion 77 0 false - prevMode + prevMode 225 0 false - nextMode + nextMode 224 0 false - toggleIso + pause + 80 + 192 + false + + + + unpause + 80 + 640 + false + + + + toggleIso 84 0 false - movementEnvelope + movementEnvelope 81 128 false - fieldOfFire + fieldOfFire 82 0 false - toggleDrawLabels + toggleDrawLabels 66 128 false - toggleHexCoords + toggleHexCoords 71 128 false - toggleMinimap + toggleMinimap 77 128 false - viewLosSetting + viewLosSetting 76 640 false - toggleUnitDisplay + toggleUnitDisplay 68 128 false - toggleUnitOverview + toggleUnitOverview 85 128 false - toggleKeybinds + toggleKeybinds 75 128 false - togglePlanetaryConditions + togglePlanetaryConditions 80 128 false - toggleTurnDetails + toggleTurnDetails 84 128 false - clientSettings + clientSettings 67 512 false - incGuiScale + incGuiScale 107 128 false - decGuiScale + decGuiScale 109 128 false - roundReport + roundReport 82 128 false - zoomIn + zoomIn 107 0 false - zoomOut + zoomOut 109 0 false - quickLoad + quickLoad 76 192 false - quickSave + quickSave 83 192 false - localLoad + localLoad 76 128 false - localSave + localSave 83 128 false - replacePlayer + replacePlayer 82 192 false - viewModEnvelope + viewModEnvelope 87 128 false - sensorRange + sensorRange 67 0 false - undoSingleStep + undoSingleStep 8 128 false - toggleForceDisplay + toggleForceDisplay 70 128 false - extendTurnTimer + extendTurnTimer 115 128 false - + \ No newline at end of file diff --git a/megamek/src/megamek/client/AbstractClient.java b/megamek/src/megamek/client/AbstractClient.java index 6a30c1c5ace..4f944b39c4c 100644 --- a/megamek/src/megamek/client/AbstractClient.java +++ b/megamek/src/megamek/client/AbstractClient.java @@ -235,6 +235,16 @@ public synchronized void sendDone(boolean done) { flushConn(); } + public void sendPause() { + send(new Packet(PacketCommand.PAUSE)); + flushConn(); + } + + public void sendUnpause() { + send(new Packet(PacketCommand.UNPAUSE)); + flushConn(); + } + /** * Receives player information from the message packet. * diff --git a/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java b/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java index 1181c81be5a..00dfa989cd8 100644 --- a/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java +++ b/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java @@ -45,6 +45,7 @@ import javax.swing.ToolTipManager; import javax.swing.border.EmptyBorder; +import megamek.client.AbstractClient; import megamek.client.ui.GBC; import megamek.client.ui.Messages; import megamek.client.ui.swing.util.KeyBindReceiver; @@ -157,8 +158,24 @@ public void actionPerformed(ActionEvent e) { KeyBindParser.addPreferenceChangeListener(this); MegaMekGUI.getKeyDispatcher().registerCommandAction(KeyCommandBind.EXTEND_TURN_TIMER, this, this::extendTimer); + MegaMekGUI.getKeyDispatcher().registerCommandAction(KeyCommandBind.PAUSE.cmd, this::pauseGameWhenOnlyBotUnitsRemain); + MegaMekGUI.getKeyDispatcher().registerCommandAction(KeyCommandBind.UNPAUSE.cmd, + () -> ((AbstractClient) clientgui.getClient()).sendUnpause()); } + private void pauseGameWhenOnlyBotUnitsRemain() { + if (isIgnoringEvents() || !isVisible()) { + return; + } + IGame game = getClientgui().getClient().getGame(); + List nonBots = game.getPlayersList().stream().filter(p -> !p.isBot()).toList(); + boolean liveUnitsRemaining = nonBots.stream().anyMatch(p -> game.getEntitiesOwnedBy(p) > 0); + if (liveUnitsRemaining) { + clientgui.getClient().sendChat("Pausing the game only works when only bot units remain."); + } else { + ((AbstractClient) clientgui.getClient()).sendPause(); + } + } /** Returns the list of buttons that should be displayed. */ protected abstract List getButtonList(); diff --git a/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java b/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java index baf35a27737..2b0f54f4ac1 100644 --- a/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java +++ b/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java @@ -90,6 +90,8 @@ public enum KeyCommandBind { TOGGLE_CONVERSIONMODE("toggleConversion", VK_M), PREV_MODE("prevMode", VK_KP_DOWN), NEXT_MODE("nextMode", VK_KP_UP), + PAUSE("pause", VK_P, CTRL_DOWN_MASK | SHIFT_DOWN_MASK), + UNPAUSE("unpause", VK_P, CTRL_DOWN_MASK | ALT_DOWN_MASK), // --------- The following binds are used by the CommonMenuBar: // Toggles isometric view on/off @@ -218,4 +220,4 @@ public static String getDesc(KeyCommandBind k) { String key = getKeyText(k.key); return (mod.isEmpty() ? "" : mod + "+") + key; } -} \ No newline at end of file +} diff --git a/megamek/src/megamek/common/net/enums/PacketCommand.java b/megamek/src/megamek/common/net/enums/PacketCommand.java index 1b249ec1d58..3e37e6f71ad 100644 --- a/megamek/src/megamek/common/net/enums/PacketCommand.java +++ b/megamek/src/megamek/common/net/enums/PacketCommand.java @@ -44,6 +44,10 @@ public enum PacketCommand { /** A packet setting a Client's ready status (S -> C) or updating the Server on the Client's status (C -> S). */ PLAYER_READY, + /** A packet telling the server to pause / unpause packet handling (to interrupt a Princess-only game) */ + PAUSE, + UNPAUSE, + CHAT, ENTITY_ADD, ENTITY_REMOVE, diff --git a/megamek/src/megamek/server/Server.java b/megamek/src/megamek/server/Server.java index d62d8555e92..cc51549c8c2 100644 --- a/megamek/src/megamek/server/Server.java +++ b/megamek/src/megamek/server/Server.java @@ -209,6 +209,10 @@ public void run() { private static final String WARGAMES_RESPONSE = "Let's play global thermonuclear war."; private final ConnectionListener connectionListener = new ConnectionListener() { + + private boolean isPaused = false; + private final List pausedWaitingList = new ArrayList<>(); + /** * Called when it is sensed that a connection has terminated. */ @@ -252,11 +256,34 @@ public void packetReceived(PacketReceivedEvent e) { // Some packets should be handled immediately handle(rp.getConnectionId(), rp.getPacket()); break; - default: + case PAUSE: + if (!isPaused) { + logger.info("Pause packet received - pausing packet handling"); + sendServerChat("Game is paused."); + } + isPaused = true; + break; + case UNPAUSE: + if (isPaused) { + logger.info("Unpause packet received - resuming packet handling"); + sendServerChat("Game is resumed."); + } + isPaused = false; synchronized (packetQueue) { - packetQueue.add(rp); + packetQueue.addAll(pausedWaitingList); packetQueue.notifyAll(); } + pausedWaitingList.clear(); + break; + default: + if (isPaused) { + pausedWaitingList.add(rp); + } else { + synchronized (packetQueue) { + packetQueue.add(rp); + packetQueue.notifyAll(); + } + } break; } } From a58a77bcca3a6a5bf9d88172464b822f923bbbc4 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 7 Nov 2024 12:46:59 +0100 Subject: [PATCH 06/57] defaultKeyBinds.xml correction, send immediate chat --- megamek/mmconf/defaultKeyBinds.xml | 181 +++++++++--------- .../ui/swing/StatusBarPhaseDisplay.java | 1 + 2 files changed, 92 insertions(+), 90 deletions(-) diff --git a/megamek/mmconf/defaultKeyBinds.xml b/megamek/mmconf/defaultKeyBinds.xml index 9103c3086f8..7b0ecbd7599 100644 --- a/megamek/mmconf/defaultKeyBinds.xml +++ b/megamek/mmconf/defaultKeyBinds.xml @@ -1,507 +1,508 @@ - + - scrollN + scrollN 87 0 true - scrollS + scrollS 83 0 true - scrollE + scrollE 68 0 true - scrollW + scrollW 65 0 true - toggleChat + toggleChat 10 0 false - toggleChatCmd + toggleChatCmd 47 0 false - turnLeft + turnLeft 65 64 false - turnRight + turnRight 68 64 false - twistLeft + twistLeft 65 64 false - twistRight + twistRight 68 64 false - fire + fire 70 0 false - nextWeapon - 521 + pause + 80 + 192 + false + + + + unpause + 80 + 640 + false + + + + nextWeapon + 40 0 false - prevWeapon - 520 + prevWeapon + 38 0 false - nextUnit + nextUnit 9 0 false - prevUnit + prevUnit 9 64 false - nextTarget + nextTarget 39 0 false - prevTarget + prevTarget 37 0 false - nextTargetValid + nextTargetValid 39 64 false - prevTargetValid + prevTargetValid 37 64 false - nextTargetNoAllies + nextTargetNoAllies 39 128 false - prevTargetNoAllies + prevTargetNoAllies 37 128 false - nextTargetValidNoAllies + nextTargetValidNoAllies 39 192 false - prevTargetValidNoAllies + prevTargetValidNoAllies 37 192 false - viewActingUnit + viewActingUnit 86 0 false - undoLastStep + undoLastStep 8 0 false - undo + undo 90 128 false - redo + redo 89 128 false - centerOnSelected + centerOnSelected 32 0 false - autoArtyDeployZone + autoArtyDeployZone 90 64 false - cancel + cancel 27 0 false - done + done 10 128 false - doneNoAction + doneNoAction 10 192 false - udGeneral + udGeneral 112 0 false - udPilot + udPilot 113 0 false - udArmor + udArmor 114 0 false - udWeapons - 116 + udSystems + 115 0 false - udSystems - 115 + udWeapons + 116 0 false - udExtras + udExtras 117 0 false - toggleJump + toggleJump 74 0 false - toggleConversion + toggleConversion 77 0 false - prevMode + prevMode 225 0 false - nextMode + nextMode 224 0 false - pause - 80 - 192 - false - - - - unpause - 80 - 640 - false - - - - toggleIso + toggleIso 84 0 false - movementEnvelope + movementEnvelope 81 128 false - fieldOfFire + fieldOfFire 82 0 false - toggleDrawLabels + toggleDrawLabels 66 128 false - toggleHexCoords + toggleHexCoords 71 128 false - toggleMinimap + toggleMinimap 77 128 false - viewLosSetting + viewLosSetting 76 640 false - toggleUnitDisplay + toggleUnitDisplay 68 128 false - toggleUnitOverview + toggleUnitOverview 85 128 false - toggleKeybinds + toggleKeybinds 75 128 false - togglePlanetaryConditions + togglePlanetaryConditions 80 128 false - toggleTurnDetails + toggleTurnDetails 84 128 false - clientSettings + clientSettings 67 512 false - incGuiScale + incGuiScale 107 128 false - decGuiScale + decGuiScale 109 128 false - roundReport + roundReport 82 128 false - zoomIn + zoomIn 107 0 false - zoomOut + zoomOut 109 0 false - quickLoad + quickLoad 76 192 false - quickSave + quickSave 83 192 false - localLoad + localLoad 76 128 false - localSave + localSave 83 128 false - replacePlayer + replacePlayer 82 192 false - viewModEnvelope + viewModEnvelope 87 128 false - sensorRange + sensorRange 67 0 false - undoSingleStep + undoSingleStep 8 128 false - toggleForceDisplay + toggleForceDisplay 70 128 false - extendTurnTimer + extendTurnTimer 115 128 false - \ No newline at end of file + diff --git a/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java b/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java index 00dfa989cd8..a0590743f68 100644 --- a/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java +++ b/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java @@ -173,6 +173,7 @@ private void pauseGameWhenOnlyBotUnitsRemain() { if (liveUnitsRemaining) { clientgui.getClient().sendChat("Pausing the game only works when only bot units remain."); } else { + clientgui.getClient().sendChat("Requesting game pause."); ((AbstractClient) clientgui.getClient()).sendPause(); } } From b7971233165bb9018cbec265aa8ead1ec1322a80 Mon Sep 17 00:00:00 2001 From: Coppio Date: Fri, 8 Nov 2024 00:33:34 -0300 Subject: [PATCH 07/57] feat: added multiple GM commands, including kill, change planetary conditions, orbital bombardment, etc. --- .../megamek/common/report-messages.properties | 4 + megamek/src/megamek/common/Game.java | 1 + .../commands/ChangeOwnershipCommand.java | 9 +- .../server/commands/ChangeWeatherCommand.java | 132 ++++++------- megamek/src/megamek/server/commands/IsGM.java | 13 ++ .../megamek/server/commands/KillCommand.java | 9 +- .../commands/OrbitalBombardmentCommand.java | 103 ++++++++++ .../server/commands/RemoveSmokeCommand.java | 9 +- .../server/props/OrbitalBombardment.java | 106 ++++++++++ .../server/totalwarfare/TWGameManager.java | 186 +++++++++++++++--- .../totalwarfare/TWPhaseEndManager.java | 1 + 11 files changed, 464 insertions(+), 109 deletions(-) create mode 100644 megamek/src/megamek/server/commands/IsGM.java create mode 100644 megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java create mode 100644 megamek/src/megamek/server/props/OrbitalBombardment.java diff --git a/megamek/i18n/megamek/common/report-messages.properties b/megamek/i18n/megamek/common/report-messages.properties index c7431827b9c..20be24c6ee5 100755 --- a/megamek/i18n/megamek/common/report-messages.properties +++ b/megamek/i18n/megamek/common/report-messages.properties @@ -55,6 +55,10 @@ 1241=Blue Shield Field Dampener fails! 1242=no effect +#1300s - Orbital Bombardment related +1300=An orbital bombardment hit hex !!! +1301=End of orbital bombardment resolution + # 1500s - ammo handling related 1500= () selected 1501= due to out of ammo! diff --git a/megamek/src/megamek/common/Game.java b/megamek/src/megamek/common/Game.java index 08f4a43ed56..cd106d57c9d 100644 --- a/megamek/src/megamek/common/Game.java +++ b/megamek/src/megamek/common/Game.java @@ -760,6 +760,7 @@ public void setLastPhase(GamePhase lastPhase) { /** * @return an enumeration of all the entities in the game. + * @deprecated Use {@link #inGameTWEntities()} instead. */ @Deprecated public Iterator getEntities() { diff --git a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java index 48691c02742..d50836c22e2 100644 --- a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java +++ b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java @@ -28,7 +28,7 @@ * * @author Luana Scoppio */ -public class ChangeOwnershipCommand extends ServerCommand { +public class ChangeOwnershipCommand extends ServerCommand implements IsGM { private final TWGameManager gameManager; @@ -49,8 +49,7 @@ public ChangeOwnershipCommand(Server server, TWGameManager gameManager) { @Override public void run(int connId, String[] args) { try { - var currentPlayer = server.getGame().getPlayer(connId); - if (!currentPlayer.isGameMaster()) { + if (!isGM(connId)) { server.sendServerChat(connId, "You are not a Game Master."); return; } @@ -73,4 +72,8 @@ public void run(int connId, String[] args) { } } + @Override + public TWGameManager getGameManager() { + return gameManager; + } } diff --git a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java index f18c5926e17..1e75fd97e2d 100644 --- a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java +++ b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java @@ -22,6 +22,12 @@ import megamek.server.Server; import megamek.server.totalwarfare.TWGameManager; + +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Stream; + /** * @author Luana Scoppio */ @@ -29,23 +35,38 @@ public class ChangeWeatherCommand extends ServerCommand { private final TWGameManager gameManager; + private static final String HELP_TEXT = "GM changes (weather) planetary conditions. The parameters are optional and unordered " + + "and the effects are applied at the beginning of the next turn. The square brackets means that argument is optional. " + + "Usage format: /weather [fog=0-2] [wind=0-6] [winddir=0-6] [light=0-6] [atmo=0-5] [blowsand=0-1] [weather=0-14] " + + "light= 0: daylight, 1: dusk, 2: full moon, 3: glare, 4: moonless night, 5: solar flare, 6: pitch black " + + "fog= 0: none, 1: light, 2: heavy " + + "wind= 0: calm, 1: light gale, 2: moderate gale, 3: strong gale, 4: storm, 5: tornado F1-F3, 6: tornado F4 " + + "winddir= 0: south, 1: southwest, 2: northwest, 3: north, 4: northeast, 5: southeast, 6: random " + + "atmo= 0: vacuum, 1: trace, 2: thin, 3: standard, 4: high, 5: very high " + + "blowsand= 0: no, 1: yes " + + "weather= 0: clear, 1: light rain, 2: moderate rain, 3: heavy rain, 4: gusting rain, 5: downpour, 6: light snow " + + "7: moderate snow, 8: snow flurries, 9: heavy snow, 10: sleet, 11: ice storm, 12: light hail, 13: heavy hail " + + "14: lightning storm"; + /** Creates new ChangeWeatherCommand */ public ChangeWeatherCommand(Server server, TWGameManager gameManager) { - super(server, "weather", "GM changes (weather) planetary conditions. The parameters are optional and unordered " + - "and the effects are applied at the beggining of the next turn. The square brackets means that argument is optional. " + - "Usage format: /weather [fog=0-2] [wind=0-6] [winddir=0-6] [light=0-6] [atmo=0-5] [blowsand=0-1] [weather=0-14] " + - "light= 0: daylight, 1: dusk, 2: full moon, 3: glare, 4: moonless night, 5: solar flare, 6: pitch black " + - "fog= 0: none, 1: light, 2: heavy " + - "wind= 0: calm, 1: light gale, 2: moderate gale, 3: strong gale, 4: storm, 5: tornado F1-F3, 6: tornado F4 " + - "winddir= 0: south, 1: southwest, 2: northwest, 3: north, 4: northeast, 5: southeast, 6: random " + - "atmo= 0: vacuum, 1: trace, 2: thin, 3: standard, 4: high, 5: very high " + - "blowsand= 0: no, 1: yes " + - "weather= 0: clear, 1: light rain, 2: moderate rain, 3: heavy rain, 4: gusting rain, 5: downpour, 6: light snow " + - "7: moderate snow, 8: snow flurries, 9: heavy snow, 10: sleet, 11: ice storm, 12: light hail, 13: heavy hail " + - "14: lightning storm"); + super(server, "weather", HELP_TEXT); this.gameManager = gameManager; } + private void updatePlanetaryCondition(String arg, String prefix, int connId, int maxLength, Consumer setter, + Function successMessage, Function errorMessage) { + var value = Integer.parseInt(arg.substring(prefix.length())); + if (value >= 0 && value < maxLength) { + setter.accept(value); + server.sendServerChat(connId, successMessage.apply(value)); + } else { + server.sendServerChat(connId, errorMessage.apply(maxLength)); + } + } + + private record Condition(int maxLength, Consumer setter, Function successMessage, Function errorMessage) {} + /** * Run this command with the arguments supplied */ @@ -56,75 +77,38 @@ public void run(int connId, String[] args) { return; } - // Check argument integrity. + var planetaryConditions = gameManager.getGame().getPlanetaryConditions(); + if (args.length > 1) { - // Check command - var planetaryConditions = gameManager.getGame().getPlanetaryConditions(); - for (var arg : args) { - if (arg.startsWith("fog=")) { - var fog = Integer.parseInt(arg.substring(4)); - if (fog >= 0 && fog < Fog.values().length) { - planetaryConditions.setFog(Fog.values()[fog]); - server.sendServerChat(connId, "The fog has changed."); - } else { - server.sendServerChat(connId, "Invalid fog value. Must be between 0 and " + Fog.values().length); - } - } else if (arg.startsWith("wind=")) { - var wind = Integer.parseInt(arg.substring(5)); - if (wind >= 0 && wind < Wind.values().length) { - planetaryConditions.setWind(Wind.values()[wind]); - server.sendServerChat(connId, "The wind strength has changed."); - } else { - server.sendServerChat(connId, "Invalid wind value. Must be between 0 and " + Wind.values().length); - } - } else if (arg.startsWith("winddir=")) { - var windDir = Integer.parseInt(arg.substring(8)); - if (windDir >= 0 && windDir < WindDirection.values().length) { - planetaryConditions.setWindDirection(WindDirection.values()[windDir]); - server.sendServerChat(connId, "The wind direction has changed."); - } else { - server.sendServerChat(connId, "Invalid wind direction value. Must be between 0 and " + WindDirection.values().length); - } - } else if (arg.startsWith("light=")) { - var light = Integer.parseInt(arg.substring(6)); - if (light >= 0 && light < Light.values().length) { - planetaryConditions.setLight(Light.values()[light]); - server.sendServerChat(connId, "The light has changed."); - } else { - server.sendServerChat(connId, "Invalid light value. Must be between 0 and " + Light.values().length); - } - } else if (arg.startsWith("atmo=")) { - var atmo = Integer.parseInt(arg.substring(5)); - if (atmo >= 0 && atmo < Atmosphere.values().length) { - planetaryConditions.setAtmosphere(Atmosphere.values()[atmo]); - server.sendServerChat(connId, atmo == 0 ? "The air has vanished, put your vac suits!" : "The air is changing."); - } else { - server.sendServerChat(connId, "Invalid atmosphere value. Must be between 0 and " + Atmosphere.values().length); - } - } else if (arg.startsWith("blowsand=")) { - var blowSand = Integer.parseInt(arg.substring(9)); - if (blowSand >= 0 && blowSand < BlowingSand.values().length) { - planetaryConditions.setBlowingSand(BlowingSand.values()[blowSand]); - server.sendServerChat(connId, blowSand == 1 ? "Sand started blowing." : "The sand has settled."); - } else { - server.sendServerChat(connId, "Invalid blowsand value. Must be between 0 and " + BlowingSand.values().length); - } - } else if (arg.startsWith("weather=")) { - var weather = Integer.parseInt(arg.substring(8)); - if (weather >= 0 && weather < Weather.values().length) { - planetaryConditions.setWeather(Weather.values()[weather]); - server.sendServerChat(connId, "The weather has changed."); - } else { - server.sendServerChat(connId, "Invalid weather value. Must be between 0 and " + Weather.values().length); + Map conditions = Map.of( + "fog=", new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), + value -> "The fog has changed.", maxLength -> "Invalid fog value. Must be between 0 and " + (maxLength - 1)), + "wind=", new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), + value -> "The wind strength has changed.", maxLength -> "Invalid wind value. Must be between 0 and " + (maxLength - 1)), + "winddir=", new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), + value -> "The wind direction has changed.", maxLength -> "Invalid wind direction value. Must be between 0 and " + (maxLength - 1)), + "light=", new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), + value -> "The light has changed.", maxLength -> "Invalid light value. Must be between 0 and " + (maxLength - 1)), + "atmo=", new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), + value -> value == 0 ? "The air has vanished, put your vac suits!" : "The air is changing.", maxLength -> "Invalid atmosphere value. Must be between 0 and " + (maxLength - 1)), + "blowsand=", new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), + value -> value == 1 ? "Sand started blowing." : "The sand has settled.", maxLength -> "Invalid blowsand value. Must be between 0 and " + (maxLength - 1)), + "weather=", new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), + value -> "The weather has changed.", maxLength -> "Invalid weather value. Must be between 0 and " + (maxLength - 1)) + ); + + Stream.of(args) + .forEach(arg -> conditions.forEach((prefix, condition) -> { + if (arg.startsWith(prefix)) { + updatePlanetaryCondition(arg, prefix, connId, condition.maxLength, condition.setter, condition.successMessage, condition.errorMessage); } - } - } + })); gameManager.getGame().setPlanetaryConditions(planetaryConditions); } else { // Error out; it's not a valid call. - server.sendServerChat(connId, "weather command failed."); + server.sendServerChat(connId, "weather command failed. " + HELP_TEXT); } } } diff --git a/megamek/src/megamek/server/commands/IsGM.java b/megamek/src/megamek/server/commands/IsGM.java new file mode 100644 index 00000000000..6c8fcff5545 --- /dev/null +++ b/megamek/src/megamek/server/commands/IsGM.java @@ -0,0 +1,13 @@ +package megamek.server.commands; + +import megamek.server.totalwarfare.TWGameManager; + +public interface IsGM { + + TWGameManager getGameManager(); + + default boolean isGM(int connId) { + return getGameManager().getGame().getPlayer(connId).getGameMaster(); + } + +} diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index 837bcce266e..bc436c49380 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -25,7 +25,7 @@ /** * @author Luana Scoppio */ -public class KillCommand extends ServerCommand { +public class KillCommand extends ServerCommand implements IsGM { private final TWGameManager gameManager; @@ -49,7 +49,7 @@ public void run(int connId, String[] args) { server.sendServerChat(connId, "Command-line kill is not enabled in this game."); return; } - if (!server.getPlayer(connId).getGameMaster()) { + if (!isGM(connId)) { server.sendServerChat(connId, "You are not a Game Master."); return; } @@ -74,4 +74,9 @@ public void run(int connId, String[] args) { server.sendServerChat(connId, "Kill command failed (1). Proper format is \"/kill \" where id is the units ID"); } } + + @Override + public TWGameManager getGameManager() { + return gameManager; + } } diff --git a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java new file mode 100644 index 00000000000..c3d31e2202f --- /dev/null +++ b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.options.OptionsConstants; +import megamek.server.Server; +import megamek.server.props.OrbitalBombardment; +import megamek.server.totalwarfare.TWGameManager; + +/** + * @author Luana Scoppio + */ +public class OrbitalBombardmentCommand extends ServerCommand implements IsGM { + + private final TWGameManager gameManager; + + /** Creates new NukeCommand */ + public OrbitalBombardmentCommand(Server server, TWGameManager gameManager) { + super(server, "ob", "GM Drops a bomb onto the board doing of 100 damage with a 3 hex radius, to be exploded at" + + "the end of the next weapons attack phase." + + "Allowed formats:"+ + "/bomb and" + + "/bomb [factor=10] [radius=4]" + + "the damage at impact point is 10 times the factor, default is 10. " + + "and hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23), the explosion blast radius default " + + "is equal to 4, it automatically applies a linear damage dropoff each hex away from the center." + + " All parameters in square brackets may be ommited. " + + " Example: /ob 10 10 factor=12 "); + this.gameManager = gameManager; + } + + /** + * Run this command with the arguments supplied + */ + @Override + public void run(int connId, String[] args) { + + // Check to make sure nuking is allowed by game options! + if (!isGM(connId)) { + server.sendServerChat(connId, "You are not a Game Master."); + return; + } + + if (args.length >= 3) { + var orbitalBombardmentBuilder = new OrbitalBombardment.Builder(); + try { + int[] position = new int[2]; + for (int i = 1; i < 3; i++) { + position[i-1] = Integer.parseInt(args[i]) - 1; + } + // is the hex on the board? + if (!gameManager.getGame().getBoard().contains(position[0], position[1])) { + server.sendServerChat(connId, "Specified hex is not on the board."); + return; + } + + orbitalBombardmentBuilder + .x(position[0]) + .y(position[1]); + + if (args.length > 3) { + for (int i = 3; i < args.length; i++) { + String[] keyValue = args[i].split("="); + if (keyValue[0].equals("factor")) { + orbitalBombardmentBuilder.damageFactor(Integer.parseInt(keyValue[1])); + } else if (keyValue[0].equals("radius")) { + orbitalBombardmentBuilder.radius(Integer.parseInt(keyValue[1])); + } + } + } + + gameManager.addScheduledOrbitalBombardment(orbitalBombardmentBuilder.build()); + server.sendServerChat(connId, "This isn't a shooting star! Take cover!"); + } catch (Exception e) { + server.sendServerChat(connId, "Orbital bombardment command failed (2). Proper format is \"/ob [factor=10] [radius=4]\" where hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23)"); + } + } else { + // Error out; it's not a valid call. + server.sendServerChat(connId, "Orbital bombardment command failed (1). Proper format is \"/ob [factor=10] [radius=4]\" where hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23)"); + } + } + + @Override + public TWGameManager getGameManager() { + return gameManager; + } +} diff --git a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java index ae28fd7a61e..5715ae19736 100644 --- a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java +++ b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java @@ -27,7 +27,7 @@ /** * @author Luana Scoppio */ -public class RemoveSmokeCommand extends ServerCommand { +public class RemoveSmokeCommand extends ServerCommand implements IsGM { private final TWGameManager gameManager; @@ -42,7 +42,7 @@ public RemoveSmokeCommand(Server server, TWGameManager gameManager) { */ @Override public void run(int connId, String[] args) { - if (!server.getPlayer(connId).getGameMaster()) { + if (!isGM(connId)) { server.sendServerChat(connId, "You are not a Game Master."); return; } @@ -57,4 +57,9 @@ public void run(int connId, String[] args) { server.sendServerChat(connId, "nosmoke command failed (1)."); } } + + @Override + public TWGameManager getGameManager() { + return gameManager; + } } diff --git a/megamek/src/megamek/server/props/OrbitalBombardment.java b/megamek/src/megamek/server/props/OrbitalBombardment.java new file mode 100644 index 00000000000..e49e1c965e4 --- /dev/null +++ b/megamek/src/megamek/server/props/OrbitalBombardment.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.props; + +/** + * Represents an orbital bombardment event. + * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with + * regular/linear damage droppoff. + * + * @author Luana Scoppio + */ +public class OrbitalBombardment { + + private final int x; + private final int y; + private final int damageFactor; + private final int radius; + + /** + * Represents an orbital bombardment event. + * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with + * regular/linear damage droppoff. + * + * @param builder + */ + private OrbitalBombardment(Builder builder) { + this.x = builder.x; + this.y = builder.y; + this.damageFactor = builder.damageFactor; + this.radius = builder.radius; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getDamageFactor() { + return damageFactor; + } + + public int getRadius() { + return radius; + } + + /** + * Builder of an orbital bombardment event. + * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with + * regular/linear damage droppoff. + * + */ + public static class Builder { + private int x; + private int y; + private int damageFactor = 10; + private int radius = 4; + + public Builder x(int x) { + this.x = x; + return this; + } + + public Builder y(int y) { + this.y = y; + return this; + } + + public Builder damageFactor(int damageFactor) { + this.damageFactor = damageFactor; + return this; + } + + public Builder radius(int radius) { + this.radius = radius; + return this; + } + + /** + * Builds an orbital bombardment. + * + * @return an immutable instance of an orbital bombardment. + */ + public OrbitalBombardment build() { + return new OrbitalBombardment(this); + } + } +} diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 95aabd23203..4eb440a79a0 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -73,6 +73,7 @@ import megamek.logging.MMLogger; import megamek.server.*; import megamek.server.commands.*; +import megamek.server.props.OrbitalBombardment; import megamek.server.victory.VictoryResult; /** @@ -101,6 +102,7 @@ public Vector getvPhaseReport() { private final List terrainProcessors = new ArrayList<>(); private ArrayList scheduledNukes = new ArrayList<>(); + private ArrayList scheduledOrbitalBombardment = new ArrayList<>(); /** * Stores a set of Coords that have changed during this phase. @@ -19736,7 +19738,7 @@ public Vector damageEntity(Entity te, HitData hit, int damage, int[] damages = { (int) Math.floor(damage_orig / 10.0), (int) Math.floor(damage_orig / 20.0) }; doExplosion(damages, false, te.getPosition(), true, vDesc, null, 5, - te.getId(), false); + te.getId(), false, false); Report.addNewline(vDesc); r = new Report(5410, Report.PUBLIC); r.subject = te.getId(); @@ -20018,7 +20020,7 @@ public void doFusionEngineExplosion(int engineRating, Coords position, Vector vUnits) { int[] myDamages = { engineRating, (engineRating / 10), (engineRating / 20), (engineRating / 40) }; - doExplosion(myDamages, true, position, false, vDesc, vUnits, 5, -1, true); + doExplosion(myDamages, true, position, false, vDesc, vUnits, 5, -1, true, false); } /** @@ -20026,7 +20028,7 @@ public void doFusionEngineExplosion(int engineRating, Coords position, Vector vDesc, - Vector vUnits, int excludedUnitId) { + Vector vUnits, int excludedUnitId, boolean canDamageVtol) { if (degradation < 1) { return; } @@ -20042,15 +20044,16 @@ public void doExplosion(int damage, int degradation, boolean autoDestroyInSameHe myDamages[x] = myDamages[x - 1] - degradation; } doExplosion(myDamages, autoDestroyInSameHex, position, allowShelter, vDesc, vUnits, - 5, excludedUnitId, false); + 5, excludedUnitId, false, canDamageVtol); } /** * General function to cause explosions in areas. + * TODO Luana: Refactor this function so it is less of a mess */ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords position, boolean allowShelter, Vector vDesc, Vector vUnits, - int clusterAmt, int excludedUnitId, boolean engineExplosion) { + int clusterAmt, int excludedUnitId, boolean engineExplosion, boolean canDamageVtol) { if (vDesc == null) { vDesc = new Vector<>(); } @@ -20137,9 +20140,7 @@ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords posi // Now we damage people near the explosion. List loaded = new ArrayList<>(); - for (Iterator ents = game.getEntities(); ents.hasNext();) { - Entity entity = ents.next(); - + for (var entity : game.inGameTWEntities()) { if (entitiesHit.contains(entity)) { continue; } @@ -20157,12 +20158,6 @@ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords posi continue; } - // We are going to assume that explosions are on the ground here so - // flying entities should be unaffected - if (entity.isAirborne()) { - continue; - } - if ((entity instanceof MekWarrior) && !((MekWarrior) entity).hasLanded()) { // MekWarrior is still up in the air ejecting hence safe // from this explosion. @@ -20178,6 +20173,7 @@ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords posi } continue; } + int range = position.distance(entityPos); if (range >= damages.length) { @@ -20185,6 +20181,23 @@ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords posi continue; } + // We are going to assume that explosions are on the ground here so + // flying entities should be unaffected, except VTOL or WiGE + if (entity.isAirborne() && !canDamageVtol) { + continue; + } else if (entity.isAirborne() && canDamageVtol && entity.isAirborneVTOLorWIGE()) { + if (entity.getElevation() > damages.length) { + continue; + } + if ((range + entity.getElevation()) > damages.length) { + continue; + } else { + range += entity.getElevation(); + } + } else { + continue; + } + // We might need to nuke everyone in the explosion hex. If so... if ((range == 0) && autoDestroyInSameHex) { // Add the reports @@ -20267,23 +20280,54 @@ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords posi r.addDesc(e); r.add(damage); vDesc.addElement(r); - - while (damage > 0) { - int cluster = Math.min(5, damage); - int table = ToHitData.HIT_NORMAL; - if (e instanceof ProtoMek) { - table = ToHitData.HIT_SPECIAL_PROTO; - } - HitData hit = e.rollHitLocation(table, ToHitData.SIDE_FRONT); - vDesc.addAll(damageEntity(e, hit, cluster, false, - DamageType.IGNORE_PASSENGER, false, true)); - damage -= cluster; + if (canDamageVtol) { + orbitalBombardmentDamage(position, vDesc, e, damage); + } else { + explosionDamage(position, vDesc, e, damage); } Report.addNewline(vDesc); } } } + private void explosionDamage(Coords position, Vector vDesc, Entity e, int damage) { + while (damage > 0) { + int cluster = Math.min(5, damage); + int table = ToHitData.HIT_NORMAL; + if (e instanceof ProtoMek) { + table = ToHitData.HIT_SPECIAL_PROTO; + } + HitData hit = e.rollHitLocation(table, ToHitData.SIDE_FRONT); + vDesc.addAll(damageEntity(e, hit, cluster, false, + DamageType.IGNORE_PASSENGER, false, true)); + damage -= cluster; + } + } + + private void orbitalBombardmentDamage(Coords position, Vector vDesc, Entity e, int damage) { + while (damage > 0) { + int cluster = Math.min(5, damage); + int table = ToHitData.HIT_NORMAL; + int hitSide = ToHitData.SIDE_RANDOM; + if (e instanceof ProtoMek) { + table = ToHitData.HIT_SPECIAL_PROTO; + } else if (e instanceof Mek) { + table = ToHitData.HIT_ABOVE; + hitSide = e.sideTable(position); + } else if (e instanceof Tank) { + if (e.isAirborneVTOLorWIGE()) { + table = ToHitData.HIT_ABOVE; + } + hitSide = e.sideTable(position); + } + + HitData hit = e.rollHitLocation(table, hitSide); + vDesc.addAll(damageEntity(e, hit, cluster, false, + DamageType.IGNORE_PASSENGER, false, true)); + damage -= cluster; + } + } + /** * Check if an Entity of the passed height can find shelter from a nuke blast * @@ -20343,6 +20387,16 @@ public void addScheduledNuke(int[] nuke) { scheduledNukes.add(nuke); } + /** + * add an orbital bombardment to hit the board in the next weapons attack phase + * + * @param orbitalBombardment this is an #OrbitalBombardment object, its immutable and must be constructed + * through it's builder. + */ + public void addScheduledOrbitalBombardment(OrbitalBombardment orbitalBombardment) { + scheduledOrbitalBombardment.add(orbitalBombardment); + } + /** * explode any scheduled nukes */ @@ -20360,6 +20414,15 @@ void resolveScheduledNukes() { scheduledNukes.clear(); } + /** + * explode any scheduled orbital bombardments + */ + void resolveScheduledOrbitalBombardments() { + scheduledOrbitalBombardment + .forEach(ob -> doOrbitalBombardment(new Coords(ob.getX(), ob.getY()), ob.getDamageFactor(), ob.getRadius(), vPhaseReport)); + scheduledOrbitalBombardment.clear(); + } + /** * do a nuclear explosion * @@ -20378,6 +20441,72 @@ public void doNuclearExplosion(Coords position, int nukeType, Vector vDe nukeStats.craterDepth, vDesc); } + /** + * do an orbital bombardment + * @param position the position that will be hit by the orbital bombardment + * @param damageFactor the factor by which the base damage will be multiplied + * @param radius the radius which the damage will hit + * @param vDesc a vector that contains the output report + */ + public void doOrbitalBombardment(Coords position, int damageFactor, int radius, Vector vDesc) { + // Just in case. + if (vDesc == null) { + vDesc = new Vector<>(); + } + + Report r = new Report(1300, Report.PUBLIC); + + r.indent(); + r.add(position.getBoardNum(), true); + vDesc.add(r); + + // Then, do actual blast damage. + // Use the standard blast function for this. + Vector tmpV = new Vector<>(); + Vector blastedUnitsVec = new Vector<>(); + int range = radius + 1; + int baseDamage = damageFactor * 10; + var degradation = baseDamage / range; + doExplosion(baseDamage, degradation , false, position, true, tmpV, + blastedUnitsVec, -1, true); + Report.indentAll(tmpV, 2); + vDesc.addAll(tmpV); + + // Next, for whatever's left, do terrain effects + // such as clearing, roughing, and boiling off water. + boolean damageFlag = true; + + // Lastly, do secondary effects. + for (Entity entity : game.getEntitiesVector()) { + // loaded units and off board units don't have a position, + // so we don't count 'em here + if ((entity.getTransportId() != Entity.NONE) || (entity.getPosition() == null)) { + continue; + } + + // If it's already destroyed... + if ((entity.isDoomed()) || (entity.isDestroyed())) { + continue; + } + + // If it's too far away for this... + if (position.distance(entity.getPosition()) > radius) { + continue; + } + + // Actually do secondary effects against it. + // Since the effects are unit-dependant, we'll just define it in the + // entity. +// applySecondaryNuclearEffects(entity, position, vDesc); + } + + // All right. We're done. + r = new Report(1216, Report.PUBLIC); + r.indent(); + r.newlines = 2; + vDesc.add(r); + } + /** * explode a nuke * @@ -20472,8 +20601,9 @@ public void doNuclearExplosion(Coords position, int baseDamage, int degradation, // Use the standard blast function for this. Vector tmpV = new Vector<>(); Vector blastedUnitsVec = new Vector<>(); + doExplosion(baseDamage, degradation, true, position, true, tmpV, - blastedUnitsVec, -1); + blastedUnitsVec, -1, false); Report.indentAll(tmpV, 2); vDesc.addAll(tmpV); @@ -28374,7 +28504,7 @@ public Vector damageBuilding(Building bldg, int damage, String why, Coor Vector vRep = new Vector<>(); doExplosion(((FuelTank) bldg).getMagnitude(), 10, false, bldg.getCoords().nextElement(), true, - vRep, null, -1); + vRep, null, -1, false); Report.indentAll(vRep, 2); vPhaseReport.addAll(vRep); return vPhaseReport; @@ -28571,7 +28701,7 @@ private Vector criticalGunEmplacement(Vector guns, Build Vector vRep = new Vector<>(); doExplosion(((FuelTank) bldg).getMagnitude(), 10, false, bldg.getCoords().nextElement(), true, vRep, null, - -1); + -1, false); Report.indentAll(vRep, 2); vDesc.addAll(vRep); return vPhaseReport; diff --git a/megamek/src/megamek/server/totalwarfare/TWPhaseEndManager.java b/megamek/src/megamek/server/totalwarfare/TWPhaseEndManager.java index fb402b691a5..4edf0209754 100644 --- a/megamek/src/megamek/server/totalwarfare/TWPhaseEndManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWPhaseEndManager.java @@ -135,6 +135,7 @@ void managePhase() { gameManager.assignAMS(); gameManager.handleAttacks(); gameManager.resolveScheduledNukes(); + gameManager.resolveScheduledOrbitalBombardments(); gameManager.applyBuildingDamage(); gameManager.checkForPSRFromDamage(); gameManager.cleanupDestroyedNarcPods(); From c4372d6fa17d5453e7ce28fb101418b971fa0473 Mon Sep 17 00:00:00 2001 From: Pavel Braginskiy Date: Fri, 8 Nov 2024 23:05:13 -0800 Subject: [PATCH 08/57] Allow printing unit list from MM --- .../i18n/megamek/client/messages.properties | 6 ++ .../megamek/client/ui/swing/ClientGUI.java | 65 +++++++++++++++++++ .../client/ui/swing/CommonSettingsDialog.java | 36 ++++++++-- .../client/ui/swing/lobby/ChatLounge.java | 17 ++++- .../common/preference/ClientPreferences.java | 11 ++++ 5 files changed, 128 insertions(+), 7 deletions(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 4c96ba383f0..c283ac15e35 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -647,6 +647,8 @@ ChatLounge.butGroundMap = Ground Map ChatLounge.butNames=Random Names... ChatLounge.butRemoveBot=Remove Bot ChatLounge.butSaveList=Save Unit List... +ChatLounge.butPrintList=Print Unit List... +ChatLounge.butPrintList.printing=Loading print dialog ChatLounge.butShrink=< ChatLounge.butSkills=Random Skills... ChatLounge.butShowUnitID=Show IDs @@ -1270,6 +1272,10 @@ CommonSettingsDialog.logFileName=Game log filename: CommonSettingsDialog.userDir=User Files Directory: CommonSettingsDialog.userDir.tooltip=Use this directory for resources you want to share between different installs or versions of MegaMek, MegaMekLab and MekHQ. Fonts, units, camos, portraits and fluff images will also be loaded from this directory.
Note: Inside the user directory, use the directory structure of MM/MML/MHQ for camos, portraits and fluff images, i.e. data/images/camo, data/images/portraits and data/images/fluff/.
Fonts and units can be placed anywhere in the user directory. CommonSettingsDialog.userDir.chooser.title=Choose User Data Folder +CommonSettingsDialog.mmlPath=Path to MegaMekLab Executable: +CommonSettingsDialog.mmlPath.tooltip=Used for printing unit lists.\ +
MegaMek will try to autodetect this when the option is blank if MM and MML are installed together. +CommonSettingsDialog.mmlPath.chooser.title=Select MegaMekLab Executable CommonSettingsDialog.main=Main CommonSettingsDialog.audio=Audio CommonSettingsDialog.miniMap=Mini Map diff --git a/megamek/src/megamek/client/ui/swing/ClientGUI.java b/megamek/src/megamek/client/ui/swing/ClientGUI.java index 4acc76028f5..3a6d459c4b3 100644 --- a/megamek/src/megamek/client/ui/swing/ClientGUI.java +++ b/megamek/src/megamek/client/ui/swing/ClientGUI.java @@ -2069,6 +2069,71 @@ public void saveListFile(ArrayList unitList, String filename) { } } + public void printList(ArrayList unitList, JButton button) { + if ((unitList == null) || unitList.isEmpty()) { + return; + } + + var mmlPath = CP.getMmlPath(); + var autodetect = false; + if (null == mmlPath || mmlPath.isBlank()) { + autodetect = true; + if (System.getProperty("os.name").toLowerCase().contains("win")) { + mmlPath = "MegaMekLab.exe"; + } else { + mmlPath = "MegaMekLab.sh"; + } + } + + var mml = new File(mmlPath); + + if (!mml.canExecute()) { + if (autodetect) { + logger.error("Could not auto-detect MegaMekLab! Please configure the path to the MegaMekLab executable in the settings.", "Error printing unit list"); + } else { + logger.error("%s does not appear to be an executable! Please configure the path to the MegaMekLab executable in the settings.".formatted(mml.getName()), "Error printing unit list"); + } + return; + } + + try { + var unitFile = File.createTempFile("MegaMekPrint", ".mul"); + EntityListFile.saveTo(unitFile, unitList); + String[] command; + if (mml.getName().toLowerCase().contains("gradle")) { + command = new String[] { + mml.getAbsolutePath(), + "run", + "--args=%s --no-startup".formatted(unitFile.getAbsolutePath()) + }; + } else { + command = new String[] { + mml.getAbsolutePath(), + unitFile.getAbsolutePath(), + "--no-startup" + }; + } + button.setText(Messages.getString("ChatLounge.butPrintList.printing")); + logger.info("Running command: {}", String.join(" ", command)); + var p = new ProcessBuilder(command) + .directory(mml.getAbsoluteFile().getParentFile()) + .inheritIO() + .start(); + new Thread(() -> { + try { + p.waitFor(); + } catch (InterruptedException e) { + logger.error(e); + } finally { + button.setText(Messages.getString("ChatLounge.butPrintList")); + } + }).start(); + + } catch (Exception e) { + logger.error(e, "Operation failed", "Error printing unit list"); + } + } + protected void saveVictoryList() { String filename = client.getLocalPlayer().getName(); diff --git a/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java b/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java index 431ca7b313b..ae77658b6b6 100644 --- a/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java +++ b/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java @@ -212,6 +212,7 @@ private void moveElement(DefaultListModel srcModel, int srcIndex, int trg private JTextField tfSoundMuteOthersFileName; private JTextField userDir; + private JTextField mmlPath; private final JCheckBox keepGameLog = new JCheckBox(Messages.getString("CommonSettingsDialog.keepGameLog")); private JTextField gameLogFilename; private final JCheckBox stampFilenames = new JCheckBox(Messages.getString("CommonSettingsDialog.stampFilenames")); @@ -1724,6 +1725,23 @@ private JPanel getSettingsPanel() { addLineSpacer(comps); + JLabel mmlPathLabel = new JLabel(Messages.getString("CommonSettingsDialog.mmlPath")); + mmlPathLabel.setToolTipText(Messages.getString("CommonSettingsDialog.mmlPath.tooltip")); + mmlPath = new JTextField(20); + mmlPath.setMaximumSize(new Dimension(250, 40)); + mmlPath.setToolTipText(Messages.getString("CommonSettingsDialog.mmlPath.tooltip")); + JButton mmlPathChooser = new JButton("..."); + mmlPathChooser.addActionListener(e -> + fileChoose(mmlPath, getFrame(), Messages.getString("CommonSettingsDialog.mmlPath.chooser.title"), false)); + row = new ArrayList<>(); + row.add(mmlPathLabel); + row.add(mmlPath); + row.add(Box.createHorizontalStrut(10)); + row.add(mmlPathChooser); + comps.add(row); + + addLineSpacer(comps); + // UI Theme uiThemes = new JComboBox<>(); uiThemes.setMaximumSize(new Dimension(400, uiThemes.getMaximumSize().height)); @@ -1944,6 +1962,7 @@ public void setVisible(boolean visible) { gameLogFilename.setEnabled(keepGameLog.isSelected()); gameLogFilename.setText(CP.getGameLogFilename()); userDir.setText(CP.getUserDir()); + mmlPath.setText(CP.getMmlPath()); stampFilenames.setSelected(CP.stampFilenames()); stampFormat.setEnabled(stampFilenames.isSelected()); stampFormat.setText(CP.getStampFormat()); @@ -2421,6 +2440,7 @@ protected void okAction() { CP.setKeepGameLog(keepGameLog.isSelected()); CP.setGameLogFilename(gameLogFilename.getText()); CP.setUserDir(userDir.getText()); + CP.setMmlPath(mmlPath.getText()); CP.setStampFilenames(stampFilenames.isSelected()); CP.setStampFormat(stampFormat.getText()); CP.setReportKeywords(reportKeywordsTextPane.getText()); @@ -3452,13 +3472,19 @@ public static List filteredFilesWithSubDirs(File path, String fileEnding * @param parent The parent JFrame of the settings dialog */ public static void fileChooseUserDir(JTextField userDirTextField, JFrame parent) { - JFileChooser userDirChooser = new JFileChooser(userDirTextField.getText()); - userDirChooser.setDialogTitle(Messages.getString("CommonSettingsDialog.userDir.chooser.title")); - userDirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + fileChoose(userDirTextField, parent, Messages.getString("CommonSettingsDialog.userDir.chooser.title"),true); + } + + private static void fileChoose(JTextField textField, JFrame parent, String title, boolean directories) { + JFileChooser userDirChooser = new JFileChooser(textField.getText()); + userDirChooser.setDialogTitle(title); + if (directories) { + userDirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } int returnVal = userDirChooser.showOpenDialog(parent); if ((returnVal == JFileChooser.APPROVE_OPTION) && (userDirChooser.getSelectedFile() != null) - && userDirChooser.getSelectedFile().isDirectory()) { - userDirTextField.setText(userDirChooser.getSelectedFile().toString()); + && (directories ? userDirChooser.getSelectedFile().isDirectory() : userDirChooser.getSelectedFile().isFile())) { + textField.setText(userDirChooser.getSelectedFile().toString()); } } } diff --git a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java index 2066ee4cd5b..40285e77c44 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java +++ b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java @@ -160,6 +160,7 @@ public class ChatLounge extends AbstractPhaseDisplay implements private JButton butNames = new JButton(Messages.getString("ChatLounge.butNames")); private JButton butLoadList = new JButton(Messages.getString("ChatLounge.butLoadList")); private JButton butSaveList = new JButton(Messages.getString("ChatLounge.butSaveList")); + private JButton butPrintList = new JButton(Messages.getString("ChatLounge.butPrintList")); /* Unit Table */ private MekTable mekTable; @@ -276,6 +277,7 @@ public class ChatLounge extends AbstractPhaseDisplay implements private static final String CL_ACTIONCOMMAND_LOADLIST = "load_list"; private static final String CL_ACTIONCOMMAND_SAVELIST = "save_list"; + private static final String CL_ACTIONCOMMAND_PRINTLIST = "print_list"; private static final String CL_ACTIONCOMMAND_LOADMEK = "load_mek"; private static final String CL_ACTIONCOMMAND_ADDBOT = "add_bot"; private static final String CL_ACTIONCOMMAND_REMOVEBOT = "remove_bot"; @@ -365,6 +367,7 @@ private void setupListeners() { butRandomMap.addActionListener(lobbyListener); butRemoveBot.addActionListener(lobbyListener); butSaveList.addActionListener(lobbyListener); + butPrintList.addActionListener(lobbyListener); butShowUnitID.addActionListener(lobbyListener); butSkills.addActionListener(lobbyListener); butSpaceSize.addActionListener(lobbyListener); @@ -546,6 +549,8 @@ private void setupUnitConfig() { butLoadList.setEnabled(mscLoaded); butSaveList.setActionCommand(CL_ACTIONCOMMAND_SAVELIST); butSaveList.setEnabled(false); + butPrintList.setActionCommand(CL_ACTIONCOMMAND_PRINTLIST); + butPrintList.setEnabled(false); butAdd.setEnabled(mscLoaded); butAdd.setActionCommand(CL_ACTIONCOMMAND_LOADMEK); butArmy.setEnabled(mscLoaded); @@ -561,6 +566,7 @@ private void setupUnitConfig() { panUnitInfoGrid.add(butLoadList); panUnitInfoGrid.add(butSaveList); panUnitInfoGrid.add(butNames); + panUnitInfoGrid.add(butPrintList); panUnitInfo.add(panUnitInfoAdd); panUnitInfo.add(panUnitInfoGrid); @@ -1739,7 +1745,7 @@ public void actionPerformed(ActionEvent ev) { } clientgui.loadListFile(c.getLocalPlayer()); - } else if (ev.getSource().equals(butSaveList)) { + } else if (ev.getSource().equals(butSaveList) || ev.getSource().equals(butPrintList)) { // Allow the player to save their current // list of entities to a file. Client c = getSelectedClient(); @@ -1752,7 +1758,11 @@ public void actionPerformed(ActionEvent ev) { for (Entity entity : entities) { entity.setForceString(game().getForces().forceStringFor(entity)); } - clientgui.saveListFile(entities, c.getLocalPlayer().getName()); + if (ev.getSource().equals(butSaveList)) { + clientgui.saveListFile(entities, c.getLocalPlayer().getName()); + } else { + clientgui.printList(entities, (JButton) ev.getSource()); + } } else if (ev.getSource().equals(butAddBot)) { configAndCreateBot(null); @@ -2285,6 +2295,7 @@ public void removeAllListeners() { butRandomMap.removeActionListener(lobbyListener); butRemoveBot.removeActionListener(lobbyListener); butSaveList.removeActionListener(lobbyListener); + butPrintList.removeActionListener(lobbyListener); butShowUnitID.removeActionListener(lobbyListener); butSkills.removeActionListener(lobbyListener); butSpaceSize.removeActionListener(lobbyListener); @@ -2404,10 +2415,12 @@ private void refreshPlayerConfig() { // Disable the Remove Bot button for the "player" of a "Connect As Bot" client butRemoveBot.setEnabled(isSingleLocalBot); butSaveList.setEnabled(false); + butPrintList.setEnabled(false); if (isSinglePlayer) { var selPlayer = theElement(selPlayers); var hasUnits = !game().getPlayerEntities(selPlayer, false).isEmpty(); butSaveList.setEnabled(hasUnits && unitsVisible(selPlayer)); + butPrintList.setEnabled(hasUnits && unitsVisible(selPlayer)); setTeamSelectedItem(selPlayer.getTeam()); } } diff --git a/megamek/src/megamek/common/preference/ClientPreferences.java b/megamek/src/megamek/common/preference/ClientPreferences.java index c4629e65c8c..75d3b4b7943 100644 --- a/megamek/src/megamek/common/preference/ClientPreferences.java +++ b/megamek/src/megamek/common/preference/ClientPreferences.java @@ -70,6 +70,8 @@ public class ClientPreferences extends PreferenceStoreProxy { */ public static final String USER_DIR = "UserDir"; + public static final String MML_PATH = "MmlPath"; + // endregion Variable Declarations // region Constructors @@ -103,6 +105,7 @@ public ClientPreferences(IPreferenceStore store) { store.setDefault(IP_ADDRESSES_IN_CHAT, false); store.setDefault(START_SEARCHLIGHTS_ON, true); store.setDefault(USER_DIR, ""); + store.setDefault(MML_PATH, ""); setLocale(store.getString(LOCALE)); setMekHitLocLog(); } @@ -406,4 +409,12 @@ public void setUserDir(String userDir) { } store.setValue(USER_DIR, userDir); } + + public String getMmlPath() { + return store.getString(MML_PATH); + } + + public void setMmlPath(String mmlPath) { + store.setValue(MML_PATH, mmlPath.isBlank() ? "" : new File(mmlPath).getAbsolutePath()); + } } From 1c5395ed55913960a3d2a3f2c3f9e9f2f4518277 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sat, 9 Nov 2024 22:04:10 -0500 Subject: [PATCH 09/57] add an advanced search for boards to the lobby --- .../i18n/megamek/client/messages.properties | 1 + .../AdvancedSearchMapDialog.java | 240 ++++++++++++++++++ .../ui/advancedSearchMap/BoardTableModel.java | 194 ++++++++++++++ .../client/ui/swing/lobby/ChatLounge.java | 33 +++ 4 files changed, 468 insertions(+) create mode 100644 megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java create mode 100644 megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 4c96ba383f0..3d1f23e90a0 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -155,6 +155,7 @@ BT.Quirks=Quirks AdvancedSearchDialog.title=Advanced Search +AdvancedSearchMapDialog.title=Advanced Search AimedShotDialog.dontAim=Don't aim diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java new file mode 100644 index 00000000000..25c013d111c --- /dev/null +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.client.ui.advancedSearchMap; + +import megamek.client.ui.Messages; +import megamek.client.ui.baseComponents.AbstractButtonDialog; +import megamek.client.ui.swing.ButtonEsc; +import megamek.client.ui.swing.CloseAction; +import megamek.client.ui.swing.dialog.DialogButton; +import megamek.common.Board; +import megamek.common.Configuration; +import megamek.common.util.fileUtils.MegaMekFile; +import megamek.utilities.BoardClassifier; +import megamek.utilities.BoardsTagger; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import javax.swing.border.MatteBorder; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableRowSorter; +import java.awt.*; +import java.util.Arrays; +import java.util.List; +import java.util.regex.PatternSyntaxException; + +/** + * This is the dialog for advanced map filtering + */ +public class AdvancedSearchMapDialog extends AbstractButtonDialog { + + BoardClassifier bc; + JTable boardTable; + JList listBoardTags; + JList listBoardPaths; + JLabel boardImage; + JLabel boardInfo; + TableRowSorter boardSorter; + + private BoardTableModel boardModel; + public AdvancedSearchMapDialog(JFrame parent) { + super(parent, true, "AdvancedSearchMapDialog", "AdvancedSearchMapDialog.title"); + + initialize(); + } + + + @Override + protected JPanel createButtonPanel() { + JButton cancelButton = new ButtonEsc(new CloseAction(this)); + JButton okButton = new DialogButton(Messages.getString("Ok.text")); + okButton.addActionListener(this::okButtonActionPerformed); + getRootPane().setDefaultButton(okButton); + + JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 20, 0)); + buttonPanel.add(okButton); + buttonPanel.add(cancelButton); + + JPanel outerPanel = new JPanel(new GridLayout(1,1)); + outerPanel.setBorder(BorderFactory.createCompoundBorder( + new MatteBorder(1, 0, 0, 0, UIManager.getColor("Separator.foreground")), + new EmptyBorder(10, 0, 10, 0))); + outerPanel.add(buttonPanel); + + return outerPanel; + } + + @Override + protected Container createCenterPane() { + bc = BoardClassifier.getInstance(); + + JPanel advancedSearchPane = new JPanel(); + + advancedSearchPane.setLayout(new BoxLayout(advancedSearchPane, BoxLayout.PAGE_AXIS)); + + advancedSearchPane.add(createInfo()); + + JPanel mainPanel = new JPanel(new FlowLayout()); + mainPanel.add(createFilter()); + mainPanel.add(createList()); + + advancedSearchPane.add(mainPanel); + + return advancedSearchPane; + + } + + private JPanel createInfo() { + JPanel infoPanel = new JPanel(new FlowLayout()); + boardImage = new JLabel(); + infoPanel.add(boardImage); + boardInfo = new JLabel(); + infoPanel.add(boardInfo); + return infoPanel; + } + + private JPanel createFilter() { + JPanel filterPanel = new JPanel(); + filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.PAGE_AXIS)); + + List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().toList(); + DefaultListModel tagsModel = new DefaultListModel<>(); + tagsModel.addAll(tags); + listBoardTags = new JList<>(tagsModel); + listBoardTags.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + listBoardTags.addSelectionInterval(0, tags.size()); + listBoardTags.addListSelectionListener (new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + filterTables(); + } + }); + JPanel boardTagsPanel = new JPanel(new BorderLayout()); + boardTagsPanel.add(new JLabel("Board Tags"), BorderLayout.NORTH); + boardTagsPanel.add(new JScrollPane(listBoardTags), BorderLayout.CENTER); + filterPanel.add(boardTagsPanel); + + List paths = bc.getBoardPaths().values().stream().toList(); + paths = paths.stream().map(p -> p.substring(0, p.lastIndexOf("\\") + 1 )).distinct().sorted().toList(); + DefaultListModel pathsModel = new DefaultListModel<>(); + pathsModel.addAll(paths); + listBoardPaths = new JList<>(pathsModel); + listBoardPaths.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + listBoardPaths.setSelectedIndex(0); + listBoardPaths.addListSelectionListener (new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + filterTables(); + } + }); + JPanel boardPathsPanel = new JPanel(new BorderLayout()); + boardPathsPanel.add(new JLabel("Board Paths"), BorderLayout.NORTH); + boardPathsPanel.add(new JScrollPane(listBoardPaths), BorderLayout.CENTER); + filterPanel.add(boardPathsPanel); + + return filterPanel; + } + + private JPanel createList() { + JPanel listPanel = new JPanel(new FlowLayout()); + boardModel = new BoardTableModel(); + boardModel.setData(bc.getBoardPaths().values().stream().toList()); + boardTable = new JTable(); + boardTable.setName("RAT"); + ListSelectionModel boardSelModel = boardTable.getSelectionModel(); + boardSelModel.addListSelectionListener (new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + int index = boardTable.getSelectedRow() ; + if (index >= 0) { + index = boardTable.convertRowIndexToModel(index); + boardImage.setIcon(boardModel.getIconAt(index, 200)); + boardInfo.setText(boardModel.getInfoAt(index)); + } + } + }); + boardTable.setModel(boardModel); + boardSorter = new TableRowSorter<>(boardModel); + boardTable.setRowSorter(boardSorter); + boardTable.setIntercellSpacing(new Dimension(5, 0)); + boardTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + for (int i = 0; i < boardModel.getColumnCount(); i++) { + boardTable.getColumnModel().getColumn(i).setPreferredWidth(boardModel.getPreferredWidth(i)); + } + DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); + rightRenderer.setHorizontalAlignment(JLabel.RIGHT); + + listPanel.add(new JScrollPane(boardTable)); + + boardTable.setRowSelectionInterval(0,0); + + return listPanel; + } + + void filterTables() { + RowFilter boardFilter; + try { + boardFilter = new RowFilter<>() { + @Override + public boolean include(Entry entry) { + BoardTableModel eqModel = entry.getModel(); + + String path = eqModel.getPathAt(entry.getIdentifier()); + boolean pathMatch = matchPath(path); + + List tags = eqModel.getTagAt(entry.getIdentifier()); + boolean tagMatch = matchTag(tags); + + return pathMatch && tagMatch; + } + }; + } catch (PatternSyntaxException ignored) { + return; + } + + boardSorter.setRowFilter(boardFilter); + } + + boolean matchPath(String path) { + List include = listBoardPaths.getSelectedValuesList(); + + String value = path.substring(0, path.lastIndexOf("\\") + 1 ); + + return !include.isEmpty() && include.stream().anyMatch(value::contains); + } + + boolean matchTag(List tags) { + List include = listBoardTags.getSelectedValuesList(); + + return !include.isEmpty() && include.stream().anyMatch(tags::contains); + } + + public String getPath() { + int index = boardTable.getSelectedRow() ; + if (index >= 0) { + index = boardTable.convertRowIndexToModel(index); + String path = boardModel.getPathAt(index); + return path; + } + + return null; + } +} diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java new file mode 100644 index 00000000000..554aac5bb98 --- /dev/null +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.client.ui.advancedSearchMap; + +import megamek.client.ui.swing.minimap.Minimap; +import megamek.client.ui.swing.util.UIUtil; +import megamek.common.*; +import megamek.common.util.ImageUtil; +import megamek.common.util.fileUtils.MegaMekFile; + +import javax.swing.*; +import javax.swing.table.AbstractTableModel; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * A table model for the advanced search weapon tab's equipment list + */ +class BoardTableModel extends AbstractTableModel { + private static final int COL_NAME = 0; + private static final int COL_SIZE = 1; + private static final int N_COL = 2; + + private List data; + private List tags; + private List size; + + public BoardTableModel() { + data = new ArrayList<>(); + } + + @Override + public int getRowCount() { + return data.size(); + } + + public void clearData() { + data = new ArrayList<>(); + tags = new ArrayList<>(); + size = new ArrayList<>(); + fireTableDataChanged(); + } + + @Override + public int getColumnCount() { + return N_COL; + } + + public int getPreferredWidth(int col) { + return switch (col) { + case COL_NAME -> 200; + case COL_SIZE -> 20; + default -> 10; + }; + } + + public void setData(List paths) { + data = paths; + tags = new ArrayList<>(); + size = new ArrayList<>(); + + for (String path : paths) { + Board board = new Board(16, 17); + board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); + + tags.add(board.getTags().toString()); + size.add(board.getWidth() + "x" + board.getHeight()); + } + + fireTableDataChanged(); + } + + @Override + public String getColumnName(int column) { + switch (column) { + case COL_NAME: + return "Name"; + case COL_SIZE: + return "Size"; + default: + return "??"; + } + } + + @Override + public Class getColumnClass(int c) { + return getValueAt(0, c).getClass(); + } + + @Override + public boolean isCellEditable(int row, int col) { + return false; + } + + @Override + public Object getValueAt(int row, int col) { + String path = getPathAt(row); + + if (path== null) { + return "?"; + } + + String value = ""; + + if (col == COL_NAME) { + value = path.substring(path.lastIndexOf("\\") + 1, path.length()); + value = value.substring(0, value.lastIndexOf(".board")); + } else if (col == COL_SIZE) { + value = getSizeAt(row); + } + + return value; + } + + public String getPathAt(int row) { + if (data.size() <= row) { + return null; + } + + return data.get(row); + } + + public String getSizeAt(int row) { + if (size.size() <= row) { + return null; + } + + return size.get(row); + } + + public List getAllPaths() { + return data; + } + + public ImageIcon getIconAt(int row, int height) { + String path = getPathAt(row); + Board board = new Board(16, 17); + board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); + + BufferedImage image = Minimap.getMinimapImageMaxZoom(board); + + int scaledHeight = Math.min(image.getHeight(), height); + int scaledWidth = Math.max(1, image.getWidth() * scaledHeight / image.getHeight()); + + image = ImageUtil.getScaledImage(image, scaledWidth, scaledHeight); + ImageIcon icon = new ImageIcon(image); + return icon; + } + + public String getInfoAt(int row) { + String path = getPathAt(row); + Board board = new Board(16, 17); + board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); + + String info; + String col = UIUtil.tag("td", "", path); + info = UIUtil.tag("tr", "", col); + col = UIUtil.tag("td", "", board.getWidth() + "x" + board.getHeight()); + info += UIUtil.tag("tr", "", col); + col = UIUtil.tag("td", "", board.getTags().toString()); + info += UIUtil.tag("tr", "", col); + info = UIUtil.tag("table", "", info); + String attr = String.format("WIDTH=%s", UIUtil.scaleForGUI(500)); + info = UIUtil.tag("div", attr, info); + info = UIUtil.tag("body", "", info); + info = UIUtil.tag("html", "", info); + + return info; + } + + public List getTagAt(int row) { + String tag = tags.get(row); + tag = tag.substring(1, tag.length() -1); + return Arrays.stream(tag.split(", ")).toList(); + } +} diff --git a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java index 2066ee4cd5b..2f98c2b0fe9 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java +++ b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java @@ -80,6 +80,7 @@ import megamek.client.generator.RandomCallsignGenerator; import megamek.client.generator.RandomNameGenerator; import megamek.client.ui.Messages; +import megamek.client.ui.advancedSearchMap.AdvancedSearchMapDialog; import megamek.client.ui.dialogs.BotConfigDialog; import megamek.client.ui.dialogs.CamoChooserDialog; import megamek.client.ui.enums.DialogResult; @@ -213,6 +214,7 @@ public class ChatLounge extends AbstractPhaseDisplay implements private JLabel lblBoardSize = new JLabel(Messages.getString("ChatLounge.labBoardSize")); private JButton butHelp = new JButton(" " + Messages.getString("ChatLounge.butHelp") + " "); + private JButton butAdvancedSearchMap = new JButton("Advanced Search"); private JButton butConditions = new JButton(Messages.getString("ChatLounge.butConditions")); private JButton butRandomMap = new JButton(Messages.getString("BoardSelectionDialog.GeneratedMapSettings")); @@ -384,6 +386,7 @@ private void setupListeners() { butDetach.addActionListener(lobbyListener); butCancelSearch.addActionListener(lobbyListener); butHelp.addActionListener(lobbyListener); + butAdvancedSearchMap.addActionListener(lobbyListener); butListView.addActionListener(lobbyListener); butForceView.addActionListener(lobbyListener); butCollapse.addActionListener(lobbyListener); @@ -679,6 +682,7 @@ private void setupMapPanel() { JPanel panHelp = new JPanel(new GridLayout(1, 1)); panHelp.add(butHelp); + panHelp.add(butAdvancedSearchMap); FixedYPanel panTopRowsHelp = new FixedYPanel(new FlowLayout(FlowLayout.CENTER, 30, 5)); panTopRowsHelp.add(panTopRows); @@ -1896,6 +1900,35 @@ public void actionPerformed(ActionEvent ev) { dialog.setPreferredSize(sz); dialog.setVisible(true); + } else if (ev.getSource() == butAdvancedSearchMap) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + AdvancedSearchMapDialog asmd = new AdvancedSearchMapDialog(clientgui.getFrame()); + setCursor(Cursor.getDefaultCursor()); + + if (asmd.showDialog().isConfirmed()) { + String path = asmd.getPath(); + if (path != null) { + Board board = new Board(16, 17); + board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); + String boardName = path.replace(".board", ""); + boardName = boardName.replace("\\", "/"); + mapSettings.getBoardsSelectedVector().clear(); + mapSettings.setMapSize(1, 1); + mapSettings.setBoardSize(board.getWidth(), board.getHeight()); + clientgui.getClient().sendMapDimensions(mapSettings); + mapSettings.getBoardsSelectedVector().set(0, boardName); + refreshMapUI(); + clientgui.getClient().sendMapSettings(mapSettings); + + if (boardPreviewW.isVisible()) { + previewGameBoard(); + } + + String msg = clientgui.getClient().getLocalPlayer() + " changed map to: " + boardName; + clientgui.getClient().sendServerChat(Player.PLAYER_NONE, msg); + } + } + } else if (ev.getSource() == butListView) { scrMekTable.setViewportView(mekTable); butCollapse.setEnabled(false); From e6727067bc7423777ee83af8ef6c1daa77ce191d Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sat, 9 Nov 2024 23:40:22 -0500 Subject: [PATCH 10/57] remove size from name in list --- .../AdvancedSearchMapDialog.java | 93 +++++++++---------- .../ui/advancedSearchMap/BoardTableModel.java | 7 ++ 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index 25c013d111c..a6252e2ce54 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -18,20 +18,11 @@ */ package megamek.client.ui.advancedSearchMap; -import megamek.client.ui.Messages; import megamek.client.ui.baseComponents.AbstractButtonDialog; -import megamek.client.ui.swing.ButtonEsc; -import megamek.client.ui.swing.CloseAction; -import megamek.client.ui.swing.dialog.DialogButton; -import megamek.common.Board; -import megamek.common.Configuration; -import megamek.common.util.fileUtils.MegaMekFile; import megamek.utilities.BoardClassifier; import megamek.utilities.BoardsTagger; import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.border.MatteBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; @@ -45,61 +36,51 @@ * This is the dialog for advanced map filtering */ public class AdvancedSearchMapDialog extends AbstractButtonDialog { - - BoardClassifier bc; - JTable boardTable; - JList listBoardTags; - JList listBoardPaths; - JLabel boardImage; - JLabel boardInfo; - TableRowSorter boardSorter; - + private BoardClassifier bc; + private JTable boardTable; + private JList listBoardTags; + private JList listBoardPaths; + private JLabel boardImage; + private JLabel boardInfo; + private TableRowSorter boardSorter; private BoardTableModel boardModel; + private JLabel boardCountLabel; + public AdvancedSearchMapDialog(JFrame parent) { super(parent, true, "AdvancedSearchMapDialog", "AdvancedSearchMapDialog.title"); - initialize(); - } - + setPreferredSize(new Dimension(1200, 1600)); - @Override - protected JPanel createButtonPanel() { - JButton cancelButton = new ButtonEsc(new CloseAction(this)); - JButton okButton = new DialogButton(Messages.getString("Ok.text")); - okButton.addActionListener(this::okButtonActionPerformed); - getRootPane().setDefaultButton(okButton); - - JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 20, 0)); - buttonPanel.add(okButton); - buttonPanel.add(cancelButton); - - JPanel outerPanel = new JPanel(new GridLayout(1,1)); - outerPanel.setBorder(BorderFactory.createCompoundBorder( - new MatteBorder(1, 0, 0, 0, UIManager.getColor("Separator.foreground")), - new EmptyBorder(10, 0, 10, 0))); - outerPanel.add(buttonPanel); - - return outerPanel; + initialize(); } @Override protected Container createCenterPane() { bc = BoardClassifier.getInstance(); - JPanel advancedSearchPane = new JPanel(); + JPanel advancedSearchPane = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 0; + c.weighty = 0; + c.fill = GridBagConstraints.BOTH; + c.anchor = GridBagConstraints.NORTHWEST; + c.insets = new Insets(2, 2, 2, 2); - advancedSearchPane.setLayout(new BoxLayout(advancedSearchPane, BoxLayout.PAGE_AXIS)); + c.gridx = 0; + c.gridy = 0; - advancedSearchPane.add(createInfo()); + advancedSearchPane.add(createInfo(), c); JPanel mainPanel = new JPanel(new FlowLayout()); mainPanel.add(createFilter()); mainPanel.add(createList()); - advancedSearchPane.add(mainPanel); + c.gridy++; + advancedSearchPane.add(mainPanel, c); return advancedSearchPane; - } private JPanel createInfo() { @@ -154,11 +135,12 @@ public void valueChanged(ListSelectionEvent e) { } private JPanel createList() { - JPanel listPanel = new JPanel(new FlowLayout()); + JPanel listPanel = new JPanel(); + listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.PAGE_AXIS)); boardModel = new BoardTableModel(); boardModel.setData(bc.getBoardPaths().values().stream().toList()); boardTable = new JTable(); - boardTable.setName("RAT"); + boardTable.setName("Board"); ListSelectionModel boardSelModel = boardTable.getSelectionModel(); boardSelModel.addListSelectionListener (new ListSelectionListener() { @Override @@ -184,12 +166,19 @@ public void valueChanged(ListSelectionEvent e) { listPanel.add(new JScrollPane(boardTable)); + JPanel countPanel = new JPanel(new FlowLayout()); + JLabel countLabel = new JLabel("Count: "); + countPanel.add(countLabel); + boardCountLabel = new JLabel(boardTable.getRowCount() + ""); + countPanel.add(boardCountLabel); + listPanel.add(countPanel); + boardTable.setRowSelectionInterval(0,0); return listPanel; } - void filterTables() { + private void filterTables() { RowFilter boardFilter; try { boardFilter = new RowFilter<>() { @@ -211,9 +200,15 @@ public boolean include(Entry entry } boardSorter.setRowFilter(boardFilter); + boardCountLabel.setText(boardTable.getRowCount() + ""); + + if (boardTable.getRowCount() > 0) { + boardTable.setRowSelectionInterval(0, 0); + boardTable.scrollRectToVisible(boardTable.getCellRect(0, 0, true)); + } } - boolean matchPath(String path) { + private boolean matchPath(String path) { List include = listBoardPaths.getSelectedValuesList(); String value = path.substring(0, path.lastIndexOf("\\") + 1 ); @@ -221,7 +216,7 @@ boolean matchPath(String path) { return !include.isEmpty() && include.stream().anyMatch(value::contains); } - boolean matchTag(List tags) { + private boolean matchTag(List tags) { List include = listBoardTags.getSelectedValuesList(); return !include.isEmpty() && include.stream().anyMatch(tags::contains); diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 554aac5bb98..d80a49ff36d 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -113,6 +113,7 @@ public boolean isCellEditable(int row, int col) { @Override public Object getValueAt(int row, int col) { String path = getPathAt(row); + String size = getSizeAt(row); if (path== null) { return "?"; @@ -123,6 +124,12 @@ public Object getValueAt(int row, int col) { if (col == COL_NAME) { value = path.substring(path.lastIndexOf("\\") + 1, path.length()); value = value.substring(0, value.lastIndexOf(".board")); + value = value.replace(size, "").trim(); + if ((!value.isEmpty()) + && (value.charAt(0) == '-')) { + value = value.substring(1, value.length()).trim(); + } + } else if (col == COL_SIZE) { value = getSizeAt(row); } From c298db5fe5dac5965b6007f832b246a3dd8f3d25 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 00:27:27 -0500 Subject: [PATCH 11/57] disable when using space map --- .../megamek/client/ui/advancedSearchMap/BoardTableModel.java | 3 +-- megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index d80a49ff36d..6fae1a88064 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -125,11 +125,10 @@ public Object getValueAt(int row, int col) { value = path.substring(path.lastIndexOf("\\") + 1, path.length()); value = value.substring(0, value.lastIndexOf(".board")); value = value.replace(size, "").trim(); - if ((!value.isEmpty()) + if ((!value.isEmpty()) && (value.charAt(0) == '-')) { value = value.substring(1, value.length()).trim(); } - } else if (col == COL_SIZE) { value = getSizeAt(row); } diff --git a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java index 2f98c2b0fe9..187c66fa8fd 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java +++ b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java @@ -975,6 +975,7 @@ private void refreshMapUI() { butLoadMapSetup.setEnabled(!inSpace); butMapShrinkW.setEnabled(mapSettings.getMapWidth() > 1); butMapShrinkH.setEnabled(mapSettings.getMapHeight() > 1); + butAdvancedSearchMap.setEnabled(!inSpace); butGroundMap.removeActionListener(lobbyListener); butLowAtmoMap.removeActionListener(lobbyListener); From caf47fb4488044017ee42c1d3bf064fec98713b3 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 08:05:13 -0500 Subject: [PATCH 12/57] disable when map page size is not 1x1 --- .../ui/advancedSearchMap/AdvancedSearchMapDialog.java | 1 + .../client/ui/advancedSearchMap/BoardTableModel.java | 6 +----- megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index a6252e2ce54..91bf98cb760 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -155,6 +155,7 @@ public void valueChanged(ListSelectionEvent e) { }); boardTable.setModel(boardModel); boardSorter = new TableRowSorter<>(boardModel); + boardSorter.setSortKeys(List.of(new RowSorter.SortKey(0, SortOrder.ASCENDING))); boardTable.setRowSorter(boardSorter); boardTable.setIntercellSpacing(new Dimension(5, 0)); boardTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 6fae1a88064..05b27cdb2ee 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -125,12 +125,8 @@ public Object getValueAt(int row, int col) { value = path.substring(path.lastIndexOf("\\") + 1, path.length()); value = value.substring(0, value.lastIndexOf(".board")); value = value.replace(size, "").trim(); - if ((!value.isEmpty()) - && (value.charAt(0) == '-')) { - value = value.substring(1, value.length()).trim(); - } } else if (col == COL_SIZE) { - value = getSizeAt(row); + value = size; } return value; diff --git a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java index 187c66fa8fd..c88fb580ad1 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java +++ b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java @@ -975,7 +975,7 @@ private void refreshMapUI() { butLoadMapSetup.setEnabled(!inSpace); butMapShrinkW.setEnabled(mapSettings.getMapWidth() > 1); butMapShrinkH.setEnabled(mapSettings.getMapHeight() > 1); - butAdvancedSearchMap.setEnabled(!inSpace); + butAdvancedSearchMap.setEnabled(!inSpace && (mapSettings.getMapWidth() == 1) && (mapSettings.getMapHeight() == 1)); butGroundMap.removeActionListener(lobbyListener); butLowAtmoMap.removeActionListener(lobbyListener); From 20d529631758d330c92bbb15bb02b15562612d55 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 08:42:37 -0500 Subject: [PATCH 13/57] cache tags and size to speed up reload --- .../AdvancedSearchMapDialog.java | 4 ++-- .../ui/advancedSearchMap/BoardTableModel.java | 15 +++++++-------- .../src/megamek/utilities/BoardClassifier.java | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index 91bf98cb760..a160e3cabce 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -96,7 +96,7 @@ private JPanel createFilter() { JPanel filterPanel = new JPanel(); filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.PAGE_AXIS)); - List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().toList(); + List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); DefaultListModel tagsModel = new DefaultListModel<>(); tagsModel.addAll(tags); listBoardTags = new JList<>(tagsModel); @@ -138,7 +138,7 @@ private JPanel createList() { JPanel listPanel = new JPanel(); listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.PAGE_AXIS)); boardModel = new BoardTableModel(); - boardModel.setData(bc.getBoardPaths().values().stream().toList()); + boardModel.setData(bc); boardTable = new JTable(); boardTable.setName("Board"); ListSelectionModel boardSelModel = boardTable.getSelectionModel(); diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 05b27cdb2ee..245aeaf9148 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -23,6 +23,7 @@ import megamek.common.*; import megamek.common.util.ImageUtil; import megamek.common.util.fileUtils.MegaMekFile; +import megamek.utilities.BoardClassifier; import javax.swing.*; import javax.swing.table.AbstractTableModel; @@ -72,17 +73,15 @@ public int getPreferredWidth(int col) { }; } - public void setData(List paths) { - data = paths; + public void setData(BoardClassifier bc) { + data = bc.getBoardPaths().values().stream().toList();; tags = new ArrayList<>(); size = new ArrayList<>(); - for (String path : paths) { - Board board = new Board(16, 17); - board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); - - tags.add(board.getTags().toString()); - size.add(board.getWidth() + "x" + board.getHeight()); + for (String path : data) { + String key = Configuration.boardsDir() + path; + tags.add(bc.getBoardTags().get(key)); + size.add(bc.getBoardWidth().get(key) + "x" + bc.getBoardHeigth().get(key)); } fireTableDataChanged(); diff --git a/megamek/src/megamek/utilities/BoardClassifier.java b/megamek/src/megamek/utilities/BoardClassifier.java index 1cdfadb0b54..5dbc97bb06a 100644 --- a/megamek/src/megamek/utilities/BoardClassifier.java +++ b/megamek/src/megamek/utilities/BoardClassifier.java @@ -50,6 +50,9 @@ public class BoardClassifier { // function that maps full board paths to partial board paths private Map boardPaths = new HashMap<>(); + private Map boardTags = new HashMap<>(); + private Map boardWidth = new HashMap<>(); + private Map boardHeight = new HashMap<>(); public Map> getBoardsByTag() { return boardsByTag; @@ -79,6 +82,18 @@ public Map getBoardPaths() { return boardPaths; } + public Map getBoardTags() { + return boardTags; + } + + public Map getBoardWidth() { + return boardWidth; + } + + public Map getBoardHeigth() { + return boardHeight; + } + public void setBoardPaths(Map boardPaths) { this.boardPaths = boardPaths; } @@ -146,6 +161,9 @@ private void scanForBoardsInDir(final File boardDir, final String basePath) { } getBoardPaths().put(filePath.getPath(), partialBoardPath); + getBoardTags().put(filePath.getPath(), Board.getTags(filePath).toString()); + getBoardWidth().put(filePath.getPath(), dimension.width()); + getBoardHeigth().put(filePath.getPath(), dimension.height()); } } } From 71c8c6587ecb401b6727b5227bacb01cf3d6fbfb Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 08:56:51 -0500 Subject: [PATCH 14/57] code cleanup --- .../AdvancedSearchMapDialog.java | 15 +++++++++++--- .../ui/advancedSearchMap/BoardTableModel.java | 2 +- .../megamek/utilities/BoardClassifier.java | 20 +++++++++---------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index a160e3cabce..a699160b7e4 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -96,6 +96,13 @@ private JPanel createFilter() { JPanel filterPanel = new JPanel(); filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.PAGE_AXIS)); + filterPanel.add(createFilterTags()); + filterPanel.add(createFilterPaths()); + + return filterPanel; + } + + private JPanel createFilterTags() { List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); DefaultListModel tagsModel = new DefaultListModel<>(); tagsModel.addAll(tags); @@ -111,8 +118,11 @@ public void valueChanged(ListSelectionEvent e) { JPanel boardTagsPanel = new JPanel(new BorderLayout()); boardTagsPanel.add(new JLabel("Board Tags"), BorderLayout.NORTH); boardTagsPanel.add(new JScrollPane(listBoardTags), BorderLayout.CENTER); - filterPanel.add(boardTagsPanel); + return boardTagsPanel; + } + + private JPanel createFilterPaths() { List paths = bc.getBoardPaths().values().stream().toList(); paths = paths.stream().map(p -> p.substring(0, p.lastIndexOf("\\") + 1 )).distinct().sorted().toList(); DefaultListModel pathsModel = new DefaultListModel<>(); @@ -129,9 +139,8 @@ public void valueChanged(ListSelectionEvent e) { JPanel boardPathsPanel = new JPanel(new BorderLayout()); boardPathsPanel.add(new JLabel("Board Paths"), BorderLayout.NORTH); boardPathsPanel.add(new JScrollPane(listBoardPaths), BorderLayout.CENTER); - filterPanel.add(boardPathsPanel); - return filterPanel; + return boardPathsPanel; } private JPanel createList() { diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 245aeaf9148..8c347440055 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -33,7 +33,7 @@ import java.util.List; /** - * A table model for the advanced search weapon tab's equipment list + * A table model for the advanced map search */ class BoardTableModel extends AbstractTableModel { private static final int COL_NAME = 0; diff --git a/megamek/src/megamek/utilities/BoardClassifier.java b/megamek/src/megamek/utilities/BoardClassifier.java index 5dbc97bb06a..3e609e7cb83 100644 --- a/megamek/src/megamek/utilities/BoardClassifier.java +++ b/megamek/src/megamek/utilities/BoardClassifier.java @@ -152,18 +152,18 @@ private void scanForBoardsInDir(final File boardDir, final String basePath) { getBoardsByHeight().get(dimension.height()).add(filePath.getPath()); getBoardsByWidth().get(dimension.width()).add(filePath.getPath()); - } - for (String tagString : Board.getTags(filePath)) { - Tags tag = Tags.parse(tagString); - getBoardsByTag().putIfAbsent(tag, new ArrayList<>()); - getBoardsByTag().get(tag).add(filePath.getPath()); - } + for (String tagString : Board.getTags(filePath)) { + Tags tag = Tags.parse(tagString); + getBoardsByTag().putIfAbsent(tag, new ArrayList<>()); + getBoardsByTag().get(tag).add(filePath.getPath()); + } - getBoardPaths().put(filePath.getPath(), partialBoardPath); - getBoardTags().put(filePath.getPath(), Board.getTags(filePath).toString()); - getBoardWidth().put(filePath.getPath(), dimension.width()); - getBoardHeigth().put(filePath.getPath(), dimension.height()); + getBoardPaths().put(filePath.getPath(), partialBoardPath); + getBoardTags().put(filePath.getPath(), Board.getTags(filePath).toString()); + getBoardWidth().put(filePath.getPath(), dimension.width()); + getBoardHeigth().put(filePath.getPath(), dimension.height()); + } } } } From 9eedda58f39aa813e3223ae2097f75b112d03df6 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 09:43:12 -0500 Subject: [PATCH 15/57] add toggle between any and all on tag filter --- .../AdvancedSearchMapDialog.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index a699160b7e4..2cc75d77303 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -28,6 +28,7 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableRowSorter; import java.awt.*; +import java.awt.event.ActionEvent; import java.util.Arrays; import java.util.List; import java.util.regex.PatternSyntaxException; @@ -39,6 +40,7 @@ public class AdvancedSearchMapDialog extends AbstractButtonDialog { private BoardClassifier bc; private JTable boardTable; private JList listBoardTags; + private final JCheckBox boardTagsAllCheckBox = new JCheckBox("All"); private JList listBoardPaths; private JLabel boardImage; private JLabel boardInfo; @@ -116,7 +118,19 @@ public void valueChanged(ListSelectionEvent e) { } }); JPanel boardTagsPanel = new JPanel(new BorderLayout()); - boardTagsPanel.add(new JLabel("Board Tags"), BorderLayout.NORTH); + Box titlePanel = new Box(BoxLayout.LINE_AXIS); + titlePanel.setAlignmentX(Component.LEFT_ALIGNMENT); + titlePanel.add(new JLabel("Board Tags")); + titlePanel.add(Box.createRigidArea( new Dimension(5, 0))); + boardTagsAllCheckBox.setSelected(false); + boardTagsAllCheckBox.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + filterTables(); + } + }); + titlePanel.add(boardTagsAllCheckBox); + boardTagsPanel.add(titlePanel, BorderLayout.NORTH); boardTagsPanel.add(new JScrollPane(listBoardTags), BorderLayout.CENTER); return boardTagsPanel; @@ -229,7 +243,11 @@ private boolean matchPath(String path) { private boolean matchTag(List tags) { List include = listBoardTags.getSelectedValuesList(); - return !include.isEmpty() && include.stream().anyMatch(tags::contains); + if (boardTagsAllCheckBox.isSelected()) { + return !include.isEmpty() && include.stream().allMatch(tags::contains); + } else { + return !include.isEmpty() && include.stream().anyMatch(tags::contains); + } } public String getPath() { From d71ea43bf2dd69c6468a4b28ab47e29f8682c4f0 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 12:05:02 -0500 Subject: [PATCH 16/57] code cleanup --- megamek/src/megamek/utilities/BoardClassifier.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/megamek/src/megamek/utilities/BoardClassifier.java b/megamek/src/megamek/utilities/BoardClassifier.java index 3e609e7cb83..3294afe6814 100644 --- a/megamek/src/megamek/utilities/BoardClassifier.java +++ b/megamek/src/megamek/utilities/BoardClassifier.java @@ -19,11 +19,7 @@ package megamek.utilities; import java.io.File; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import megamek.common.Board; @@ -153,14 +149,16 @@ private void scanForBoardsInDir(final File boardDir, final String basePath) { getBoardsByHeight().get(dimension.height()).add(filePath.getPath()); getBoardsByWidth().get(dimension.width()).add(filePath.getPath()); - for (String tagString : Board.getTags(filePath)) { + Set boardTags = Board.getTags(filePath); + + for (String tagString : boardTags) { Tags tag = Tags.parse(tagString); getBoardsByTag().putIfAbsent(tag, new ArrayList<>()); getBoardsByTag().get(tag).add(filePath.getPath()); } getBoardPaths().put(filePath.getPath(), partialBoardPath); - getBoardTags().put(filePath.getPath(), Board.getTags(filePath).toString()); + getBoardTags().put(filePath.getPath(), boardTags.toString()); getBoardWidth().put(filePath.getPath(), dimension.width()); getBoardHeigth().put(filePath.getPath(), dimension.height()); } From 91a30a4864efd520d1e71a82096b3e4599a257f9 Mon Sep 17 00:00:00 2001 From: Pavel Braginskiy Date: Sun, 10 Nov 2024 10:40:59 -0800 Subject: [PATCH 17/57] Add comments and tooltip --- .../i18n/megamek/client/messages.properties | 2 ++ .../megamek/client/ui/swing/ClientGUI.java | 28 +++++++++++++++++++ .../client/ui/swing/lobby/ChatLounge.java | 1 + 3 files changed, 31 insertions(+) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index c283ac15e35..a76cdb07d0e 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -648,6 +648,8 @@ ChatLounge.butNames=Random Names... ChatLounge.butRemoveBot=Remove Bot ChatLounge.butSaveList=Save Unit List... ChatLounge.butPrintList=Print Unit List... +ChatLounge.butPrintList.tooltip=Print the record sheets for the current player's units.\ +
This requires MegaMekLab to exist on your system. ChatLounge.butPrintList.printing=Loading print dialog ChatLounge.butShrink=< ChatLounge.butSkills=Random Skills... diff --git a/megamek/src/megamek/client/ui/swing/ClientGUI.java b/megamek/src/megamek/client/ui/swing/ClientGUI.java index 3a6d459c4b3..937c6bd9dad 100644 --- a/megamek/src/megamek/client/ui/swing/ClientGUI.java +++ b/megamek/src/megamek/client/ui/swing/ClientGUI.java @@ -2069,11 +2069,22 @@ public void saveListFile(ArrayList unitList, String filename) { } } + /** + * Request MegaMekLab to print out record sheets for the current player's selected units. + * The method will try to find MML either automatically or based on a configured client setting. + * + * @param unitList The list of units to print + * @param button This should always be {@link ChatLounge#butPrintList}, if you need to trigger this method from somewhere else, override it. + */ public void printList(ArrayList unitList, JButton button) { + // Do nothing if there are no units to print if ((unitList == null) || unitList.isEmpty()) { return; } + // Detect the MML executable. + // If the user hasn't set this manually, try to pick "MegaMakLab.exe"/".sh" + // from the same directory that MM is in var mmlPath = CP.getMmlPath(); var autodetect = false; if (null == mmlPath || mmlPath.isBlank()) { @@ -2097,28 +2108,42 @@ public void printList(ArrayList unitList, JButton button) { } try { + // Save unit list to a temporary file var unitFile = File.createTempFile("MegaMekPrint", ".mul"); EntityListFile.saveTo(unitFile, unitList); + String[] command; if (mml.getName().toLowerCase().contains("gradle")) { + // If the executable is `gradlew`/`gradelw.bat`, assume it's the gradle wrapper + // which comes in the MML git repo. Compile and run MML from source in order to print units. command = new String[] { mml.getAbsolutePath(), "run", "--args=%s --no-startup".formatted(unitFile.getAbsolutePath()) }; } else { + // Start mml normally. "--no-startup" tells MML to exit after the user closes the + // print dialog (by printing or cancelling) command = new String[] { mml.getAbsolutePath(), unitFile.getAbsolutePath(), "--no-startup" }; } + // It takes a while for MML to start, so we change the text of the button + // to let the user know that something is happening button.setText(Messages.getString("ChatLounge.butPrintList.printing")); + logger.info("Running command: {}", String.join(" ", command)); + + var p = new ProcessBuilder(command) .directory(mml.getAbsoluteFile().getParentFile()) .inheritIO() .start(); + + // This thread's only purpose is to wait for the MML process to finish and change the button's text back to + // its original value. new Thread(() -> { try { p.waitFor(); @@ -2130,7 +2155,10 @@ public void printList(ArrayList unitList, JButton button) { }).start(); } catch (Exception e) { + // If something goes wrong, probably ProcessBuild.start if anything, + // Make sure to set the button text back to what it started as no matter what. logger.error(e, "Operation failed", "Error printing unit list"); + button.setText(Messages.getString("ChatLounge.butPrintList")); } } diff --git a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java index 40285e77c44..708c3f0d300 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java +++ b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java @@ -551,6 +551,7 @@ private void setupUnitConfig() { butSaveList.setEnabled(false); butPrintList.setActionCommand(CL_ACTIONCOMMAND_PRINTLIST); butPrintList.setEnabled(false); + butPrintList.setToolTipText(Messages.getString("ChatLounge.butPrintList.tooltip")); butAdd.setEnabled(mscLoaded); butAdd.setActionCommand(CL_ACTIONCOMMAND_LOADMEK); butArmy.setEnabled(mscLoaded); From 8e2385df6f83199aaac0dd2a585f629aeeb9060a Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 14:31:54 -0500 Subject: [PATCH 18/57] add width, height, and name filters --- .../AdvancedSearchMapDialog.java | 153 ++++++++++++++++-- .../ui/advancedSearchMap/BoardTableModel.java | 25 +++ .../ui/advancedsearch/MekSearchFilter.java | 97 +++++------ .../src/megamek/common/util/StringUtil.java | 18 ++- .../megamek/utilities/BoardClassifier.java | 6 +- 5 files changed, 224 insertions(+), 75 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index 2cc75d77303..fcf2bc1ecef 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -19,10 +19,13 @@ package megamek.client.ui.advancedSearchMap; import megamek.client.ui.baseComponents.AbstractButtonDialog; +import megamek.common.util.StringUtil; import megamek.utilities.BoardClassifier; import megamek.utilities.BoardsTagger; import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; @@ -47,6 +50,11 @@ public class AdvancedSearchMapDialog extends AbstractButtonDialog { private TableRowSorter boardSorter; private BoardTableModel boardModel; private JLabel boardCountLabel; + private JTextField widthStartTextField = new JTextField(4); + private JTextField widthEndTextField = new JTextField(4); + private JTextField heightStartTextField = new JTextField(4); + private JTextField heightEndTextField = new JTextField(4); + private JTextField nameTextField = new JTextField(4); public AdvancedSearchMapDialog(JFrame parent) { super(parent, true, "AdvancedSearchMapDialog", "AdvancedSearchMapDialog.title"); @@ -98,25 +106,99 @@ private JPanel createFilter() { JPanel filterPanel = new JPanel(); filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.PAGE_AXIS)); + filterPanel.add(createFilterRange(widthStartTextField, widthEndTextField, "Width:")); + filterPanel.add(createFilterRange(heightStartTextField, heightEndTextField, "Height:")); + filterPanel.add(createFilterText(nameTextField, "Name:")); filterPanel.add(createFilterTags()); filterPanel.add(createFilterPaths()); return filterPanel; } - private JPanel createFilterTags() { - List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); - DefaultListModel tagsModel = new DefaultListModel<>(); - tagsModel.addAll(tags); - listBoardTags = new JList<>(tagsModel); - listBoardTags.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - listBoardTags.addSelectionInterval(0, tags.size()); - listBoardTags.addListSelectionListener (new ListSelectionListener() { + private JPanel createFilterText(JTextField textField, String caption) { + JPanel textPanel = new JPanel(new BorderLayout()); + Box textBox = new Box(BoxLayout.LINE_AXIS); + textBox.setAlignmentX(Component.LEFT_ALIGNMENT); + + textBox.add(new JLabel(caption)); + textBox.add(Box.createRigidArea( new Dimension(5, 0))); + textField.getDocument().addDocumentListener(new DocumentListener() { @Override - public void valueChanged(ListSelectionEvent e) { + public void insertUpdate(DocumentEvent e) { + filterTables(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + filterTables(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + filterTables(); + } + }); + textBox.add(textField); + + textPanel.add(textBox); + + return textPanel; + } + + private JPanel createFilterRange(JTextField startTextField, JTextField endTextField, String caption) { + JPanel textPanel = new JPanel(new BorderLayout()); + + Box textBox = new Box(BoxLayout.LINE_AXIS); + textBox.setAlignmentX(Component.LEFT_ALIGNMENT); + + textBox.add(new JLabel(caption)); + textBox.add(Box.createRigidArea( new Dimension(5, 0))); + startTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + filterTables(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + filterTables(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + filterTables(); + } + }); + textBox.add(startTextField); + + textBox.add(new JLabel(" - ")); + endTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + filterTables(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + filterTables(); + } + + @Override + public void changedUpdate(DocumentEvent e) { filterTables(); } }); + textBox.add(endTextField); + + textPanel.add(textBox, BorderLayout.NORTH); + return textPanel; + } + + private JPanel createFilterTags() { + List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); + DefaultListModel tagsModel = new DefaultListModel<>(); + tagsModel.addAll(tags); + JPanel boardTagsPanel = new JPanel(new BorderLayout()); Box titlePanel = new Box(BoxLayout.LINE_AXIS); titlePanel.setAlignmentX(Component.LEFT_ALIGNMENT); @@ -130,7 +212,18 @@ public void actionPerformed(ActionEvent e) { } }); titlePanel.add(boardTagsAllCheckBox); + + listBoardTags = new JList<>(tagsModel); + listBoardTags.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + listBoardTags.addSelectionInterval(0, tags.size()); + listBoardTags.addListSelectionListener (new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + filterTables(); + } + }); boardTagsPanel.add(titlePanel, BorderLayout.NORTH); + boardTagsPanel.add(new JScrollPane(listBoardTags), BorderLayout.CENTER); return boardTagsPanel; @@ -158,11 +251,29 @@ public void valueChanged(ListSelectionEvent e) { } private JPanel createList() { - JPanel listPanel = new JPanel(); - listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.PAGE_AXIS)); + JPanel listPanel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 0; + c.weighty = 0; + c.fill = GridBagConstraints.BOTH; + c.anchor = GridBagConstraints.NORTHWEST; + c.insets = new Insets(2, 2, 2, 2); + + c.gridx = 0; + c.gridy = 0; + boardModel = new BoardTableModel(); boardModel.setData(bc); - boardTable = new JTable(); + boardTable = new JTable() { + @Override + public Dimension getPreferredScrollableViewportSize() { + Dimension standardSize = super.getPreferredScrollableViewportSize(); + return new Dimension(standardSize.width, getRowHeight() * 20); + } + }; + boardTable.setName("Board"); ListSelectionModel boardSelModel = boardTable.getSelectionModel(); boardSelModel.addListSelectionListener (new ListSelectionListener() { @@ -185,19 +296,21 @@ public void valueChanged(ListSelectionEvent e) { for (int i = 0; i < boardModel.getColumnCount(); i++) { boardTable.getColumnModel().getColumn(i).setPreferredWidth(boardModel.getPreferredWidth(i)); } + boardTable.setRowSelectionInterval(0,0); DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); rightRenderer.setHorizontalAlignment(JLabel.RIGHT); + boardTable.setFillsViewportHeight(true); + listPanel.add(new JScrollPane(boardTable), c); - listPanel.add(new JScrollPane(boardTable)); + c.gridy++; + c.fill = GridBagConstraints.HORIZONTAL; JPanel countPanel = new JPanel(new FlowLayout()); JLabel countLabel = new JLabel("Count: "); countPanel.add(countLabel); boardCountLabel = new JLabel(boardTable.getRowCount() + ""); countPanel.add(boardCountLabel); - listPanel.add(countPanel); - - boardTable.setRowSelectionInterval(0,0); + listPanel.add(countPanel, c); return listPanel; } @@ -216,7 +329,13 @@ public boolean include(Entry entry List tags = eqModel.getTagAt(entry.getIdentifier()); boolean tagMatch = matchTag(tags); - return pathMatch && tagMatch; + boolean widthMatch = StringUtil.isBetween(eqModel.getWidthAt(entry.getIdentifier()), widthStartTextField.getText(), widthEndTextField.getText()); + + boolean heightMatch = StringUtil.isBetween(eqModel.getHeightAt(entry.getIdentifier()), heightStartTextField.getText(), heightEndTextField.getText()); + + boolean nameMatch = eqModel.getPathAt(entry.getIdentifier()).toUpperCase().contains(nameTextField.getText().toUpperCase()); + + return pathMatch && tagMatch && widthMatch && heightMatch && nameMatch; } }; } catch (PatternSyntaxException ignored) { diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 8c347440055..c6ff31ce7aa 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -43,6 +43,9 @@ class BoardTableModel extends AbstractTableModel { private List data; private List tags; private List size; + private List width; + private List height; + public BoardTableModel() { data = new ArrayList<>(); @@ -57,6 +60,8 @@ public void clearData() { data = new ArrayList<>(); tags = new ArrayList<>(); size = new ArrayList<>(); + width = new ArrayList<>(); + height = new ArrayList<>(); fireTableDataChanged(); } @@ -77,11 +82,15 @@ public void setData(BoardClassifier bc) { data = bc.getBoardPaths().values().stream().toList();; tags = new ArrayList<>(); size = new ArrayList<>(); + width = new ArrayList<>(); + height = new ArrayList<>(); for (String path : data) { String key = Configuration.boardsDir() + path; tags.add(bc.getBoardTags().get(key)); size.add(bc.getBoardWidth().get(key) + "x" + bc.getBoardHeigth().get(key)); + width.add(bc.getBoardWidth().get(key)); + height.add(bc.getBoardHeigth().get(key)); } fireTableDataChanged(); @@ -147,6 +156,22 @@ public String getSizeAt(int row) { return size.get(row); } + public Integer getWidthAt(int row) { + if (width.size() <= row) { + return null; + } + + return width.get(row); + } + + public Integer getHeightAt(int row) { + if (height.size() <= row) { + return null; + } + + return height.get(row); + } + public List getAllPaths() { return data; } diff --git a/megamek/src/megamek/client/ui/advancedsearch/MekSearchFilter.java b/megamek/src/megamek/client/ui/advancedsearch/MekSearchFilter.java index 490fcd74c9c..631dfddc3b8 100644 --- a/megamek/src/megamek/client/ui/advancedsearch/MekSearchFilter.java +++ b/megamek/src/megamek/client/ui/advancedsearch/MekSearchFilter.java @@ -342,17 +342,6 @@ public String getEquipmentExpression() { return equipmentCriteria.toString(); } - private static boolean isBetween(double value, String sStart, String sEnd) { - if (sStart.isEmpty() && sEnd.isEmpty()) { - return true; - } - - int iStart = StringUtil.toInt(sStart, Integer.MIN_VALUE); - int iEnd = StringUtil.toInt(sEnd, Integer.MAX_VALUE); - - return (!(value < iStart)) && (!(value > iEnd)); - } - private static boolean isMatch(int i, boolean b) { if (i == 1) { return b; @@ -493,179 +482,179 @@ public static boolean isMatch(MekSummary mek, MekSearchFilter f) { } // Check walk criteria - if (!isBetween(mek.getWalkMp(), f.sStartWalk, f.sEndWalk)) { + if (!StringUtil.isBetween(mek.getWalkMp(), f.sStartWalk, f.sEndWalk)) { return false; } // Check jump criteria - if (!isBetween(mek.getJumpMp(), f.sStartJump, f.sEndJump)) { + if (!StringUtil.isBetween(mek.getJumpMp(), f.sStartJump, f.sEndJump)) { return false; } // Check year criteria - if (!isBetween(mek.getYear(), f.sStartYear, f.sEndYear)) { + if (!StringUtil.isBetween(mek.getYear(), f.sStartYear, f.sEndYear)) { return false; } // Check Tonnage criteria - if (!isBetween((int) mek.getTons(), f.sStartTons, f.sEndTons)) { + if (!StringUtil.isBetween((int) mek.getTons(), f.sStartTons, f.sEndTons)) { return false; } // Check BV criteria - if (!isBetween(mek.getBV(), f.sStartBV, f.sEndBV)) { + if (!StringUtil.isBetween(mek.getBV(), f.sStartBV, f.sEndBV)) { return false; } - if (!isBetween(mek.getTankTurrets(), f.sStartTankTurrets, f.sEndTankTurrets)) { + if (!StringUtil.isBetween(mek.getTankTurrets(), f.sStartTankTurrets, f.sEndTankTurrets)) { return false; } - if (!isBetween(mek.getLowerArms(), f.sStartLowerArms, f.sEndLowerArms)) { + if (!StringUtil.isBetween(mek.getLowerArms(), f.sStartLowerArms, f.sEndLowerArms)) { return false; } - if (!isBetween(mek.getHands(), f.sStartHands, f.sEndHands)) { + if (!StringUtil.isBetween(mek.getHands(), f.sStartHands, f.sEndHands)) { return false; } - if (!isBetween(mek.getTroopCarryingSpace(), f.sStartTroopSpace, f.sEndTroopSpace)) { + if (!StringUtil.isBetween(mek.getTroopCarryingSpace(), f.sStartTroopSpace, f.sEndTroopSpace)) { return false; } - if (!isBetween(mek.getASFBays(), f.sStartASFBays, f.sEndASFBays)) { + if (!StringUtil.isBetween(mek.getASFBays(), f.sStartASFBays, f.sEndASFBays)) { return false; } - if (!isBetween(mek.getASFDoors(), f.sStartASFDoors, f.sEndASFDoors)) { + if (!StringUtil.isBetween(mek.getASFDoors(), f.sStartASFDoors, f.sEndASFDoors)) { return false; } - if (!isBetween(mek.getASFUnits(), f.sStartASFUnits, f.sEndASFUnits)) { + if (!StringUtil.isBetween(mek.getASFUnits(), f.sStartASFUnits, f.sEndASFUnits)) { return false; } - if (!isBetween(mek.getSmallCraftBays(), f.sStartSmallCraftBays, f.sEndSmallCraftBays)) { + if (!StringUtil.isBetween(mek.getSmallCraftBays(), f.sStartSmallCraftBays, f.sEndSmallCraftBays)) { return false; } - if (!isBetween(mek.getSmallCraftDoors(), f.sStartSmallCraftDoors, f.sEndSmallCraftDoors)) { + if (!StringUtil.isBetween(mek.getSmallCraftDoors(), f.sStartSmallCraftDoors, f.sEndSmallCraftDoors)) { return false; } - if (!isBetween(mek.getSmallCraftUnits(), f.sStartSmallCraftUnits, f.sEndSmallCraftUnits)) { + if (!StringUtil.isBetween(mek.getSmallCraftUnits(), f.sStartSmallCraftUnits, f.sEndSmallCraftUnits)) { return false; } - if (!isBetween(mek.getMekBays(), f.sStartMekBays, f.sEndMekBays)) { + if (!StringUtil.isBetween(mek.getMekBays(), f.sStartMekBays, f.sEndMekBays)) { return false; } - if (!isBetween(mek.getMekDoors(), f.sStartMekDoors, f.sEndMekDoors)) { + if (!StringUtil.isBetween(mek.getMekDoors(), f.sStartMekDoors, f.sEndMekDoors)) { return false; } - if (!isBetween(mek.getMekUnits(), f.sStartMekUnits, f.sEndMekUnits)) { + if (!StringUtil.isBetween(mek.getMekUnits(), f.sStartMekUnits, f.sEndMekUnits)) { return false; } - if (!isBetween(mek.getHeavyVehicleBays(), f.sStartHeavyVehicleBays, f.sEndHeavyVehicleBays)) { + if (!StringUtil.isBetween(mek.getHeavyVehicleBays(), f.sStartHeavyVehicleBays, f.sEndHeavyVehicleBays)) { return false; } - if (!isBetween(mek.getHeavyVehicleDoors(), f.sStartHeavyVehicleDoors, f.sEndHeavyVehicleDoors)) { + if (!StringUtil.isBetween(mek.getHeavyVehicleDoors(), f.sStartHeavyVehicleDoors, f.sEndHeavyVehicleDoors)) { return false; } - if (!isBetween(mek.getHeavyVehicleUnits(), f.sStartHeavyVehicleUnits, f.sEndHeavyVehicleUnits)) { + if (!StringUtil.isBetween(mek.getHeavyVehicleUnits(), f.sStartHeavyVehicleUnits, f.sEndHeavyVehicleUnits)) { return false; } - if (!isBetween(mek.getLightVehicleBays(), f.sStartLightVehicleBays, f.sEndLightVehicleBays)) { + if (!StringUtil.isBetween(mek.getLightVehicleBays(), f.sStartLightVehicleBays, f.sEndLightVehicleBays)) { return false; } - if (!isBetween(mek.getLightVehicleDoors(), f.sStartLightVehicleDoors, f.sEndLightVehicleDoors)) { + if (!StringUtil.isBetween(mek.getLightVehicleDoors(), f.sStartLightVehicleDoors, f.sEndLightVehicleDoors)) { return false; } - if (!isBetween(mek.getLightVehicleUnits(), f.sStartLightVehicleUnits, f.sEndLightVehicleUnits)) { + if (!StringUtil.isBetween(mek.getLightVehicleUnits(), f.sStartLightVehicleUnits, f.sEndLightVehicleUnits)) { return false; } - if (!isBetween(mek.getProtoMekBays(), f.sStartProtomekBays, f.sEndProtomekBays)) { + if (!StringUtil.isBetween(mek.getProtoMekBays(), f.sStartProtomekBays, f.sEndProtomekBays)) { return false; } - if (!isBetween(mek.getProtoMekDoors(), f.sStartProtomekDoors, f.sEndProtomekDoors)) { + if (!StringUtil.isBetween(mek.getProtoMekDoors(), f.sStartProtomekDoors, f.sEndProtomekDoors)) { return false; } - if (!isBetween(mek.getProtoMekUnits(), f.sStartProtomekUnits, f.sEndProtomekUnits)) { + if (!StringUtil.isBetween(mek.getProtoMekUnits(), f.sStartProtomekUnits, f.sEndProtomekUnits)) { return false; } - if (!isBetween(mek.getBattleArmorBays(), f.sStartBattleArmorBays, f.sEndBattleArmorBays)) { + if (!StringUtil.isBetween(mek.getBattleArmorBays(), f.sStartBattleArmorBays, f.sEndBattleArmorBays)) { return false; } - if (!isBetween(mek.getBattleArmorDoors(), f.sStartBattleArmorDoors, f.sEndBattleArmorDoors)) { + if (!StringUtil.isBetween(mek.getBattleArmorDoors(), f.sStartBattleArmorDoors, f.sEndBattleArmorDoors)) { return false; } - if (!isBetween(mek.getBattleArmorUnits(), f.sStartBattleArmorUnits, f.sEndBattleArmorUnits)) { + if (!StringUtil.isBetween(mek.getBattleArmorUnits(), f.sStartBattleArmorUnits, f.sEndBattleArmorUnits)) { return false; } - if (!isBetween(mek.getInfantryBays(), f.sStartInfantryBays, f.sEndInfantryBays)) { + if (!StringUtil.isBetween(mek.getInfantryBays(), f.sStartInfantryBays, f.sEndInfantryBays)) { return false; } - if (!isBetween(mek.getInfantryDoors(), f.sStartInfantryDoors, f.sEndInfantryDoors)) { + if (!StringUtil.isBetween(mek.getInfantryDoors(), f.sStartInfantryDoors, f.sEndInfantryDoors)) { return false; } - if (!isBetween(mek.getInfantryUnits(), f.sStartInfantryUnits, f.sEndInfantryUnits)) { + if (!StringUtil.isBetween(mek.getInfantryUnits(), f.sStartInfantryUnits, f.sEndInfantryUnits)) { return false; } - if (!isBetween(mek.getSuperHeavyVehicleBays(), f.sStartSuperHeavyVehicleBays, f.sEndSuperHeavyVehicleBays)) { + if (!StringUtil.isBetween(mek.getSuperHeavyVehicleBays(), f.sStartSuperHeavyVehicleBays, f.sEndSuperHeavyVehicleBays)) { return false; } - if (!isBetween(mek.getSuperHeavyVehicleDoors(), f.sStartSuperHeavyVehicleDoors, f.sEndSuperHeavyVehicleDoors)) { + if (!StringUtil.isBetween(mek.getSuperHeavyVehicleDoors(), f.sStartSuperHeavyVehicleDoors, f.sEndSuperHeavyVehicleDoors)) { return false; } - if (!isBetween(mek.getSuperHeavyVehicleUnits(), f.sStartSuperHeavyVehicleUnits, f.sEndSuperHeavyVehicleUnits)) { + if (!StringUtil.isBetween(mek.getSuperHeavyVehicleUnits(), f.sStartSuperHeavyVehicleUnits, f.sEndSuperHeavyVehicleUnits)) { return false; } - if (!isBetween(mek.getDropshuttleBays(), f.sStartDropshuttleBays, f.sEndDropshuttleBays)) { + if (!StringUtil.isBetween(mek.getDropshuttleBays(), f.sStartDropshuttleBays, f.sEndDropshuttleBays)) { return false; } - if (!isBetween(mek.getDropshuttleDoors(), f.sStartDropshuttleDoors, f.sEndDropshuttleDoors)) { + if (!StringUtil.isBetween(mek.getDropshuttleDoors(), f.sStartDropshuttleDoors, f.sEndDropshuttleDoors)) { return false; } - if (!isBetween(mek.getDropshuttelUnits(), f.sStartDropshuttleUnits, f.sEndDropshuttleUnits)) { + if (!StringUtil.isBetween(mek.getDropshuttelUnits(), f.sStartDropshuttleUnits, f.sEndDropshuttleUnits)) { return false; } - if (!isBetween(mek.getDockingCollars(), f.sStartDockingCollars, f.sEndDockingCollars)) { + if (!StringUtil.isBetween(mek.getDockingCollars(), f.sStartDockingCollars, f.sEndDockingCollars)) { return false; } - if (!isBetween(mek.getBattleArmorHandles(), f.sStartBattleArmorHandles, f.sEndBattleArmorHandles)) { + if (!StringUtil.isBetween(mek.getBattleArmorHandles(), f.sStartBattleArmorHandles, f.sEndBattleArmorHandles)) { return false; } - if (!isBetween(mek.getCargoBayUnits(), f.sStartCargoBayUnits, f.sEndCargoBayUnits)) { + if (!StringUtil.isBetween(mek.getCargoBayUnits(), f.sStartCargoBayUnits, f.sEndCargoBayUnits)) { return false; } - if (!isBetween(mek.getNavalRepairFacilities(), f.sStartNavalRepairFacilities, f.sEndNavalRepairFacilities)) { + if (!StringUtil.isBetween(mek.getNavalRepairFacilities(), f.sStartNavalRepairFacilities, f.sEndNavalRepairFacilities)) { return false; } diff --git a/megamek/src/megamek/common/util/StringUtil.java b/megamek/src/megamek/common/util/StringUtil.java index aacd01bf59c..4db08e960a5 100644 --- a/megamek/src/megamek/common/util/StringUtil.java +++ b/megamek/src/megamek/common/util/StringUtil.java @@ -57,7 +57,7 @@ public static String makeLength(int s, int n) { /** * A utility for padding out a string with spaces. - * + * * @param s the string to pad * @param n the desired length of the resultant string * @param bRightJustify true if the string should be right justified @@ -82,7 +82,7 @@ public static String makeLength(String s, int n, boolean bRightJustify) { * the end. The format of the stamp is dictated by the client option * "StampFormat", which must use the same formatting as Java's * DateTimeFormatter class. - * + * * @param filename the String containing the filename (with extension) * @return the filename with date/time stamp added */ @@ -183,4 +183,18 @@ public static float toFloat(String s, float i) { return i; } } + + /** + * Returns if value is between the start and end + */ + public static boolean isBetween(double value, String sStart, String sEnd) { + if (sStart.isEmpty() && sEnd.isEmpty()) { + return true; + } + + int iStart = StringUtil.toInt(sStart, Integer.MIN_VALUE); + int iEnd = StringUtil.toInt(sEnd, Integer.MAX_VALUE); + + return (!(value < iStart)) && (!(value > iEnd)); + } } diff --git a/megamek/src/megamek/utilities/BoardClassifier.java b/megamek/src/megamek/utilities/BoardClassifier.java index 3294afe6814..9ee76dac0d3 100644 --- a/megamek/src/megamek/utilities/BoardClassifier.java +++ b/megamek/src/megamek/utilities/BoardClassifier.java @@ -153,8 +153,10 @@ private void scanForBoardsInDir(final File boardDir, final String basePath) { for (String tagString : boardTags) { Tags tag = Tags.parse(tagString); - getBoardsByTag().putIfAbsent(tag, new ArrayList<>()); - getBoardsByTag().get(tag).add(filePath.getPath()); + if (tag != null) { + getBoardsByTag().putIfAbsent(tag, new ArrayList<>()); + getBoardsByTag().get(tag).add(filePath.getPath()); + } } getBoardPaths().put(filePath.getPath(), partialBoardPath); From e65f6f4898543d6812ad91fedcb4d7d17336edde Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 15:34:57 -0500 Subject: [PATCH 19/57] code cleanup --- .../AdvancedSearchMapDialog.java | 146 +++++++++--------- 1 file changed, 70 insertions(+), 76 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index fcf2bc1ecef..143c92cbcd7 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -41,15 +41,21 @@ */ public class AdvancedSearchMapDialog extends AbstractButtonDialog { private BoardClassifier bc; - private JTable boardTable; - private JList listBoardTags; + private JTable boardTable = new JTable() { + @Override + public Dimension getPreferredScrollableViewportSize() { + Dimension standardSize = super.getPreferredScrollableViewportSize(); + return new Dimension(standardSize.width, getRowHeight() * 20); + } + }; + private JList listBoardTags = new JList<>(); private final JCheckBox boardTagsAllCheckBox = new JCheckBox("All"); - private JList listBoardPaths; + private JList listBoardPaths = new JList<>(); private JLabel boardImage; private JLabel boardInfo; - private TableRowSorter boardSorter; - private BoardTableModel boardModel; - private JLabel boardCountLabel; + private TableRowSorter boardSorter = new TableRowSorter<>(); + private BoardTableModel boardModel = new BoardTableModel(); + private JLabel boardCountLabel = new JLabel(""); private JTextField widthStartTextField = new JTextField(4); private JTextField widthEndTextField = new JTextField(4); private JTextField heightStartTextField = new JTextField(4); @@ -77,7 +83,6 @@ protected Container createCenterPane() { c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.NORTHWEST; c.insets = new Insets(2, 2, 2, 2); - c.gridx = 0; c.gridy = 0; @@ -85,12 +90,13 @@ protected Container createCenterPane() { JPanel mainPanel = new JPanel(new FlowLayout()); mainPanel.add(createFilter()); - mainPanel.add(createList()); + mainPanel.add(createListTable()); c.gridy++; + advancedSearchPane.add(mainPanel, c); - return advancedSearchPane; + return new JScrollPane(advancedSearchPane); } private JPanel createInfo() { @@ -109,8 +115,15 @@ private JPanel createFilter() { filterPanel.add(createFilterRange(widthStartTextField, widthEndTextField, "Width:")); filterPanel.add(createFilterRange(heightStartTextField, heightEndTextField, "Height:")); filterPanel.add(createFilterText(nameTextField, "Name:")); - filterPanel.add(createFilterTags()); - filterPanel.add(createFilterPaths()); + + JPanel tagsTitlePanel = createTitleWithCheckBox(boardTagsAllCheckBox, "Board Tags"); + List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); + filterPanel.add(createFilterList(listBoardTags, tags, tagsTitlePanel, true)); + + JPanel pathsTitlePanel = createTitle("Board Tags"); + List paths = bc.getBoardPaths().values().stream().toList(); + paths = paths.stream().map(p -> p.substring(0, p.lastIndexOf("\\") + 1 )).distinct().sorted().toList(); + filterPanel.add(createFilterList(listBoardPaths, paths, pathsTitlePanel, false)); return filterPanel; } @@ -194,86 +207,66 @@ public void changedUpdate(DocumentEvent e) { return textPanel; } - private JPanel createFilterTags() { - List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); - DefaultListModel tagsModel = new DefaultListModel<>(); - tagsModel.addAll(tags); - - JPanel boardTagsPanel = new JPanel(new BorderLayout()); - Box titlePanel = new Box(BoxLayout.LINE_AXIS); - titlePanel.setAlignmentX(Component.LEFT_ALIGNMENT); - titlePanel.add(new JLabel("Board Tags")); - titlePanel.add(Box.createRigidArea( new Dimension(5, 0))); - boardTagsAllCheckBox.setSelected(false); - boardTagsAllCheckBox.addActionListener(new AbstractAction() { + private JPanel createTitleWithCheckBox(JCheckBox checkBox, String caption) { + JPanel titlePanel = new JPanel(new BorderLayout()); + + Box titleBox = new Box(BoxLayout.LINE_AXIS); + titleBox.setAlignmentX(Component.LEFT_ALIGNMENT); + titleBox.add(new JLabel(caption)); + titleBox.add(Box.createRigidArea( new Dimension(5, 0))); + checkBox.setSelected(false); + checkBox.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { filterTables(); } }); - titlePanel.add(boardTagsAllCheckBox); + titleBox.add(checkBox); + titlePanel.add(titleBox, BorderLayout.NORTH); - listBoardTags = new JList<>(tagsModel); - listBoardTags.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - listBoardTags.addSelectionInterval(0, tags.size()); - listBoardTags.addListSelectionListener (new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - filterTables(); - } - }); - boardTagsPanel.add(titlePanel, BorderLayout.NORTH); + return titlePanel; + } + + private JPanel createTitle(String caption) { + JPanel titlePanel = new JPanel(new BorderLayout()); - boardTagsPanel.add(new JScrollPane(listBoardTags), BorderLayout.CENTER); + Box titleBox = new Box(BoxLayout.LINE_AXIS); + titleBox.setAlignmentX(Component.LEFT_ALIGNMENT); + titleBox.add(new JLabel(caption)); + titlePanel.add(titleBox, BorderLayout.NORTH); - return boardTagsPanel; + return titlePanel; } - private JPanel createFilterPaths() { - List paths = bc.getBoardPaths().values().stream().toList(); - paths = paths.stream().map(p -> p.substring(0, p.lastIndexOf("\\") + 1 )).distinct().sorted().toList(); - DefaultListModel pathsModel = new DefaultListModel<>(); - pathsModel.addAll(paths); - listBoardPaths = new JList<>(pathsModel); - listBoardPaths.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - listBoardPaths.setSelectedIndex(0); - listBoardPaths.addListSelectionListener (new ListSelectionListener() { + private JPanel createFilterList(JList list, List data, JPanel title, boolean selectAll) { + DefaultListModel model = new DefaultListModel<>(); + model.addAll(data); + list.setModel(model); + list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + list.setSelectedIndex(0); + list.addListSelectionListener (new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { filterTables(); } }); + + if (selectAll) { + list.addSelectionInterval(0, data.size()); + } + JPanel boardPathsPanel = new JPanel(new BorderLayout()); - boardPathsPanel.add(new JLabel("Board Paths"), BorderLayout.NORTH); - boardPathsPanel.add(new JScrollPane(listBoardPaths), BorderLayout.CENTER); + boardPathsPanel.add(title, BorderLayout.NORTH); + boardPathsPanel.add(new JScrollPane(list), BorderLayout.CENTER); return boardPathsPanel; } - private JPanel createList() { - JPanel listPanel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - c.gridwidth = 1; - c.gridheight = 1; - c.weightx = 0; - c.weighty = 0; - c.fill = GridBagConstraints.BOTH; - c.anchor = GridBagConstraints.NORTHWEST; - c.insets = new Insets(2, 2, 2, 2); + private JPanel createListTable() { + JPanel listPanel = new JPanel(); + listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.PAGE_AXIS)); - c.gridx = 0; - c.gridy = 0; - - boardModel = new BoardTableModel(); boardModel.setData(bc); - boardTable = new JTable() { - @Override - public Dimension getPreferredScrollableViewportSize() { - Dimension standardSize = super.getPreferredScrollableViewportSize(); - return new Dimension(standardSize.width, getRowHeight() * 20); - } - }; - boardTable.setName("Board"); ListSelectionModel boardSelModel = boardTable.getSelectionModel(); boardSelModel.addListSelectionListener (new ListSelectionListener() { @@ -288,7 +281,7 @@ public void valueChanged(ListSelectionEvent e) { } }); boardTable.setModel(boardModel); - boardSorter = new TableRowSorter<>(boardModel); + boardSorter.setModel(boardModel); boardSorter.setSortKeys(List.of(new RowSorter.SortKey(0, SortOrder.ASCENDING))); boardTable.setRowSorter(boardSorter); boardTable.setIntercellSpacing(new Dimension(5, 0)); @@ -300,17 +293,15 @@ public void valueChanged(ListSelectionEvent e) { DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); rightRenderer.setHorizontalAlignment(JLabel.RIGHT); boardTable.setFillsViewportHeight(true); - listPanel.add(new JScrollPane(boardTable), c); - - c.gridy++; - c.fill = GridBagConstraints.HORIZONTAL; + listPanel.add(new JScrollPane(boardTable)); JPanel countPanel = new JPanel(new FlowLayout()); JLabel countLabel = new JLabel("Count: "); countPanel.add(countLabel); - boardCountLabel = new JLabel(boardTable.getRowCount() + ""); + + boardCountLabel.setText(boardModel.getRowCount() + ""); countPanel.add(boardCountLabel); - listPanel.add(countPanel, c); + listPanel.add(countPanel); return listPanel; } @@ -369,6 +360,9 @@ private boolean matchTag(List tags) { } } + /** + * Returns if path for the selected map when the dialog is confirmed + */ public String getPath() { int index = boardTable.getSelectedRow() ; if (index >= 0) { From 474def9efa90e5d6bcbf08235496c57705a86d68 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 17:02:56 -0500 Subject: [PATCH 20/57] code cleanup --- .../client/ui/advancedSearchMap/AdvancedSearchMapDialog.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index 143c92cbcd7..d7ef8ea3650 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -19,6 +19,7 @@ package megamek.client.ui.advancedSearchMap; import megamek.client.ui.baseComponents.AbstractButtonDialog; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.util.StringUtil; import megamek.utilities.BoardClassifier; import megamek.utilities.BoardsTagger; @@ -120,7 +121,7 @@ private JPanel createFilter() { List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); filterPanel.add(createFilterList(listBoardTags, tags, tagsTitlePanel, true)); - JPanel pathsTitlePanel = createTitle("Board Tags"); + JPanel pathsTitlePanel = createTitle("Board Paths"); List paths = bc.getBoardPaths().values().stream().toList(); paths = paths.stream().map(p -> p.substring(0, p.lastIndexOf("\\") + 1 )).distinct().sorted().toList(); filterPanel.add(createFilterList(listBoardPaths, paths, pathsTitlePanel, false)); @@ -275,7 +276,7 @@ public void valueChanged(ListSelectionEvent e) { int index = boardTable.getSelectedRow() ; if (index >= 0) { index = boardTable.convertRowIndexToModel(index); - boardImage.setIcon(boardModel.getIconAt(index, 200)); + boardImage.setIcon(boardModel.getIconAt(index, UIUtil.scaleForGUI(200))); boardInfo.setText(boardModel.getInfoAt(index)); } } From cf84c9683e07094300849494b1d9279be77f9b96 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 21:47:58 -0500 Subject: [PATCH 21/57] 0 pad size to improve sort, add tooltips for range textfields --- .../client/ui/advancedSearchMap/AdvancedSearchMapDialog.java | 3 +++ .../megamek/client/ui/advancedSearchMap/BoardTableModel.java | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index d7ef8ea3650..9a8d0c209f3 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -167,6 +167,7 @@ private JPanel createFilterRange(JTextField startTextField, JTextField endTextFi textBox.add(new JLabel(caption)); textBox.add(Box.createRigidArea( new Dimension(5, 0))); + startTextField.setToolTipText("start range, blank acts as wildcard"); startTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { @@ -186,6 +187,8 @@ public void changedUpdate(DocumentEvent e) { textBox.add(startTextField); textBox.add(new JLabel(" - ")); + + endTextField.setToolTipText("end range, blank acts as wildcard"); endTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index c6ff31ce7aa..848c096e70b 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -122,6 +122,8 @@ public boolean isCellEditable(int row, int col) { public Object getValueAt(int row, int col) { String path = getPathAt(row); String size = getSizeAt(row); + Integer width = getWidthAt(row); + Integer height = getHeightAt(row); if (path== null) { return "?"; @@ -134,7 +136,7 @@ public Object getValueAt(int row, int col) { value = value.substring(0, value.lastIndexOf(".board")); value = value.replace(size, "").trim(); } else if (col == COL_SIZE) { - value = size; + value = String.format("%03dx%03d", width, height); } return value; From b4aba7e3fbf61b9f5d8f483c6b5d3967cd784a31 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Sun, 10 Nov 2024 21:58:17 -0500 Subject: [PATCH 22/57] code cleanup --- .../ui/advancedSearchMap/BoardTableModel.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 848c096e70b..60e2a872349 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -42,7 +42,6 @@ class BoardTableModel extends AbstractTableModel { private List data; private List tags; - private List size; private List width; private List height; @@ -59,7 +58,6 @@ public int getRowCount() { public void clearData() { data = new ArrayList<>(); tags = new ArrayList<>(); - size = new ArrayList<>(); width = new ArrayList<>(); height = new ArrayList<>(); fireTableDataChanged(); @@ -81,14 +79,12 @@ public int getPreferredWidth(int col) { public void setData(BoardClassifier bc) { data = bc.getBoardPaths().values().stream().toList();; tags = new ArrayList<>(); - size = new ArrayList<>(); width = new ArrayList<>(); height = new ArrayList<>(); for (String path : data) { String key = Configuration.boardsDir() + path; tags.add(bc.getBoardTags().get(key)); - size.add(bc.getBoardWidth().get(key) + "x" + bc.getBoardHeigth().get(key)); width.add(bc.getBoardWidth().get(key)); height.add(bc.getBoardHeigth().get(key)); } @@ -121,20 +117,18 @@ public boolean isCellEditable(int row, int col) { @Override public Object getValueAt(int row, int col) { String path = getPathAt(row); - String size = getSizeAt(row); Integer width = getWidthAt(row); Integer height = getHeightAt(row); if (path== null) { return "?"; } - String value = ""; if (col == COL_NAME) { value = path.substring(path.lastIndexOf("\\") + 1, path.length()); value = value.substring(0, value.lastIndexOf(".board")); - value = value.replace(size, "").trim(); + value = value.replace(width + "x" + height, "").trim(); } else if (col == COL_SIZE) { value = String.format("%03dx%03d", width, height); } @@ -150,14 +144,6 @@ public String getPathAt(int row) { return data.get(row); } - public String getSizeAt(int row) { - if (size.size() <= row) { - return null; - } - - return size.get(row); - } - public Integer getWidthAt(int row) { if (width.size() <= row) { return null; From 306ac8eae151b5a693b198ecc05117c3f50f2276 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Mon, 11 Nov 2024 19:39:33 -0500 Subject: [PATCH 23/57] add text to messages --- .../i18n/megamek/client/messages.properties | 14 ++++++++++- .../AdvancedSearchMapDialog.java | 19 +++++++------- .../ui/advancedSearchMap/BoardTableModel.java | 25 ++++++++++--------- .../client/ui/swing/lobby/ChatLounge.java | 2 +- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 3d1f23e90a0..d2d3f3754b3 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -155,7 +155,6 @@ BT.Quirks=Quirks AdvancedSearchDialog.title=Advanced Search -AdvancedSearchMapDialog.title=Advanced Search AimedShotDialog.dontAim=Don't aim @@ -169,6 +168,19 @@ AdvancedOptions.KeyRepeatRate.name=Key Repeat Rate AdvancedOptions.KeyRepeatRate.tooltip= Sets how frequently a key is repeated, if a keybind has the isRepeatable flag set. AdvancedOptions.ShowFPS.name=Show drawtime +AdvancedSearchMapDialog.boardTableCount=Count: +AdvancedSearchMapDialog.boardTableModel.name=Name +AdvancedSearchMapDialog.boardTableModel.size=Size +AdvancedSearchMapDialog.boardTagsAllCheckBox=All +AdvancedSearchMapDialog.filterBoardPaths=Board Paths +AdvancedSearchMapDialog.filterBoardTags=Board Tags +AdvancedSearchMapDialog.filterName=Name: +AdvancedSearchMapDialog.filterRangeEnd.tooltip=end range, blank acts as wildcard +AdvancedSearchMapDialog.filterRangeHeight=Height: +AdvancedSearchMapDialog.filterRangeStart.tooltip=start range, blank acts as wildcard +AdvancedSearchMapDialog.filterRangeWidth=Width: +AdvancedSearchMapDialog.title=Advanced Search + #Board Editor BoardEditor.BridgeBuildingElevError=Bridge/Building Elevation is an offset from the surface of a hex and hence must be a positive value! BoardEditor.OpenFileError=Could not open file {0}. diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java index 9a8d0c209f3..52bcf0c318e 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/AdvancedSearchMapDialog.java @@ -18,6 +18,7 @@ */ package megamek.client.ui.advancedSearchMap; +import megamek.client.ui.Messages; import megamek.client.ui.baseComponents.AbstractButtonDialog; import megamek.client.ui.swing.util.UIUtil; import megamek.common.util.StringUtil; @@ -50,7 +51,7 @@ public Dimension getPreferredScrollableViewportSize() { } }; private JList listBoardTags = new JList<>(); - private final JCheckBox boardTagsAllCheckBox = new JCheckBox("All"); + private final JCheckBox boardTagsAllCheckBox = new JCheckBox(Messages.getString("AdvancedSearchMapDialog.boardTagsAllCheckBox")); private JList listBoardPaths = new JList<>(); private JLabel boardImage; private JLabel boardInfo; @@ -113,15 +114,15 @@ private JPanel createFilter() { JPanel filterPanel = new JPanel(); filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.PAGE_AXIS)); - filterPanel.add(createFilterRange(widthStartTextField, widthEndTextField, "Width:")); - filterPanel.add(createFilterRange(heightStartTextField, heightEndTextField, "Height:")); - filterPanel.add(createFilterText(nameTextField, "Name:")); + filterPanel.add(createFilterRange(widthStartTextField, widthEndTextField, Messages.getString("AdvancedSearchMapDialog.filterRangeWidth"))); + filterPanel.add(createFilterRange(heightStartTextField, heightEndTextField, Messages.getString("AdvancedSearchMapDialog.filterRangeHeight"))); + filterPanel.add(createFilterText(nameTextField, Messages.getString("AdvancedSearchMapDialog.filterName"))); - JPanel tagsTitlePanel = createTitleWithCheckBox(boardTagsAllCheckBox, "Board Tags"); + JPanel tagsTitlePanel = createTitleWithCheckBox(boardTagsAllCheckBox, Messages.getString("AdvancedSearchMapDialog.filterBoardTags")); List tags = Arrays.stream(BoardsTagger.Tags.values()).map(BoardsTagger.Tags::getName).distinct().sorted().toList(); filterPanel.add(createFilterList(listBoardTags, tags, tagsTitlePanel, true)); - JPanel pathsTitlePanel = createTitle("Board Paths"); + JPanel pathsTitlePanel = createTitle(Messages.getString("AdvancedSearchMapDialog.filterBoardPaths")); List paths = bc.getBoardPaths().values().stream().toList(); paths = paths.stream().map(p -> p.substring(0, p.lastIndexOf("\\") + 1 )).distinct().sorted().toList(); filterPanel.add(createFilterList(listBoardPaths, paths, pathsTitlePanel, false)); @@ -167,7 +168,7 @@ private JPanel createFilterRange(JTextField startTextField, JTextField endTextFi textBox.add(new JLabel(caption)); textBox.add(Box.createRigidArea( new Dimension(5, 0))); - startTextField.setToolTipText("start range, blank acts as wildcard"); + startTextField.setToolTipText(Messages.getString("AdvancedSearchMapDialog.filterRangeStart.tooltip")); startTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { @@ -188,7 +189,7 @@ public void changedUpdate(DocumentEvent e) { textBox.add(new JLabel(" - ")); - endTextField.setToolTipText("end range, blank acts as wildcard"); + endTextField.setToolTipText(Messages.getString("AdvancedSearchMapDialog.filterRangeEnd.tooltip")); endTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { @@ -300,7 +301,7 @@ public void valueChanged(ListSelectionEvent e) { listPanel.add(new JScrollPane(boardTable)); JPanel countPanel = new JPanel(new FlowLayout()); - JLabel countLabel = new JLabel("Count: "); + JLabel countLabel = new JLabel(Messages.getString("AdvancedSearchMapDialog.boardTableCount")); countPanel.add(countLabel); boardCountLabel.setText(boardModel.getRowCount() + ""); diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 60e2a872349..f163e02e456 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -18,6 +18,7 @@ */ package megamek.client.ui.advancedSearchMap; +import megamek.client.ui.Messages; import megamek.client.ui.swing.minimap.Minimap; import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; @@ -96,9 +97,9 @@ public void setData(BoardClassifier bc) { public String getColumnName(int column) { switch (column) { case COL_NAME: - return "Name"; + return Messages.getString("AdvancedSearchMapDialog.boardTableModel.name"); case COL_SIZE: - return "Size"; + return Messages.getString("AdvancedSearchMapDialog.boardTableModel.size"); default: return "??"; } @@ -185,17 +186,17 @@ public String getInfoAt(int row) { board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); String info; - String col = UIUtil.tag("td", "", path); - info = UIUtil.tag("tr", "", col); - col = UIUtil.tag("td", "", board.getWidth() + "x" + board.getHeight()); - info += UIUtil.tag("tr", "", col); - col = UIUtil.tag("td", "", board.getTags().toString()); - info += UIUtil.tag("tr", "", col); - info = UIUtil.tag("table", "", info); + String col = UIUtil.tag("TD", "", path); + info = UIUtil.tag("TR", "", col); + col = UIUtil.tag("TD", "", board.getWidth() + "x" + board.getHeight()); + info += UIUtil.tag("TR", "", col); + col = UIUtil.tag("TD", "", board.getTags().toString()); + info += UIUtil.tag("TR", "", col); + info = UIUtil.tag("TABLE", "", info); String attr = String.format("WIDTH=%s", UIUtil.scaleForGUI(500)); - info = UIUtil.tag("div", attr, info); - info = UIUtil.tag("body", "", info); - info = UIUtil.tag("html", "", info); + info = UIUtil.tag("DIV", attr, info); + info = UIUtil.tag("BODY", "", info); + info = UIUtil.tag("HTML", "", info); return info; } diff --git a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java index 1865ae4442c..dbc9e0b12f8 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java +++ b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java @@ -214,7 +214,7 @@ public class ChatLounge extends AbstractPhaseDisplay implements private JLabel lblBoardSize = new JLabel(Messages.getString("ChatLounge.labBoardSize")); private JButton butHelp = new JButton(" " + Messages.getString("ChatLounge.butHelp") + " "); - private JButton butAdvancedSearchMap = new JButton("Advanced Search"); + private JButton butAdvancedSearchMap = new JButton(Messages.getString("AdvancedSearchMapDialog.title")); private JButton butConditions = new JButton(Messages.getString("ChatLounge.butConditions")); private JButton butRandomMap = new JButton(Messages.getString("BoardSelectionDialog.GeneratedMapSettings")); From 49d0538a847ccdcae8f305538ca020df57014205 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Mon, 11 Nov 2024 20:00:29 -0500 Subject: [PATCH 24/57] code cleanup --- .../ui/advancedSearchMap/BoardTableModel.java | 61 ++++++++----------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index f163e02e456..49e1cf7f86d 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -46,7 +46,6 @@ class BoardTableModel extends AbstractTableModel { private List width; private List height; - public BoardTableModel() { data = new ArrayList<>(); } @@ -56,43 +55,11 @@ public int getRowCount() { return data.size(); } - public void clearData() { - data = new ArrayList<>(); - tags = new ArrayList<>(); - width = new ArrayList<>(); - height = new ArrayList<>(); - fireTableDataChanged(); - } - @Override public int getColumnCount() { return N_COL; } - public int getPreferredWidth(int col) { - return switch (col) { - case COL_NAME -> 200; - case COL_SIZE -> 20; - default -> 10; - }; - } - - public void setData(BoardClassifier bc) { - data = bc.getBoardPaths().values().stream().toList();; - tags = new ArrayList<>(); - width = new ArrayList<>(); - height = new ArrayList<>(); - - for (String path : data) { - String key = Configuration.boardsDir() + path; - tags.add(bc.getBoardTags().get(key)); - width.add(bc.getBoardWidth().get(key)); - height.add(bc.getBoardHeigth().get(key)); - } - - fireTableDataChanged(); - } - @Override public String getColumnName(int column) { switch (column) { @@ -137,6 +104,30 @@ public Object getValueAt(int row, int col) { return value; } + public int getPreferredWidth(int col) { + return switch (col) { + case COL_NAME -> 200; + case COL_SIZE -> 20; + default -> 10; + }; + } + + public void setData(BoardClassifier bc) { + data = bc.getBoardPaths().values().stream().toList();; + tags = new ArrayList<>(); + width = new ArrayList<>(); + height = new ArrayList<>(); + + for (String path : data) { + String key = Configuration.boardsDir() + path; + tags.add(bc.getBoardTags().get(key)); + width.add(bc.getBoardWidth().get(key)); + height.add(bc.getBoardHeigth().get(key)); + } + + fireTableDataChanged(); + } + public String getPathAt(int row) { if (data.size() <= row) { return null; @@ -161,10 +152,6 @@ public Integer getHeightAt(int row) { return height.get(row); } - public List getAllPaths() { - return data; - } - public ImageIcon getIconAt(int row, int height) { String path = getPathAt(row); Board board = new Board(16, 17); From fc2e5ace8c534d82c89a4ba547a292950b46fa87 Mon Sep 17 00:00:00 2001 From: Coppio Date: Tue, 12 Nov 2024 13:58:11 -0300 Subject: [PATCH 25/57] chore: gm improving gm commands, removing unnecessary options --- megamek/i18n/megamek/common/options/messages.properties | 2 -- megamek/src/megamek/common/options/GameOptions.java | 1 - megamek/src/megamek/common/options/OptionsConstants.java | 1 - megamek/src/megamek/server/commands/KillCommand.java | 4 ---- .../server/commands/OrbitalBombardmentCommand.java | 8 ++++---- 5 files changed, 4 insertions(+), 12 deletions(-) diff --git a/megamek/i18n/megamek/common/options/messages.properties b/megamek/i18n/megamek/common/options/messages.properties index e1a5a134ba3..78fd3cd33c0 100644 --- a/megamek/i18n/megamek/common/options/messages.properties +++ b/megamek/i18n/megamek/common/options/messages.properties @@ -140,8 +140,6 @@ GameOptionsInfo.option.allow_nukes.displayableName=Allow command-line nukes. GameOptionsInfo.option.allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. GameOptionsInfo.option.really_allow_nukes.displayableName=REALLY allow command-line nukes. GameOptionsInfo.option.really_allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. -GameOptionsInfo.option.gm_can_kill_units.displayableName=Allow command-line kill (GM only). -GameOptionsInfo.option.gm_can_kill_units.description=This must be checked to allow the GM to kill units using command line. If this is not checked, the command is disabled. GameOptionsInfo.group.advancedRules.displayableName=Advanced Rules diff --git a/megamek/src/megamek/common/options/GameOptions.java b/megamek/src/megamek/common/options/GameOptions.java index 1bcf6c0ce8d..77fae48cbde 100755 --- a/megamek/src/megamek/common/options/GameOptions.java +++ b/megamek/src/megamek/common/options/GameOptions.java @@ -93,7 +93,6 @@ public synchronized void initialize() { addOption(allowed, OptionsConstants.ALLOWED_NO_CLAN_PHYSICAL, false); addOption(allowed, OptionsConstants.ALLOWED_ALLOW_NUKES, false); addOption(allowed, OptionsConstants.ALLOWED_REALLY_ALLOW_NUKES, false); - addOption(allowed, OptionsConstants.ALLOWED_GM_CAN_KILL_UNITS, false); IBasicOptionGroup advancedRules = addGroup("advancedRules"); addOption(advancedRules, OptionsConstants.ADVANCED_MINEFIELDS, false); diff --git a/megamek/src/megamek/common/options/OptionsConstants.java b/megamek/src/megamek/common/options/OptionsConstants.java index 9a757bc9897..0a46c5d48e7 100644 --- a/megamek/src/megamek/common/options/OptionsConstants.java +++ b/megamek/src/megamek/common/options/OptionsConstants.java @@ -330,7 +330,6 @@ public class OptionsConstants { public static final String ALLOWED_NO_CLAN_PHYSICAL = "no_clan_physical"; public static final String ALLOWED_ALLOW_NUKES = "allow_nukes"; public static final String ALLOWED_REALLY_ALLOW_NUKES = "really_allow_nukes"; - public static final String ALLOWED_GM_CAN_KILL_UNITS = "gm_can_kill_units"; public static final String ADVANCED_MINEFIELDS = "minefields"; public static final String ADVANCED_HIDDEN_UNITS = "hidden_units"; public static final String ADVANCED_BLACK_ICE= "black_ice"; diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index bc436c49380..45f2b6d7dca 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -45,10 +45,6 @@ public KillCommand(Server server, TWGameManager gameManager) { public void run(int connId, String[] args) { // Check to make sure gm kills are allowed! - if (!(server.getGame().getOptions().booleanOption(OptionsConstants.ALLOWED_GM_CAN_KILL_UNITS))) { - server.sendServerChat(connId, "Command-line kill is not enabled in this game."); - return; - } if (!isGM(connId)) { server.sendServerChat(connId, "You are not a Game Master."); return; diff --git a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java index c3d31e2202f..5424526f93d 100644 --- a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java +++ b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java @@ -35,12 +35,12 @@ public OrbitalBombardmentCommand(Server server, TWGameManager gameManager) { super(server, "ob", "GM Drops a bomb onto the board doing of 100 damage with a 3 hex radius, to be exploded at" + "the end of the next weapons attack phase." + "Allowed formats:"+ - "/bomb and" + - "/bomb [factor=10] [radius=4]" + - "the damage at impact point is 10 times the factor, default is 10. " + + "/ob and" + + "/ob [factor=#] [radius=#]" + + "the damage at impact point is the factor times 10, default factor value is 10. " + "and hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23), the explosion blast radius default " + "is equal to 4, it automatically applies a linear damage dropoff each hex away from the center." + - " All parameters in square brackets may be ommited. " + + " All parameters in square brackets may be omitted. " + " Example: /ob 10 10 factor=12 "); this.gameManager = gameManager; } From e52f8f669c01b163f4d8cd344e30196ae12ca117 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 12 Nov 2024 13:57:23 -0600 Subject: [PATCH 26/57] Cleanup Mounted generics. --- megamek/src/megamek/common/MiscType.java | 21 +++++++++---------- .../megamek/common/verifier/TestEntity.java | 15 +++++++------ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/megamek/src/megamek/common/MiscType.java b/megamek/src/megamek/common/MiscType.java index b65a155f412..f41bae2d9a5 100644 --- a/megamek/src/megamek/common/MiscType.java +++ b/megamek/src/megamek/common/MiscType.java @@ -17,6 +17,8 @@ import java.math.BigInteger; import java.text.NumberFormat; +import megamek.common.equipment.MiscMounted; +import megamek.common.equipment.WeaponMounted; import megamek.common.miscGear.AntiMekGear; import megamek.common.weapons.ppc.CLERPPC; import megamek.common.weapons.ppc.ISERPPC; @@ -962,10 +964,9 @@ public double getCost(Entity entity, boolean isArmored, int loc, double size) { } } - for (Mounted mo : entity.getMisc()) { - MiscType mt = (MiscType) mo.getType(); - if (mt.hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { - fTons += mo.getTonnage(); + for (MiscMounted mounted : entity.getMisc()) { + if (mounted.getType().hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { + fTons += mounted.getTonnage(); } } if (getInternalName().equals("ISTargeting Computer")) { @@ -1110,17 +1111,15 @@ public int getCriticals(Entity entity, double size) { } else if (hasFlag(F_TARGCOMP)) { // based on tonnage of direct_fire weaponry double fTons = 0.0; - for (Mounted m : entity.getWeaponList()) { - WeaponType wt = (WeaponType) m.getType(); - if (wt.hasFlag(WeaponType.F_DIRECT_FIRE)) { + for (WeaponMounted m : entity.getWeaponList()) { + if (m.getType().hasFlag(WeaponType.F_DIRECT_FIRE)) { fTons += m.getTonnage(); } } - for (Mounted mo : entity.getMisc()) { - MiscType mt = (MiscType) mo.getType(); - if (mt.hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { - fTons += mo.getTonnage(); + for (MiscMounted mounted : entity.getMisc()) { + if (mounted.getType().hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { + fTons += mounted.getTonnage(); } } if (TechConstants.isClan(getTechLevel(entity.getTechLevelYear()))) { diff --git a/megamek/src/megamek/common/verifier/TestEntity.java b/megamek/src/megamek/common/verifier/TestEntity.java index b6ceaf64840..8de948b2da0 100755 --- a/megamek/src/megamek/common/verifier/TestEntity.java +++ b/megamek/src/megamek/common/verifier/TestEntity.java @@ -32,6 +32,7 @@ import megamek.common.annotations.Nullable; import megamek.common.enums.MPBoosters; import megamek.common.equipment.ArmorType; +import megamek.common.equipment.MiscMounted; import megamek.common.equipment.WeaponMounted; import megamek.common.util.StringUtil; import megamek.common.weapons.battlearmor.BAFlamerWeapon; @@ -788,16 +789,14 @@ public int calcMiscCrits(MiscType mt, double size) { } } else if (mt.hasFlag(MiscType.F_TARGCOMP)) { double fTons = 0.0f; - for (Mounted mo : getEntity().getWeaponList()) { - WeaponType wt = (WeaponType) mo.getType(); - if (wt.hasFlag(WeaponType.F_DIRECT_FIRE)) { - fTons += mo.getTonnage(); + for (WeaponMounted mounted : getEntity().getWeaponList()) { + if (mounted.getType().hasFlag(WeaponType.F_DIRECT_FIRE)) { + fTons += mounted.getTonnage(); } } - for (Mounted mo : getEntity().getMisc()) { - MiscType mt2 = (MiscType) mo.getType(); - if (mt2.hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { - fTons += mo.getTonnage(); + for (MiscMounted mounted : getEntity().getMisc()) { + if (mounted.getType().hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { + fTons += mounted.getTonnage(); } } double weight = 0.0f; From a592d5121152990e3d23f02993ff804a8a55fc15 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 12 Nov 2024 14:06:38 -0600 Subject: [PATCH 27/57] Add Mounted parameter to Mounted::getModesCount so we can check linked equipment. --- .../src/megamek/client/ui/swing/EquipChoicePanel.java | 2 +- megamek/src/megamek/common/EquipmentType.java | 9 +++++++++ megamek/src/megamek/common/Mounted.java | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java b/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java index 87bb9115ad4..aa5f76f03ba 100644 --- a/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java +++ b/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java @@ -1139,7 +1139,7 @@ public void applyChoice() { if (chHotLoad.isSelected() != m_mounted.isHotLoaded()) { m_mounted.setHotLoad(chHotLoad.isSelected()); // Set the mode too, so vehicles can switch back - int numModes = m_mounted.getType().getModesCount(); + int numModes = m_mounted.getModesCount(); for (int m = 0; m < numModes; m++) { if (m_mounted.getType().getMode(m).getName() .equals("HotLoad")) { diff --git a/megamek/src/megamek/common/EquipmentType.java b/megamek/src/megamek/common/EquipmentType.java index 746676431de..440f78e2854 100644 --- a/megamek/src/megamek/common/EquipmentType.java +++ b/megamek/src/megamek/common/EquipmentType.java @@ -555,6 +555,15 @@ public boolean hasModeType(String modeType) { return false; } + /** + * @param mounted The equipment mount. In some cases the moudes are affected by linked equipment. + * @return the number of modes that this type of equipment can be in or + * 0 if it doesn't have modes. + */ + public int getModesCount(Mounted mounted) { + return getModesCount(); + } + /** * @return the number of modes that this type of equipment can be in or * 0 if it doesn't have modes. diff --git a/megamek/src/megamek/common/Mounted.java b/megamek/src/megamek/common/Mounted.java index f50b9e24885..cb5a95c9a5f 100644 --- a/megamek/src/megamek/common/Mounted.java +++ b/megamek/src/megamek/common/Mounted.java @@ -229,7 +229,7 @@ protected void setType(T type) { } public int getModesCount() { - return getType().getModesCount(); + return getType().getModesCount(this); } protected EquipmentMode getMode(int mode) { From 7ac4c3e0433a98abed0fc8f6a0f7ff8cb1eca086 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 12 Nov 2024 14:29:26 -0600 Subject: [PATCH 28/57] Add pulse mode to lasers, only used when connected to laser pulse module. --- .../common/equipmentmessages.properties | 1 + .../common/weapons/lasers/LaserWeapon.java | 43 ++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/megamek/i18n/megamek/common/equipmentmessages.properties b/megamek/i18n/megamek/common/equipmentmessages.properties index 4f4b6444a7a..7fc53ebc1ff 100644 --- a/megamek/i18n/megamek/common/equipmentmessages.properties +++ b/megamek/i18n/megamek/common/equipmentmessages.properties @@ -16,6 +16,7 @@ EquipmentMode.Off=Off EquipmentMode.Armed=Armed EquipmentMode.Normal=Normal EquipmentMode.Aimed\ shot=Aimed shot +EquipmentMode.Pulse=Pulse EquipmentMode.Bracket\ 80%=Bracket 80% EquipmentMode.Bracket\ 60%=Bracket 60% diff --git a/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java b/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java index d20d87ecc83..68400207472 100644 --- a/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java +++ b/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java @@ -19,9 +19,13 @@ import megamek.common.Mounted; import megamek.common.ToHitData; import megamek.common.actions.WeaponAttackAction; +import megamek.common.equipment.MiscMounted; +import megamek.common.options.GameOptions; +import megamek.common.options.OptionsConstants; import megamek.common.weapons.AttackHandler; import megamek.common.weapons.EnergyWeaponHandler; import megamek.common.weapons.InsulatedLaserWeaponHandler; +import megamek.common.weapons.PulseLaserWeaponHandler; import megamek.server.totalwarfare.TWGameManager; /** @@ -39,21 +43,38 @@ public LaserWeapon() { atClass = CLASS_LASER; } - /* - * (non-Javadoc) - * - * @see - * megamek.common.weapons.Weapon#getCorrectHandler(megamek.common.ToHitData, - * megamek.common.actions.WeaponAttackAction, megamek.common.Game, - * megamek.server.Server) - */ + @Override + public void adaptToGameOptions(GameOptions gOp) { + super.adaptToGameOptions(gOp); + + if (!(this instanceof PulseLaserWeapon)) { + addMode(""); + addMode("Pulse"); + } + } + + @Override + public int getModesCount(Mounted mounted) { + Mounted linkedBy = mounted.getLinkedBy(); + if ((linkedBy instanceof MiscMounted) + && !linkedBy.isInoperable() + && ((MiscMounted) linkedBy).getType().hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { + return 2; + } else { + return 0; + } + } + @Override protected AttackHandler getCorrectHandler(ToHitData toHit, WeaponAttackAction waa, Game game, TWGameManager manager) { Mounted linkedBy = waa.getEntity(game).getEquipment(waa.getWeaponId()).getLinkedBy(); - if ((linkedBy != null) && !linkedBy.isInoperable() - && linkedBy.getType().hasFlag(MiscType.F_LASER_INSULATOR)) { - return new InsulatedLaserWeaponHandler(toHit, waa, game, manager); + if ((linkedBy != null) && !linkedBy.isInoperable()) { + if (linkedBy.getType().hasFlag(MiscType.F_LASER_INSULATOR)) { + return new InsulatedLaserWeaponHandler(toHit, waa, game, manager); + } else if (linkedBy.getType().hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { + return new PulseLaserWeaponHandler(toHit, waa, game, manager); + } } return new EnergyWeaponHandler(toHit, waa, game, manager); } From c4413d6cc9f0466364a09ceab87e2b598a8922a2 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 12 Nov 2024 14:32:59 -0600 Subject: [PATCH 29/57] Add pulse restriction to targeting computer aiming when laser is in pulse mode. --- megamek/src/megamek/common/Compute.java | 1 + 1 file changed, 1 insertion(+) diff --git a/megamek/src/megamek/common/Compute.java b/megamek/src/megamek/common/Compute.java index de4ef9701c4..02491143d28 100644 --- a/megamek/src/megamek/common/Compute.java +++ b/megamek/src/megamek/common/Compute.java @@ -7248,6 +7248,7 @@ public static boolean allowAimedShotWith(WeaponMounted weapon, AimingMode aiming case TARGETING_COMPUTER: if (!wtype.hasFlag(WeaponType.F_DIRECT_FIRE) || wtype.hasFlag(WeaponType.F_PULSE) + || weapon.curMode().getName().equals("Pulse") || (wtype instanceof HAGWeapon)) { return false; } From 6a132ae2cdc1e174eb6720926ea33e9170db2e9b Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 12 Nov 2024 14:57:35 -0600 Subject: [PATCH 30/57] Add -2 to-hit modifier for laser using pulse module. --- megamek/src/megamek/client/bot/princess/FireControl.java | 6 +++--- megamek/src/megamek/common/AmmoType.java | 4 ++++ megamek/src/megamek/common/EquipmentType.java | 2 +- megamek/src/megamek/common/WeaponType.java | 4 ++-- .../src/megamek/common/actions/WeaponAttackAction.java | 8 ++++---- .../src/megamek/common/weapons/lasers/LaserWeapon.java | 9 +++++++++ megamek/src/megamek/common/weapons/ppc/PPCWeapon.java | 4 ++-- 7 files changed, 25 insertions(+), 12 deletions(-) diff --git a/megamek/src/megamek/client/bot/princess/FireControl.java b/megamek/src/megamek/client/bot/princess/FireControl.java index 54125489fad..70f228ab23b 100644 --- a/megamek/src/megamek/client/bot/princess/FireControl.java +++ b/megamek/src/megamek/client/bot/princess/FireControl.java @@ -902,8 +902,8 @@ ToHitData guessToHitModifierForWeapon(final Entity shooter, toHit.append(getDamageWeaponMods(shooter, weapon)); // weapon mods - if (0 != weaponType.getToHitModifier()) { - toHit.addModifier(weaponType.getToHitModifier(), TH_WEAPON_MOD); + if (0 != weaponType.getToHitModifier(weapon)) { + toHit.addModifier(weaponType.getToHitModifier(weapon), TH_WEAPON_MOD); } // Target size. @@ -3475,7 +3475,7 @@ AmmoMounted getAntiAirAmmo(final List ammoList, if (!(weaponType instanceof MMLWeapon)) { // Naively assume that easier-hitting is better if (returnAmmo != null) { - AmmoType returnAmmoType = (AmmoType) (returnAmmo.getType()); + AmmoType returnAmmoType = returnAmmo.getType(); returnAmmo = ((ammoType.getToHitModifier() > returnAmmoType.getToHitModifier()) ? ammo : returnAmmo); } else { diff --git a/megamek/src/megamek/common/AmmoType.java b/megamek/src/megamek/common/AmmoType.java index 41445f12e22..ce6db0e7700 100644 --- a/megamek/src/megamek/common/AmmoType.java +++ b/megamek/src/megamek/common/AmmoType.java @@ -484,6 +484,10 @@ public int getAmmoType() { return ammoType; } + public int getToHitModifier() { + return toHitModifier; + } + /** * Analog to WeaponType.getFireTNRoll(), but based on munitions. * See TO:AR pg 42 diff --git a/megamek/src/megamek/common/EquipmentType.java b/megamek/src/megamek/common/EquipmentType.java index 440f78e2854..7c2cb86723b 100644 --- a/megamek/src/megamek/common/EquipmentType.java +++ b/megamek/src/megamek/common/EquipmentType.java @@ -502,7 +502,7 @@ public boolean isSpreadable() { return spreadable; } - public int getToHitModifier() { + public int getToHitModifier(@Nullable Mounted mounted) { return toHitModifier; } diff --git a/megamek/src/megamek/common/WeaponType.java b/megamek/src/megamek/common/WeaponType.java index 51be77a0c7a..3d4820e2712 100644 --- a/megamek/src/megamek/common/WeaponType.java +++ b/megamek/src/megamek/common/WeaponType.java @@ -805,8 +805,8 @@ && getLongRange() < AlphaStrikeElement.LONG_RANGE) { damage = adjustBattleForceDamageForMinRange(damage); } - if (getToHitModifier() != 0) { - damage -= damage * getToHitModifier() * 0.05; + if (getToHitModifier(null) != 0) { + damage -= damage * getToHitModifier(null) * 0.05; } } diff --git a/megamek/src/megamek/common/actions/WeaponAttackAction.java b/megamek/src/megamek/common/actions/WeaponAttackAction.java index 53d7fb3b136..1876be5a9cc 100644 --- a/megamek/src/megamek/common/actions/WeaponAttackAction.java +++ b/megamek/src/megamek/common/actions/WeaponAttackAction.java @@ -3193,8 +3193,8 @@ private static ToHitData compileWeaponToHitMods(Game game, Entity ae, Entity spo } // Flat to hit modifiers defined in WeaponType - if (wtype.getToHitModifier() != 0) { - int modifier = wtype.getToHitModifier(); + if (wtype.getToHitModifier(weapon) != 0) { + int modifier = wtype.getToHitModifier(weapon); if (wtype instanceof VariableSpeedPulseLaserWeapon) { int nRange = ae.getPosition().distance(target.getPosition()); int[] nRanges = wtype.getRanges(weapon, ammo); @@ -5243,8 +5243,8 @@ private static ToHitData artilleryDirectToHit(Game game, Entity ae, Targetable t toHit.addModifier(ae.getHeatFiringModifier(), Messages.getString("WeaponAttackAction.Heat")); } // weapon to-hit modifier - if (wtype.getToHitModifier() != 0) { - toHit.addModifier(wtype.getToHitModifier(), Messages.getString("WeaponAttackAction.WeaponMod")); + if (wtype.getToHitModifier(weapon) != 0) { + toHit.addModifier(wtype.getToHitModifier(weapon), Messages.getString("WeaponAttackAction.WeaponMod")); } // ammo to-hit modifier if (usesAmmo && (atype.getToHitModifier() != 0)) { diff --git a/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java b/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java index 68400207472..b58bfd66a4f 100644 --- a/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java +++ b/megamek/src/megamek/common/weapons/lasers/LaserWeapon.java @@ -19,6 +19,7 @@ import megamek.common.Mounted; import megamek.common.ToHitData; import megamek.common.actions.WeaponAttackAction; +import megamek.common.annotations.Nullable; import megamek.common.equipment.MiscMounted; import megamek.common.options.GameOptions; import megamek.common.options.OptionsConstants; @@ -65,6 +66,14 @@ public int getModesCount(Mounted mounted) { } } + @Override + public int getToHitModifier(@Nullable Mounted mounted) { + if ((mounted == null) || !(mounted.getLinkedBy() instanceof MiscMounted) || !mounted.getLinkedBy().getType().hasFlag(MiscType.F_RISC_LASER_PULSE_MODULE)) { + return super.getToHitModifier(mounted); + } + return mounted.curMode().getName().equals("Pulse") ? -2 : 0; + } + @Override protected AttackHandler getCorrectHandler(ToHitData toHit, WeaponAttackAction waa, Game game, TWGameManager manager) { diff --git a/megamek/src/megamek/common/weapons/ppc/PPCWeapon.java b/megamek/src/megamek/common/weapons/ppc/PPCWeapon.java index 72c0d6f4fa6..e2ae8c4bc08 100644 --- a/megamek/src/megamek/common/weapons/ppc/PPCWeapon.java +++ b/megamek/src/megamek/common/weapons/ppc/PPCWeapon.java @@ -73,8 +73,8 @@ public double getBattleForceDamage(int range, Mounted capacitor) { if ((range == AlphaStrikeElement.SHORT_RANGE) && (getMinimumRange() > 0)) { damage = adjustBattleForceDamageForMinRange(damage); } - if (getToHitModifier() != 0) { - damage -= damage * getToHitModifier() * 0.05; + if (getToHitModifier(null) != 0) { + damage -= damage * getToHitModifier(null) * 0.05; } } return damage / 10.0; From fa634f9089243547c30801f12ba99b71349efd11 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 12 Nov 2024 15:01:37 -0600 Subject: [PATCH 31/57] Add extra 2 points of heat when firing laser using pulse module. --- megamek/src/megamek/common/equipment/WeaponMounted.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/megamek/src/megamek/common/equipment/WeaponMounted.java b/megamek/src/megamek/common/equipment/WeaponMounted.java index 48b39f59bd1..390b0e9aaf3 100644 --- a/megamek/src/megamek/common/equipment/WeaponMounted.java +++ b/megamek/src/megamek/common/equipment/WeaponMounted.java @@ -131,6 +131,9 @@ && getLinkedBy().getType().hasFlag( heat++; } } + if (curMode().equals("Pulse")) { + heat += 2; + } return heat; } From 4c3864e31e8e57fda0a75655a3631ffdbced4dc5 Mon Sep 17 00:00:00 2001 From: Coppio Date: Thu, 14 Nov 2024 01:33:17 -0300 Subject: [PATCH 32/57] feat: commands need a second pass for test and eval --- .../i18n/megamek/client/messages.properties | 4 +- .../megamek/client/messages_es.properties | 3 +- .../megamek/client/messages_ru.properties | 3 +- .../megamek/common/report-messages.properties | 3 +- .../client/ui/swing/CommonMenuBar.java | 5 - .../src/megamek/client/ui/swing/MapMenu.java | 144 +++++++++++++---- .../client/ui/swing/MovementDisplay.java | 37 +++-- .../client/ui/swing/boardview/BoardView.java | 37 +++++ .../swing/boardview/TerrainShadowHelper.java | 8 +- .../gmCommands/GamemasterCommandPanel.java | 82 ++++++++++ .../client/ui/swing/minimap/Minimap.java | 3 + .../ui/swing/tileset/TilesetManager.java | 8 + megamek/src/megamek/common/Board.java | 29 +++- megamek/src/megamek/common/Entity.java | 10 ++ megamek/src/megamek/common/Game.java | 28 +++- .../src/megamek/common/SpecialHexDisplay.java | 19 +-- .../common/weapons/AreaEffectHelper.java | 19 ++- .../commands/ChangeOwnershipCommand.java | 67 ++++---- .../server/commands/ChangeWeatherCommand.java | 98 ++++++------ .../server/commands/DisasterCommand.java | 148 +++++++++++++++--- .../server/commands/FirestarterCommand.java | 81 ++++++++++ .../server/commands/FirestormCommand.java | 103 ++++++++++++ .../commands/GamemasterServerCommand.java | 145 +++++++++++++++++ megamek/src/megamek/server/commands/IsGM.java | 13 -- .../megamek/server/commands/KillCommand.java | 52 +++--- .../commands/OrbitalBombardmentCommand.java | 102 +++++------- .../server/commands/RemoveSmokeCommand.java | 36 ++--- .../server/commands/arguments/Argument.java | 22 +++ .../commands/arguments/EnumArgument.java | 44 ++++++ .../commands/arguments/IntegerArgument.java | 63 ++++++++ .../server/props/OrbitalBombardment.java | 10 +- .../server/totalwarfare/TWGameManager.java | 93 ++++++----- 32 files changed, 1149 insertions(+), 370 deletions(-) create mode 100644 megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java create mode 100644 megamek/src/megamek/server/commands/FirestarterCommand.java create mode 100644 megamek/src/megamek/server/commands/FirestormCommand.java create mode 100644 megamek/src/megamek/server/commands/GamemasterServerCommand.java delete mode 100644 megamek/src/megamek/server/commands/IsGM.java create mode 100644 megamek/src/megamek/server/commands/arguments/Argument.java create mode 100644 megamek/src/megamek/server/commands/arguments/EnumArgument.java create mode 100644 megamek/src/megamek/server/commands/arguments/IntegerArgument.java diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 4c96ba383f0..9cc5a513173 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -2693,7 +2693,6 @@ MovementDisplay.moveLowerElevation=Go Down MovementDisplay.BackWardsElevationChange=Moving Backwards over an elevation change.\n MovementDisplay.CarefulStand.title=Careful Stand? MovementDisplay.CarefulStand.message=Do you wish to use careful stand?\n -MovementDisplay.Traitor=Traitor Unit MovementDisplay.NotUpToSpeed=Selected unit cannot run/flank because it has poor performance and is not up to speed MovementDisplay.UpToSpeed=Selected unit is up to speed so it can run/flank MovementDisplay.UnjamRAC.title=Unjam? @@ -4630,6 +4629,9 @@ CMVPanel.font=Font: Gamemaster.Gamemaster=Gamemaster Gamemaster.EditDamage=Edit Damage Gamemaster.Configure=Configure +Gamemaster.Traitor=Traitor Unit +Gamemaster.SpecialCommands=Special Commands +Gamemaster.KillUnit=Kill Unit # Scenario Chooser ScenarioChooser.title=Choose Scenario diff --git a/megamek/i18n/megamek/client/messages_es.properties b/megamek/i18n/megamek/client/messages_es.properties index 086d314aee1..98e1e7aeb78 100644 --- a/megamek/i18n/megamek/client/messages_es.properties +++ b/megamek/i18n/megamek/client/messages_es.properties @@ -2438,7 +2438,6 @@ MovementDisplay.moveLowerElevation=Bajar MovementDisplay.BackWardsElevationChange=Moverse hacia atrás sobre un cambio de elevación.\n MovementDisplay.CarefulStand.title=¿Mantenerse con Precaución? MovementDisplay.CarefulStand.message=¿Desea Mantenerse con Precaución?\n -MovementDisplay.Traitor=Unidad Traidora MovementDisplay.NotUpToSpeed=La unidad seleccionada no puede correr/flanquear porque tiene un rendimiento deficiente y no está al día MovementDisplay.UpToSpeed=La unidad seleccionada está al día para que pueda correr/flanquear MovementDisplay.UnjamRAC.title=¿Destrabar? @@ -4267,3 +4266,5 @@ ForceGeneratorDialog.reinforced=Reforzado\ ForceGeneratorDialog.understrength=Más Débiles\ ForceGeneratorDialog.default=Predeterminado ForceGeneratorDialog.noCrew=Sin tripulación + +Gamemaster.Traitor=Unidad Traidora \ No newline at end of file diff --git a/megamek/i18n/megamek/client/messages_ru.properties b/megamek/i18n/megamek/client/messages_ru.properties index 06812521aca..69f44bd0bed 100644 --- a/megamek/i18n/megamek/client/messages_ru.properties +++ b/megamek/i18n/megamek/client/messages_ru.properties @@ -1373,7 +1373,6 @@ MovementDisplay.moveLowerElevation=Спуститься MovementDisplay.BackWardsElevationChange=Преодоление смены уровня высоты реверсом хода.\n MovementDisplay.CarefulStand.title=Использовать осторожную стойку? MovementDisplay.CarefulStand.message=Хотите ли вы использовать осторожную стойку?\n -MovementDisplay.Traitor=Юнит предатель MovementDisplay.NotUpToSpeed=Выбранный юнит не может бежать/ехать быстро потому что у него плохая форма и он не достигнет скорости MovementDisplay.UpToSpeed=Выбранному юниту хватает скорости и он может бежать/ехать быстро MovementDisplay.UnjamRAC.title=Расклинить? @@ -2258,3 +2257,5 @@ BotConfigDialog.princessHelp.title=Справка по Принцессе SavePrincessDialog.question=Сохранить изменения в эту конфигурацию? SavePrincessDialog.saveTargets=Сохранить список стратегичеких целей? + +Gamemaster.Traitor=Юнит предатель \ No newline at end of file diff --git a/megamek/i18n/megamek/common/report-messages.properties b/megamek/i18n/megamek/common/report-messages.properties index 20be24c6ee5..5bb6ad59327 100755 --- a/megamek/i18n/megamek/common/report-messages.properties +++ b/megamek/i18n/megamek/common/report-messages.properties @@ -56,8 +56,9 @@ 1242=no effect #1300s - Orbital Bombardment related -1300=An orbital bombardment hit hex !!! +1300=Orbital bombardment hit hex !!! 1301=End of orbital bombardment resolution +1302= has commenced an orbital bombardment, it will land at the end of the next weapons phase at hex . # 1500s - ammo handling related 1500= () selected diff --git a/megamek/src/megamek/client/ui/swing/CommonMenuBar.java b/megamek/src/megamek/client/ui/swing/CommonMenuBar.java index a79418fee26..b992fc2d72b 100644 --- a/megamek/src/megamek/client/ui/swing/CommonMenuBar.java +++ b/megamek/src/megamek/client/ui/swing/CommonMenuBar.java @@ -356,11 +356,6 @@ public CommonMenuBar() { toggleCFWarning.setToolTipText(Messages.getString("CommonMenuBar.viewToggleCFWarningToolTip")); toggleCFWarning.setSelected(GUIP.getShowCFWarnings()); - /* - * TODO: moveTraitor = createMenuItem(menu, - * getString("CommonMenuBar.moveTraitor"), MovementDisplay.MOVE_TRAITOR); - */ - // Create the Help menu menu = new JMenu(Messages.getString("CommonMenuBar.HelpMenu")); menu.setMnemonic(VK_H); diff --git a/megamek/src/megamek/client/ui/swing/MapMenu.java b/megamek/src/megamek/client/ui/swing/MapMenu.java index 3fad530711a..743528ea0d2 100644 --- a/megamek/src/megamek/client/ui/swing/MapMenu.java +++ b/megamek/src/megamek/client/ui/swing/MapMenu.java @@ -24,22 +24,14 @@ import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.math.BigInteger; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.StringTokenizer; -import java.util.Vector; - -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import javax.swing.UIManager; +import java.util.*; + +import javax.swing.*; import megamek.client.Client; import megamek.client.event.BoardViewEvent; import megamek.client.ui.Messages; +import megamek.client.ui.swing.gmCommands.GamemasterCommandPanel; import megamek.client.ui.swing.lobby.LobbyUtility; import megamek.common.*; import megamek.common.Building.DemolitionCharge; @@ -54,6 +46,8 @@ import megamek.common.weapons.other.CLFireExtinguisher; import megamek.common.weapons.other.ISFireExtinguisher; import megamek.logging.MMLogger; +import megamek.server.Server; +import megamek.server.commands.*; /** * Context menu for the board. @@ -209,23 +203,6 @@ private boolean createMenu() { } } - - // Traitor Command - JMenuItem item = new JMenuItem(Messages.getString("MovementDisplay.Traitor")); - item.setActionCommand(MovementDisplay.MoveCommand.MOVE_TRAITOR.getCmd()); - item.addActionListener(evt -> { - try { - if (currentPanel instanceof MovementDisplay) { - ((MovementDisplay) currentPanel).actionPerformed(evt); - } - } catch (Exception ex) { - logger.error(ex, ""); - } - }); - - if (game.getPhase().isMovement()) { - add(item); - } } menu = touchOffExplosivesMenu(); @@ -433,10 +410,15 @@ private JMenu createGamemasterMenu() { JMenu dmgMenu = new JMenu(Messages.getString("Gamemaster.EditDamage")); JMenu cfgMenu = new JMenu(Messages.getString("Gamemaster.Configure")); + JMenu traitorMenu = new JMenu(Messages.getString("Gamemaster.Traitor")); + JMenu killMenu = new JMenu(Messages.getString("Gamemaster.KillUnit")); + JMenu specialCommandsMenu = createGMSpecialCommandsMenu(); var entities = client.getGame().getEntitiesVector(coords); for (Entity entity : entities) { dmgMenu.add(createUnitEditorMenuItem(entity)); cfgMenu.add(createCustomMekMenuItem(entity)); + traitorMenu.add(createTraitorMenuItem(entity)); + killMenu.add(createKillMenuItem(entity)); } if (dmgMenu.getItemCount() != 0) { menu.add(dmgMenu); @@ -444,10 +426,41 @@ private JMenu createGamemasterMenu() { if (cfgMenu.getItemCount() != 0) { menu.add(cfgMenu); } + if (traitorMenu.getItemCount() != 0) { + menu.add(traitorMenu); + } + if (killMenu.getItemCount() != 0) { + menu.add(killMenu); + } + menu.add(specialCommandsMenu); return menu; } } + private record Tuple(String name, GamemasterServerCommand command) {} + + private JMenu createGMSpecialCommandsMenu() { + JMenu menu = new JMenu(Messages.getString("Gamemaster.SpecialCommands")); + var commands = List.of( + new Tuple("Kill Unit", new KillCommand(null, null)), + new Tuple("Change Ownership", new ChangeOwnershipCommand(null, null)), + new Tuple("Change Weather", new ChangeWeatherCommand(null, null)), + new Tuple("Disasters", new DisasterCommand(null, null)), + new Tuple("Orbital Bombardment", new OrbitalBombardmentCommand(null, null)), + new Tuple("Remove Smoke", new RemoveSmokeCommand(null, null)), + new Tuple("Firestarter", new FirestarterCommand(null, null)), + new Tuple("Firestorm", new FirestormCommand(null, null)) + ); + + for (var cmd : commands) { + JMenuItem item = new JMenuItem(cmd.name()); + item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd.command()).setVisible(true)); + menu.add(item); + } + + return menu; + } + JMenuItem createCustomMekMenuItem(Entity entity) { JMenuItem item = new JMenuItem(entity.getDisplayName()); item.addActionListener(evt -> { @@ -473,6 +486,79 @@ JMenuItem createUnitEditorMenuItem(Entity entity) { return item; } + private JMenuItem createTraitorMenuItem(Entity en) { + // Traitor Command + JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.Traitor") + " " + en.getDisplayName()); + item.addActionListener(evt -> { + gui.getBoardView().setShouldIgnoreKeys(false); + var players = client.getGame().getPlayersList(); + Integer[] playerIds = new Integer[players.size() - 1]; + String[] playerNames = new String[players.size() - 1]; + String[] options = new String[players.size() - 1]; + + Player currentOwner = en.getOwner(); + // Loop through the players vector and fill in the arrays + int idx = 0; + for (var player : players) { + if (player.getName().equals(currentOwner.getName()) + || (player.getTeam() == Player.TEAM_UNASSIGNED)) { + continue; + } + playerIds[idx] = player.getId(); + playerNames[idx] = player.getName(); + options[idx] = player.getName() + " (ID: " + player.getId() + ")"; + idx++; + } + + // No players available? + if (idx == 0) { + JOptionPane.showMessageDialog(gui.getFrame(), + "No players available. Units cannot be traitored to players " + + "that aren't assigned to a team."); + return; + } + + // Dialog for choosing which player to transfer to + String option = (String) JOptionPane.showInputDialog(gui.getFrame(), + "Choose the player to gain ownership of this unit (" + en.getDisplayName() + ") when it turns traitor", + "Traitor", JOptionPane.QUESTION_MESSAGE, null, + options, options[0]); + + // Verify that we have a valid option... + if (option != null) { + // Now that we've selected a player, correctly associate the ID and name + int id = playerIds[Arrays.asList(options).indexOf(option)]; + String name = playerNames[Arrays.asList(options).indexOf(option)]; + + // And now we perform the actual transfer + int confirm = JOptionPane.showConfirmDialog( + gui.getFrame(), + en.getDisplayName() + " will switch to " + name + + "'s side at the end of this turn. Are you sure?", + "Confirm", + JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION) { + client.sendChat(String.format("/changeOwner %d %d", en.getId(), id)); + } + } + }); + + return item; + } + + private JMenuItem createKillMenuItem(Entity en) { + JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.KillUnit") + " " + en.getDisplayName()); + item.addActionListener(evt -> { + int confirm = JOptionPane.showConfirmDialog( + gui.getFrame(), + "Are you sure you want to kill " + en.getDisplayName() + "?", "Confirm", JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION) { + client.sendChat(String.format("/kill %d", en.getId())); + } + }); + return item; + } + private JMenu createSelectMenu() { JMenu menu = new JMenu("Select"); // add select options diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index 48917c7e149..5251cf355e6 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -19,20 +19,6 @@ */ package megamek.client.ui.swing; -import static megamek.common.MiscType.F_CHAFF_POD; -import static megamek.common.options.OptionsConstants.ADVGRNDMOV_TACOPS_ZIPLINES; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.InputEvent; -import java.awt.event.MouseEvent; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - import megamek.client.event.BoardViewEvent; import megamek.client.ui.Messages; import megamek.client.ui.SharedUtility; @@ -62,6 +48,19 @@ import megamek.common.preference.PreferenceManager; import megamek.logging.MMLogger; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.util.List; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static megamek.common.MiscType.F_CHAFF_POD; +import static megamek.common.options.OptionsConstants.ADVGRNDMOV_TACOPS_ZIPLINES; + public class MovementDisplay extends ActionPhaseDisplay { private static final MMLogger logger = MMLogger.create(MovementDisplay.class); @@ -230,7 +229,7 @@ public String toString() { } public String getHotKeyDesc() { - String result = ""; + String result; String msgNext = Messages.getString("Next"); String msgPrevious = Messages.getString("Previous"); @@ -5308,11 +5307,15 @@ public synchronized void actionPerformed(ActionEvent ev) { String[] playerNames = new String[players.size() - 1]; String[] options = new String[players.size() - 1]; Entity e = ce(); + if (e == null) { + return; + } + Player currentOwner = e.getOwner(); // Loop through the players vector and fill in the arrays int idx = 0; for (var player : players) { - if (player.getName().equals(clientgui.getClient().getLocalPlayer().getName()) + if (player.getName().equals(currentOwner.getName()) || (player.getTeam() == Player.TEAM_UNASSIGNED)) { continue; } @@ -5332,7 +5335,7 @@ public synchronized void actionPerformed(ActionEvent ev) { // Dialog for choosing which player to transfer to String option = (String) JOptionPane.showInputDialog(clientgui.getFrame(), - "Choose the player to gain ownership of this unit when it turns traitor", + "Choose the player to gain ownership of this unit (" + e.getDisplayName() + ") when it turns traitor", "Traitor", JOptionPane.QUESTION_MESSAGE, null, options, options[0]); diff --git a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java index 1a5d79f083a..50c9e923c09 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java +++ b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java @@ -87,6 +87,7 @@ import megamek.common.util.ImageUtil; import megamek.common.util.fileUtils.MegaMekFile; import megamek.logging.MMLogger; +import megamek.server.props.OrbitalBombardment; /** * Displays the board; lets the user scroll around and select points on it. @@ -637,6 +638,7 @@ public void mouseDragged(MouseEvent e) { SpecialHexDisplay.Type.BOMB_HIT.init(); SpecialHexDisplay.Type.BOMB_DRIFT.init(); SpecialHexDisplay.Type.PLAYER_NOTE.init(); + SpecialHexDisplay.Type.ORBITAL_BOMBARDMENT.init(); fovHighlightingAndDarkening = new FovHighlightingAndDarkening(this); @@ -1454,6 +1456,38 @@ private Mounted selectedWeapon() { return (clientgui != null) ? clientgui.getDisplayedWeapon().orElse(null) : null; } + private void drawOrbitalBombardmentHexes(Graphics boardGraphics) { + Image orbitalBombardmentImage = tileManager.getOrbitalBombardmentImage(); + Rectangle view = boardGraphics.getClipBounds(); + boolean justDraw = false; + // Compute the origin of the viewing area + int drawX = (view.x / (int) (HEX_WC * scale)) - 1; + int drawY = (view.y / (int) (HEX_H * scale)) - 1; + + // Compute size of viewing area + int drawWidth = (view.width / (int) (HEX_WC * scale)) + 3; + int drawHeight = (view.height / (int) (HEX_H * scale)) + 3; + + // Draw incoming artillery sprites - requires server to update client's + // view of game + for (Enumeration attacks = game.getOrbitalBombardmentAttacks(); attacks.hasMoreElements();) { + final OrbitalBombardment orbitalBombardment = attacks.nextElement(); + final Coords c = new Coords(orbitalBombardment.getX(), orbitalBombardment.getY()); + // Is the Coord within the viewing area? + boolean insideViewArea = ((c.getX() >= drawX) && (c.getX() <= (drawX + drawWidth)) + && (c.getY() >= drawY) && (c.getY() <= (drawY + drawHeight))); + if (insideViewArea) { + Point p = getHexLocation(c); + boardGraphics.drawImage(getScaledImage(orbitalBombardmentImage, true), p.x, p.y, boardPanel); + for (Coords c2 : c.allAtDistanceOrLess(orbitalBombardment.getRadius())) { + Point p2 = getHexLocation(c2); + boardGraphics.drawImage(getScaledImage(orbitalBombardmentImage, true), p2.x, p2.y, boardPanel); + } + } + + } + } + /** * Display artillery modifier in pretargeted hexes */ @@ -1639,6 +1673,9 @@ public BufferedImage getEntireBoardImage(boolean ignoreUnits, boolean useBaseZoo // Artillery targets drawArtilleryHexes(boardGraph); + // draw Orbital Bombardment targets; + drawOrbitalBombardmentHexes(boardGraph); + // draw highlight border drawSprite(boardGraph, highlightSprite); diff --git a/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java b/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java index 9b04715eb81..2de4ebb2d26 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java +++ b/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java @@ -185,9 +185,11 @@ BufferedImage updateShadowMap() { surrounded = false; } else { Hex nhex = board.getHex(c.translated(dir)); - int lv = nhex.getLevel(); - if (lv < level) { - surrounded = false; + if (nhex != null) { + int lv = nhex.getLevel(); + if (lv < level) { + surrounded = false; + } } } } diff --git a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java new file mode 100644 index 00000000000..f85f1b7b55d --- /dev/null +++ b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java @@ -0,0 +1,82 @@ +package megamek.client.ui.swing.gmCommands; + +import megamek.client.IClient; +import megamek.client.ui.swing.ClientGUI; +import megamek.server.commands.GamemasterServerCommand; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.EnumArgument; +import megamek.server.commands.arguments.IntegerArgument; + +import javax.swing.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +// JPanel wrapper for game master commands +public class GamemasterCommandPanel extends JDialog { + private final GamemasterServerCommand command; + private final ClientGUI client; + + public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerCommand command) { + super(parent, command.getName(), true); + this.command = command; + this.client = client; + setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); + + JLabel helpLabel = new JLabel(command.getHelp()); + add(helpLabel); + + List> arguments = command.defineArguments(); + Map argumentComponents = new HashMap<>(); + + for (Argument argument : arguments) { + JLabel label = new JLabel(argument.getName() + ":"); + add(label); + + if (argument instanceof IntegerArgument intArg) { + JSpinner spinner = new JSpinner(new SpinnerNumberModel( + intArg.hasDefaultValue() ? intArg.getValue() : 0, + intArg.getMinValue(), + intArg.getMaxValue(), + 1)); + add(spinner); + argumentComponents.put(argument.getName(), spinner); + } else if (argument instanceof EnumArgument enumArg) { + JComboBox comboBox = new JComboBox<>(); + for (Enum constant : enumArg.getEnumType().getEnumConstants()) { + comboBox.addItem(constant.name()); + } + if (enumArg.getValue() != null) { + comboBox.setSelectedItem(enumArg.getValue().name()); + } + add(comboBox); + argumentComponents.put(argument.getName(), comboBox); + } + } + + JButton executeButton = new JButton("Execute Command"); + executeButton.addActionListener(e -> executeCommand(argumentComponents)); + add(executeButton); + + pack(); + setLocationRelativeTo(parent); + } + + private void executeCommand(Map argumentComponents) { + List> arguments = command.defineArguments(); + String[] args = new String[arguments.size()]; + + for (int i = 0; i < arguments.size(); i++) { + Argument argument = arguments.get(i); + JComponent component = argumentComponents.get(argument.getName()); + + if (component instanceof JSpinner) { + args[i] = argument.getName() + "=" + ((JSpinner) component).getValue().toString(); + } else if (component instanceof JComboBox) { + args[i] = argument.getName() + "=" + Objects.requireNonNull(((JComboBox) component).getSelectedItem()); + } + } + client.getClient().sendChat("/" + command.getName() + " " + String.join(" ", args)); + } +} diff --git a/megamek/src/megamek/client/ui/swing/minimap/Minimap.java b/megamek/src/megamek/client/ui/swing/minimap/Minimap.java index 7aa0f11da92..10df3f5a6ba 100644 --- a/megamek/src/megamek/client/ui/swing/minimap/Minimap.java +++ b/megamek/src/megamek/client/ui/swing/minimap/Minimap.java @@ -536,6 +536,9 @@ private void drawMap(boolean forceDraw) { for (int j = 0; j < board.getWidth(); j++) { for (int k = 0; k < board.getHeight(); k++) { Hex h = board.getHex(j, k); + if (h == null) { + continue; + } if (dirtyMap || dirty[j / 10][k / 10]) { gg.setColor(terrainColor(h)); if (h.containsTerrain(SPACE)) { diff --git a/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java b/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java index b051ee2b2e9..1a3ec4ff91e 100644 --- a/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java +++ b/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java @@ -77,6 +77,8 @@ public class TilesetManager implements IPreferenceChangeListener { private static final String FILENAME_ARTILLERY_ADJUSTED_IMAGE = "artyadj.gif"; private static final String FILENAME_ARTILLERY_INCOMING_IMAGE = "artyinc.gif"; + private static final String FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE = "obinc.gif"; + public static final int ARTILLERY_AUTOHIT = 0; public static final int ARTILLERY_ADJUSTED = 1; public static final int ARTILLERY_INCOMING = 2; @@ -106,6 +108,7 @@ public class TilesetManager implements IPreferenceChangeListener { private Image artilleryAutohit; private Image artilleryAdjusted; private Image artilleryIncoming; + private Image orbitalBombardmentIncoming; /** * Hexes under the effects of ECM have a shaded "static" image displayed, @@ -414,6 +417,10 @@ public Image getEcmStaticImage(Color tint) { return image; } + public Image getOrbitalBombardmentImage() { + return orbitalBombardmentIncoming; + } + public Image getArtilleryTarget(int which) { switch (which) { case ARTILLERY_AUTOHIT: @@ -486,6 +493,7 @@ public void loadNeededImages(Game game) { artilleryAutohit = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ARTILLERY_AUTOHIT_IMAGE); artilleryAdjusted = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ARTILLERY_ADJUSTED_IMAGE); artilleryIncoming = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ARTILLERY_INCOMING_IMAGE); + orbitalBombardmentIncoming = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE); started = true; } diff --git a/megamek/src/megamek/common/Board.java b/megamek/src/megamek/common/Board.java index 66bd8facb55..f3bdc36db1f 100644 --- a/megamek/src/megamek/common/Board.java +++ b/megamek/src/megamek/common/Board.java @@ -21,11 +21,7 @@ package megamek.common; import static java.util.stream.Collectors.toList; -import static megamek.common.SpecialHexDisplay.Type.ARTILLERY_DRIFT; -import static megamek.common.SpecialHexDisplay.Type.ARTILLERY_MISS; -import static megamek.common.SpecialHexDisplay.Type.BOMB_DRIFT; -import static megamek.common.SpecialHexDisplay.Type.BOMB_HIT; -import static megamek.common.SpecialHexDisplay.Type.BOMB_MISS; +import static megamek.common.SpecialHexDisplay.Type.*; import java.io.*; import java.util.*; @@ -1752,7 +1748,7 @@ public Hashtable> getSpecialHexDisplayTabl public void setSpecialHexDisplayTable(Hashtable> shd) { Hashtable> temp = new Hashtable<>(); - // Grab all current ARTILLERY_MISS instances + // Grab all current ARTILLERY_MISS and ARTILLERY_DRIFT instances for (Map.Entry> e : specialHexes.entrySet()) { for (SpecialHexDisplay special : e.getValue()) { if (Set.of(ARTILLERY_MISS, ARTILLERY_DRIFT).contains(special.getType())) { @@ -2087,4 +2083,25 @@ public static int decodeCustomDeploymentZoneID(int zoneID) { public static int encodeCustomDeploymentZoneID(int zoneID) { return zoneID + NUM_ZONES_X2; } + + public void clearOrbitalBombardmentIcons() { + for (Coords coords : specialHexes.keySet()) { + removeOrbitalBombardmentIcons(coords); + } + } + + public void removeOrbitalBombardmentIcons(Coords coords) { + // Do nothing if the coords aren't on this board. + if (!this.contains(coords) || null == specialHexes.get(coords)) { + return; + } + + // Use iterator so we can remove while traversing + for (Iterator iterator = specialHexes.get(coords).iterator(); iterator.hasNext();) { + SpecialHexDisplay shd = iterator.next(); + if (ORBITAL_BOMBARDMENT.equals(shd.getType())) { + iterator.remove(); + } + } + } } diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java index 469a6c4aa48..38cc816bf1f 100644 --- a/megamek/src/megamek/common/Entity.java +++ b/megamek/src/megamek/common/Entity.java @@ -4792,6 +4792,16 @@ public List getCriticalSlots(int location) { return result; } + public boolean hasUndamagedCriticalSlots() { + return IntStream.range(0, locations()) + .mapToLong(i -> getCriticalSlots(i) + .stream() + .filter(Objects::nonNull) + .filter(CriticalSlot::isHittable) + .count() + ).sum() > 0; + } + /** * @return True when this unit has a RISC Super-Cooled Myomer System (even if * the SCM is destroyed). diff --git a/megamek/src/megamek/common/Game.java b/megamek/src/megamek/common/Game.java index cd106d57c9d..55f5ea13373 100644 --- a/megamek/src/megamek/common/Game.java +++ b/megamek/src/megamek/common/Game.java @@ -15,12 +15,6 @@ */ package megamek.common; -import static java.util.stream.Collectors.toList; - -import java.io.Serializable; -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; - import megamek.MMConstants; import megamek.Version; import megamek.client.bot.princess.BehaviorSettings; @@ -39,9 +33,16 @@ import megamek.common.weapons.AttackHandler; import megamek.logging.MMLogger; import megamek.server.SmokeCloud; +import megamek.server.props.OrbitalBombardment; import megamek.server.victory.VictoryHelper; import megamek.server.victory.VictoryResult; +import java.io.Serializable; +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; + +import static java.util.stream.Collectors.toList; + /** * The game class is the root of all data about the game in progress. Both the * Client and the Server should have one of these objects, and it is their job @@ -113,7 +114,7 @@ public final class Game extends AbstractGame implements Serializable, PlanetaryC private Vector vibrabombs = new Vector<>(); private Vector attacks = new Vector<>(); private Vector offboardArtilleryAttacks = new Vector<>(); - + private Vector orbitalBombardmentAttacks = new Vector(); private int lastEntityId; private Vector tagInfoForTurn = new Vector<>(); @@ -2202,6 +2203,19 @@ public int removeSpecificEntityTurnsFor(Entity entity) { return turnsToRemove.size(); } + public void setOrbitalBombardmentVector(Vector v) { + orbitalBombardmentAttacks = v; + processGameEvent(new GameBoardChangeEvent(this)); + } + + public void resetOrbitalBombardmentAttacks() { + orbitalBombardmentAttacks.removeAllElements(); + } + + public Enumeration getOrbitalBombardmentAttacks() { + return orbitalBombardmentAttacks.elements(); + } + public void setArtilleryVector(Vector v) { offboardArtilleryAttacks = v; processGameEvent(new GameBoardChangeEvent(this)); diff --git a/megamek/src/megamek/common/SpecialHexDisplay.java b/megamek/src/megamek/common/SpecialHexDisplay.java index 170966e71dd..2fb11e1cac3 100644 --- a/megamek/src/megamek/common/SpecialHexDisplay.java +++ b/megamek/src/megamek/common/SpecialHexDisplay.java @@ -96,16 +96,12 @@ public boolean drawBefore() { } }, PLAYER_NOTE(new MegaMekFile(Configuration.hexesDir(), "note.png").toString()) { - @Override - public boolean drawBefore() { - return true; - } - @Override public boolean drawAfter() { return true; } - }; + }, + ORBITAL_BOMBARDMENT(new MegaMekFile(Configuration.hexesDir(), "obinc.gif").toString()); private transient Image defaultImage; private final String defaultImagePath; @@ -250,16 +246,17 @@ public int getObscuredLevel() { * @return */ public boolean isObscured(Player other) { + if (owner == null) { + return false; + } if ((obscured == SHD_OBSCURED_OWNER) && owner.equals(other)) { return false; } else if ((obscured == SHD_OBSCURED_TEAM) && (other != null) && (owner.getTeam() == other.getTeam())) { return false; - } else if (obscured == SHD_OBSCURED_ALL) { - return false; - } else { - return true; } + + return obscured != SHD_OBSCURED_ALL; } public void setObscured(int obscured) { @@ -272,7 +269,7 @@ public void setObscured(int obscured) { * display * in the appropriate phase. Other bomb- or artillery-related graphics are * optional. - * + * * @param phase * @param curRound * @param playerChecking diff --git a/megamek/src/megamek/common/weapons/AreaEffectHelper.java b/megamek/src/megamek/common/weapons/AreaEffectHelper.java index b9a4e04ca5d..32ea8900b05 100644 --- a/megamek/src/megamek/common/weapons/AreaEffectHelper.java +++ b/megamek/src/megamek/common/weapons/AreaEffectHelper.java @@ -13,19 +13,16 @@ */ package megamek.common.weapons; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Vector; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.IntStream; import megamek.common.*; import megamek.common.planetaryconditions.Atmosphere; import megamek.common.planetaryconditions.PlanetaryConditions; import megamek.logging.MMLogger; import megamek.server.totalwarfare.TWGameManager; +import org.apache.commons.lang3.IntegerRange; /** * Class containing functionality that helps out with area effect weapons. @@ -805,6 +802,14 @@ public static void applyExplosionClusterDamageToEntity(Entity entity, int damage HitData hit = entity.rollHitLocation(table, Compute.targetSideTable(position, entity)); vDesc.addAll(gameManager.damageEntity(entity, hit, cluster, false, DamageType.IGNORE_PASSENGER, false, true)); + + // If there is nothing left to destroy in the unit + if ( + entity.isDoomed() + && (!entity.hasUndamagedCriticalSlots() || entity.getRemovalCondition() == IEntityRemovalConditions.REMOVE_DEVASTATED) + ) { + break; + } damage -= cluster; } } diff --git a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java index d50836c22e2..d9ca02e4e9f 100644 --- a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java +++ b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java @@ -21,59 +21,54 @@ import megamek.common.Entity; import megamek.common.Player; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + /** * The Server Command "/changeOwner" that will switch an entity's owner to another player. * * @author Luana Scoppio */ -public class ChangeOwnershipCommand extends ServerCommand implements IsGM { - - private final TWGameManager gameManager; +public class ChangeOwnershipCommand extends GamemasterServerCommand { public ChangeOwnershipCommand(Server server, TWGameManager gameManager) { super(server, + gameManager, "changeOwner", "Switches ownership of a player's entity to another player during the end phase. " - + "Usage: /changeOwner " - + "The following is an example of changing unit ID 7 to player ID 2: /changeOwner 7 2 "); - this.gameManager = gameManager; + + "Usage: /changeOwner " + + "The following is an example of changing unit ID 7 to player ID 2: /changeOwner 7 2 "); } - /** - * Run this command with the arguments supplied - * - * @see ServerCommand#run(int, String[]) - */ @Override - public void run(int connId, String[] args) { - try { - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - int eid = Integer.parseInt(args[1]); - Entity ent = gameManager.getGame().getEntity(eid); - int pid = Integer.parseInt(args[2]); - Player player = server.getGame().getPlayer(pid); - if (null == ent) { - server.sendServerChat(connId, "No such entity."); - } else if (null == player) { - server.sendServerChat(connId, "No such player."); - } else if (player.getTeam() == Player.TEAM_UNASSIGNED) { - server.sendServerChat(connId, "Player must be assigned a team."); - } else { - server.sendServerChat(connId, ent.getDisplayName() + " will switch to " + player.getName() + "'s side at the end of this turn."); - ent.setTraitorId(pid); - } - } catch (NumberFormatException ignored) { - } + public List> defineArguments() { + List> arguments = new ArrayList<>(); + arguments.add(new IntegerArgument("unitID", 0, Integer.MAX_VALUE)); + arguments.add(new IntegerArgument("playerID", 0, Integer.MAX_VALUE)); + return arguments; } @Override - public TWGameManager getGameManager() { - return gameManager; + protected void runAsGM(int connId, Map> args) { + IntegerArgument unitID = (IntegerArgument) args.get("unitID"); + IntegerArgument playerID = (IntegerArgument) args.get("playerID"); + + Entity ent = gameManager.getGame().getEntity(unitID.getValue()); + Player player = server.getGame().getPlayer(playerID.getValue()); + if (null == ent) { + server.sendServerChat(connId, "No such entity."); + } else if (null == player) { + server.sendServerChat(connId, "No such player."); + } else if (player.getTeam() == Player.TEAM_UNASSIGNED) { + server.sendServerChat(connId, "Player must be assigned a team."); + } else { + server.sendServerChat(connId, ent.getDisplayName() + " will switch to " + player.getName() + "'s side at the end of this turn."); + ent.setTraitorId(player.getId()); + } } } diff --git a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java index 1e75fd97e2d..3ff818d1c1d 100644 --- a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java +++ b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java @@ -20,9 +20,13 @@ import megamek.common.planetaryconditions.*; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; @@ -31,9 +35,7 @@ /** * @author Luana Scoppio */ -public class ChangeWeatherCommand extends ServerCommand { - - private final TWGameManager gameManager; +public class ChangeWeatherCommand extends GamemasterServerCommand { private static final String HELP_TEXT = "GM changes (weather) planetary conditions. The parameters are optional and unordered " + "and the effects are applied at the beginning of the next turn. The square brackets means that argument is optional. " + @@ -44,19 +46,30 @@ public class ChangeWeatherCommand extends ServerCommand { "winddir= 0: south, 1: southwest, 2: northwest, 3: north, 4: northeast, 5: southeast, 6: random " + "atmo= 0: vacuum, 1: trace, 2: thin, 3: standard, 4: high, 5: very high " + "blowsand= 0: no, 1: yes " + + "emi= 0: no, 1: yes " + "weather= 0: clear, 1: light rain, 2: moderate rain, 3: heavy rain, 4: gusting rain, 5: downpour, 6: light snow " + "7: moderate snow, 8: snow flurries, 9: heavy snow, 10: sleet, 11: ice storm, 12: light hail, 13: heavy hail " + "14: lightning storm"; /** Creates new ChangeWeatherCommand */ public ChangeWeatherCommand(Server server, TWGameManager gameManager) { - super(server, "weather", HELP_TEXT); - this.gameManager = gameManager; + super(server, gameManager, "weather", HELP_TEXT); + } + + public List> defineArguments() { + List> arguments = new ArrayList<>(); + arguments.add(new IntegerArgument("fog", 0, 2)); + arguments.add(new IntegerArgument("light", 0, 6)); + arguments.add(new IntegerArgument("wind", 0, 6)); + arguments.add(new IntegerArgument("atmo", 0, 5)); + arguments.add(new IntegerArgument("blowsand", 0, 1)); + arguments.add(new IntegerArgument("emi", 0, 1)); + arguments.add(new IntegerArgument("weather", 0, 14)); + return arguments; } - private void updatePlanetaryCondition(String arg, String prefix, int connId, int maxLength, Consumer setter, + private void updatePlanetaryCondition(int value, int connId, int maxLength, Consumer setter, Function successMessage, Function errorMessage) { - var value = Integer.parseInt(arg.substring(prefix.length())); if (value >= 0 && value < maxLength) { setter.accept(value); server.sendServerChat(connId, successMessage.apply(value)); @@ -65,50 +78,47 @@ private void updatePlanetaryCondition(String arg, String prefix, int connId, int } } + private record Condition(int maxLength, Consumer setter, Function successMessage, Function errorMessage) {} /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { - if (!server.getPlayer(connId).getGameMaster()) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - var planetaryConditions = gameManager.getGame().getPlanetaryConditions(); + public void runAsGM(int connId, Map> args) { + var planetaryConditions = getGameManager().getGame().getPlanetaryConditions(); - if (args.length > 1) { + Map conditions = Map.of( + "fog", new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), + value -> "The fog has changed.", maxLength -> "Invalid fog value. Must be between 0 and " + (maxLength - 1)), + "wind", new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), + value -> "The wind strength has changed.", maxLength -> "Invalid wind value. Must be between 0 and " + (maxLength - 1)), + "winddir", new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), + value -> "The wind direction has changed.", maxLength -> "Invalid wind direction value. Must be between 0 and " + (maxLength - 1)), + "light", new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), + value -> "The light has changed.", maxLength -> "Invalid light value. Must be between 0 and " + (maxLength - 1)), + "atmo", new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), + value -> value == 0 ? "The air has vanished, put your vac suits!" : "The air is changing.", maxLength -> "Invalid atmosphere value. Must be between 0 and " + (maxLength - 1)), + "blowsand", new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), + value -> value == 1 ? "Sand started blowing." : "The sand has settled.", maxLength -> "Invalid blowsand value. Must be between 0 and " + (maxLength - 1)), + "weather", new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), + value -> "The weather has changed.", maxLength -> "Invalid weather value. Must be between 0 and " + (maxLength - 1)), + "emi", new Condition(EMI.values().length, value -> planetaryConditions.setEMI(EMI.values()[value]), + value -> value == 1 ? "EMI is active." : "EMI is inactive.", maxLength -> "Invalid EMI value. Must be between 0 and " + (maxLength - 1)) + ); + conditions.forEach((prefix, condition) -> { + if (args.containsKey(prefix)) { + updatePlanetaryCondition( + (int) args.get(prefix).getValue(), + connId, + condition.maxLength, + condition.setter, + condition.successMessage, + condition.errorMessage); + } + }); - Map conditions = Map.of( - "fog=", new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), - value -> "The fog has changed.", maxLength -> "Invalid fog value. Must be between 0 and " + (maxLength - 1)), - "wind=", new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), - value -> "The wind strength has changed.", maxLength -> "Invalid wind value. Must be between 0 and " + (maxLength - 1)), - "winddir=", new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), - value -> "The wind direction has changed.", maxLength -> "Invalid wind direction value. Must be between 0 and " + (maxLength - 1)), - "light=", new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), - value -> "The light has changed.", maxLength -> "Invalid light value. Must be between 0 and " + (maxLength - 1)), - "atmo=", new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), - value -> value == 0 ? "The air has vanished, put your vac suits!" : "The air is changing.", maxLength -> "Invalid atmosphere value. Must be between 0 and " + (maxLength - 1)), - "blowsand=", new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), - value -> value == 1 ? "Sand started blowing." : "The sand has settled.", maxLength -> "Invalid blowsand value. Must be between 0 and " + (maxLength - 1)), - "weather=", new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), - value -> "The weather has changed.", maxLength -> "Invalid weather value. Must be between 0 and " + (maxLength - 1)) - ); - - Stream.of(args) - .forEach(arg -> conditions.forEach((prefix, condition) -> { - if (arg.startsWith(prefix)) { - updatePlanetaryCondition(arg, prefix, connId, condition.maxLength, condition.setter, condition.successMessage, condition.errorMessage); - } - })); - - gameManager.getGame().setPlanetaryConditions(planetaryConditions); - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "weather command failed. " + HELP_TEXT); - } + getGameManager().getGame().setPlanetaryConditions(planetaryConditions); } + } diff --git a/megamek/src/megamek/server/commands/DisasterCommand.java b/megamek/src/megamek/server/commands/DisasterCommand.java index 0a7137cd88b..f3fc13e354d 100644 --- a/megamek/src/megamek/server/commands/DisasterCommand.java +++ b/megamek/src/megamek/server/commands/DisasterCommand.java @@ -18,45 +18,149 @@ */ package megamek.server.commands; +import megamek.common.Coords; +import megamek.logging.MMLogger; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.EnumArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.List; +import java.util.Map; +import java.util.Objects; + /** * @author Luana Scoppio */ -public class DisasterCommand extends ServerCommand { +public class DisasterCommand extends GamemasterServerCommand { - private final TWGameManager gameManager; + enum Disaster { + RANDOM, + HURRICANE, + LIGHTNING_STORM, + ORBITAL_BOMBARDMENT, + ORBITAL_BOMBARDMENT_2, + ORBITAL_BOMBARDMENT_3, + SANDSTORM, + HAILSTORM, + ECLIPSE, + SOLAR_FLARE, + SUPERNOVA, + SMOG, + FIRESTORM, + TRAITOR; + + public static Disaster getRandomDisaster() { + return values()[(int) (Math.random() * values().length)]; + } + } - /** Creates new DisasterCommand */ public DisasterCommand(Server server, TWGameManager gameManager) { - super(server, "disaster", "GM calls a disaster at random, arguments in square brackets are optional. Usage: /disaster [type] " + + super(server, gameManager, "gomorrah", "GM calls a disaster, arguments in square brackets are optional. " + + "Usage: /gomorrah [type] " + "if not type is passed, one is chosen at random. " + - "type= 0: hurricane, 1: lightning storm, 2: meteor shower, 3: orbital bombardment, 4: wildfire, 5: sandstorm, 6: hailstorm, " + - "7: heatwave"); - this.gameManager = gameManager; + "Type can be one of the following: hurricane, lightning, ob, ob2, ob3, sandstorm, hailstorm, eclipse, solarflare, " + + "supernova, smog, firestorm, traitor. " + + "The type ob, ob2 and ob3 are orbital bombardment with one, two or three random hit locations, at default values " + + "for damage (100) and radius (4)."); + } + + @Override + public List> defineArguments() { + return List.of(new EnumArgument<>("type", Disaster.class, Disaster.RANDOM)); + } + + private void runDisasterCommand(int connId, Disaster disaster) { + switch (disaster) { + case HURRICANE: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "wind=6", "winddir=6"}); + server.sendServerChat("Hurricane incoming!"); + break; + case LIGHTNING_STORM: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "weather=14"}); + server.sendServerChat("Lightning storm incoming!"); + break; + case ECLIPSE: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "light=4"}); + server.sendServerChat("The sun is being eclipsed..."); + break; + case SOLAR_FLARE: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "light=5", "emi=1"}); + new FirestormCommand(server, gameManager).run(connId, new String[]{"firestorm", "1", "5"}); + server.sendServerChat("Sensors warn of an imminent solar flare incoming! Expect some fires."); + break; + case SUPERNOVA: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "light=5", "emi=1", "atmo=2", "wind=0", "weather=0"}); + new FirestormCommand(server, gameManager).run(connId, new String[]{"firestorm", "2", "75"}); + server.sendServerChat("The star is going supernova!"); + server.sendServerChat("Everything is on fire! We are doomed!"); + break; + case ORBITAL_BOMBARDMENT_3: + orbitalBombardment(connId); + case ORBITAL_BOMBARDMENT_2: + orbitalBombardment(connId); + case ORBITAL_BOMBARDMENT: + orbitalBombardment(connId); + break; + case SANDSTORM: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "blowsand=1", "wind=4", "winddir=6"}); + server.sendServerChat("A sandstorm is approaching!"); + break; + case HAILSTORM: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "weather=13", "wind=4", "winddir=6"}); + server.sendServerChat("A hailstorm is incoming!"); + break; + case FIRESTORM: + new FirestormCommand(server, gameManager).run(connId, new String[]{"firestorm", "2", "50"}); + server.sendServerChat("A firestorm is consuming the battlefield!"); + break; + case SMOG: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "atmo=5", "fog=2", "light=1"}); + server.sendServerChat("A thick smog is covering the battlefield!"); + break; + case TRAITOR: + default: + { + var players = gameManager.getGame().getPlayersList(); + var randomPlayer = players.get((int) (Math.random() * players.size())); + + var units = gameManager.getGame().getPlayerEntities(randomPlayer, true); + var randomUnit = units.get((int) (Math.random() * units.size())); + + var otherPlayers = players.stream().filter(p -> p != randomPlayer).toList(); + var newOwner = otherPlayers.get((int) (Math.random() * otherPlayers.size())); + + new ChangeOwnershipCommand(server, gameManager).run(connId, + new String[]{"traitor", "" + randomUnit.getId(), "" + newOwner.getId()}); + server.sendServerChat("A traitor has been revealed!"); + } + } + } + + private Coords getRandomHexCoords() { + var board = gameManager.getGame().getBoard(); + var x = (int) (Math.random() * board.getWidth()); + var y = (int) (Math.random() * board.getHeight()); + return new Coords(x, y); + } + + private void orbitalBombardment(int connId) { + var coords = getRandomHexCoords(); + new OrbitalBombardmentCommand(server, gameManager).run(connId, new String[]{"ob", + coords.getX() + 1 + "", + coords.getY() + 1 + "" + }); } /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { - if (!server.getPlayer(connId).getGameMaster()) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - // Check argument integrity. - if (args.length == 1) { - // Check command - // NOT IMPLEMENTED - server.sendServerChat(connId, "Oh no..."); - } else if (args.length == 2) { - // Error out; it's not a valid call. - server.sendServerChat(connId, "Oh no..."); + protected void runAsGM(int connId, Map> args) { + if (args.get("type").getValue().equals(Disaster.RANDOM)) { + runDisasterCommand(connId, Disaster.getRandomDisaster()); } else { - server.sendServerChat(connId, "disaster command failed (1)."); + runDisasterCommand(connId, (Disaster) args.get("type").getValue()); } } } diff --git a/megamek/src/megamek/server/commands/FirestarterCommand.java b/megamek/src/megamek/server/commands/FirestarterCommand.java new file mode 100644 index 00000000000..8e4fece3254 --- /dev/null +++ b/megamek/src/megamek/server/commands/FirestarterCommand.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.Coords; +import megamek.common.Hex; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * The Server Command "/firestarter" that will put one hex on fire. + * + * @author Luana Scoppio + */ +public class FirestarterCommand extends GamemasterServerCommand { + + public FirestarterCommand(Server server, TWGameManager gameManager) { + super(server, + gameManager, + "firestarter", + "Starts fire in one specific hex at a specific intensity. " + + "Usage: /firestarter [] " + + "The intensity can be 1=Norma, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV, default is 1."); + } + + + @Override + public List> defineArguments() { + return List.of( + new IntegerArgument("x"), + new IntegerArgument("y"), + new IntegerArgument("intensity", 1, 4, 1)); + } + + /** + * Run this command with the arguments supplied + * + * @see ServerCommand#run(int, String[]) + */ + @Override + protected void runAsGM(int connId, Map> args) { + int xArg = (int) args.get("x").getValue() - 1; + int yArg = (int) args.get("y").getValue() -1; + int fireType = (int) args.get("intensity").getValue(); + + igniteHex(new Coords(xArg, yArg), fireType); + } + + private void igniteHex(Coords coords, int fireType) { + try { + Hex hex = gameManager.getGame().getBoard().getHex(coords); + Objects.requireNonNull(hex, "Hex not found."); + gameManager.ignite(coords, fireType, gameManager.getvPhaseReport()); + } catch (Exception e) { + throw new IllegalArgumentException("Failed to ignite hex: " + e.getMessage()); + } + } + +} diff --git a/megamek/src/megamek/server/commands/FirestormCommand.java b/megamek/src/megamek/server/commands/FirestormCommand.java new file mode 100644 index 00000000000..03d2e03d961 --- /dev/null +++ b/megamek/src/megamek/server/commands/FirestormCommand.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.Coords; +import megamek.common.Hex; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +/** + * The Server Command "/firestorm" that starts a blazing inferno on the board. + * + * @author Luana Scoppio + */ +public class FirestormCommand extends GamemasterServerCommand { + + public FirestormCommand(Server server, TWGameManager gameManager) { + super(server, + gameManager, + "firestorm", + "Starts fire in the entire board. " + + "Usage: /firestorm [] []" + + "The intensity can be 1=Normal, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV, default is 1. " + + "The size can be a percent of the board, from 1 to 100, default is 25."); + } + + @Override + public List> defineArguments() { + return List.of(new IntegerArgument("intensity", 1, 4, 1), + new IntegerArgument("percent", 1, 100, 25)); + } + + /** + * Run this command with the arguments supplied + * + * @see ServerCommand#run(int, String[]) + */ + @Override + protected void runAsGM(int connId, Map> args) { + try { + var fireType = (int) args.get("intensity").getValue(); + var percent = (int) args.get("percent").getValue(); + var coords = getRandomCoords(numberOfCoordsFromPercent(percent)); + coords.forEach(c -> igniteHex(c, fireType)); + } catch (Exception e) { + logger.error("Failed to ignite fire.", e); + server.sendServerChat(connId, "Failed to ignite fire."); + } + } + + private int numberOfCoordsFromPercent(int percent) { + var boardHeight = gameManager.getGame().getBoard().getHeight(); + var boardWidth = gameManager.getGame().getBoard().getWidth(); + return Math.max((boardWidth * boardHeight * percent / 100), 1); + } + + private HashSet getRandomCoords(int size) { + var boardHeight = gameManager.getGame().getBoard().getHeight(); + var boardWidth = gameManager.getGame().getBoard().getWidth(); + var coordsSet = new HashSet(); + var maxTries = size * 10; + while (coordsSet.size() < size && maxTries > 0) { + var x = (int) (Math.random() * boardWidth); + var y = (int) (Math.random() * boardHeight); + coordsSet.add(new Coords(x, y)); + maxTries--; + } + + return coordsSet; + } + + private void igniteHex(Coords coords, int fireType) { + Hex hex = gameManager.getGame().getBoard().getHex(coords); + if (null == hex) { + // Just ignore null hexes... they should not happen, but I don't want to crash the command + return; + } + gameManager.ignite(coords, fireType, gameManager.getvPhaseReport()); + } +} diff --git a/megamek/src/megamek/server/commands/GamemasterServerCommand.java b/megamek/src/megamek/server/commands/GamemasterServerCommand.java new file mode 100644 index 00000000000..2c56403cc29 --- /dev/null +++ b/megamek/src/megamek/server/commands/GamemasterServerCommand.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.logging.MMLogger; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.*; + +/** + * A ServerCommand that can only be used by Game Masters + * + * @author Luana Coppio + */ +public abstract class GamemasterServerCommand extends ServerCommand { + + private static final String EMPTY_ARGUMENT = null; + protected final TWGameManager gameManager; + protected final static MMLogger logger = MMLogger.create(GamemasterServerCommand.class); + private final String errorMsg; + /** + * Creates new ServerCommand that can only be used by Game Masters + * + * @param server instance of the server + * @param gameManager instance of the game manager + * @param name the name of the command + * @param helpText the help text for the command + */ + public GamemasterServerCommand(Server server, TWGameManager gameManager, String name, String helpText) { + super(server, name, helpText); + this.gameManager = gameManager; + this.errorMsg = "Error executing command: " + name; + } + + private boolean isGM(int connId) { + return server.getGameManager().getGame().getPlayer(connId).getGameMaster(); + } + + protected TWGameManager getGameManager() { + return gameManager; + } + + @Override + public void run(int connId, String[] args) { + if (!isGM(connId)) { + server.sendServerChat(connId, "This command can only be used by a game master."); + return; + } + + try { + Map> parsedArguments = parseArguments(args); + runAsGM(connId, parsedArguments); + } catch (IllegalArgumentException e) { + server.sendServerChat(connId, "Invalid arguments: " + e.getMessage() + "\nUsage: " + this.getHelp()); + } catch (Exception e) { + server.sendServerChat(connId, "An error occurred while executing the command. Check the log for more information"); + logger.error(errorMsg, e); + } + } + + // Method to parse arguments, to be implemented by the specific command class + public abstract List> defineArguments(); + + + // Parses the arguments using the definition + private Map> parseArguments(String[] args) { + List> argumentDefinitions = defineArguments(); + Map> parsedArguments = new HashMap<>(); + List positionalArguments = new ArrayList<>(); + + // Map argument names to definitions for easy lookup + Map> argumentMap = new HashMap<>(); + for (Argument argument : argumentDefinitions) { + argumentMap.put(argument.getName(), argument); + } + + // Separate positional arguments and named arguments + boolean namedArgumentStarted = false; + for (String arg : List.of(args)) { + String[] keyValue = arg.split("="); + + if (keyValue.length == 2) { + // Handle named arguments + namedArgumentStarted = true; + String key = keyValue[0]; + String value = keyValue[1]; + + if (!argumentMap.containsKey(key)) { + throw new IllegalArgumentException("Unknown argument: " + key); + } + + Argument argument = argumentMap.get(key); + argument.parse(value); + parsedArguments.put(key, argument); + } else { + // Handle positional arguments + if (namedArgumentStarted) { + throw new IllegalArgumentException("Positional arguments cannot come after named arguments."); + } + positionalArguments.add(arg); + } + } + + // Parse positional arguments + int index = 0; + for (Argument argument : argumentDefinitions) { + if (parsedArguments.containsKey(argument.getName())) { + continue; + } + if (index < positionalArguments.size()) { + String value = positionalArguments.get(index); + argument.parse(value); + parsedArguments.put(argument.getName(), argument); + index++; + } else { + // designed to throw an error if the arg doesn't have a default value + argument.parse(EMPTY_ARGUMENT); + parsedArguments.put(argument.getName(), argument); + } + } + + return parsedArguments; + } + + // The new method for game master commands that uses parsed arguments + protected abstract void runAsGM(int connId, Map> args); +} diff --git a/megamek/src/megamek/server/commands/IsGM.java b/megamek/src/megamek/server/commands/IsGM.java deleted file mode 100644 index 6c8fcff5545..00000000000 --- a/megamek/src/megamek/server/commands/IsGM.java +++ /dev/null @@ -1,13 +0,0 @@ -package megamek.server.commands; - -import megamek.server.totalwarfare.TWGameManager; - -public interface IsGM { - - TWGameManager getGameManager(); - - default boolean isGM(int connId) { - return getGameManager().getGame().getPlayer(connId).getGameMaster(); - } - -} diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index 45f2b6d7dca..3001ae0fe5a 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -20,59 +20,47 @@ import megamek.common.options.OptionsConstants; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.List; +import java.util.Map; + /** * @author Luana Scoppio */ -public class KillCommand extends ServerCommand implements IsGM { +public class KillCommand extends GamemasterServerCommand{ private final TWGameManager gameManager; /** Creates new KillCommand */ public KillCommand(Server server, TWGameManager gameManager) { - super(server, "kill", "Allows a GM to destroy a single unit instantly" + + super(server, gameManager, "kill", "Allows a GM to destroy a single unit instantly" + "Usage: "+ "/kill " + "where id is the units ID. The units ID can be found by hovering over the unit."); this.gameManager = gameManager; } + @Override + public List> defineArguments() { + return List.of(new IntegerArgument("unitID", 0, Integer.MAX_VALUE)); + } + /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { - - // Check to make sure gm kills are allowed! - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); + protected void runAsGM(int connId, Map> args) { + int unitId = (int) args.get("unitID").getValue(); + // is the unit on the board? + var unit = gameManager.getGame().getEntity(unitId); + if (unit == null) { + server.sendServerChat(connId, "Specified unit is not on the board."); return; } - // Check argument integrity. - if (args.length == 2) { - // Check command - try { - int unitId = Integer.parseInt(args[1]); - // is the unit on the board? - var unit = gameManager.getGame().getEntity(unitId); - if (unit == null) { - server.sendServerChat(connId, "Specified unit is not on the board."); - return; - } - gameManager.destroyEntity(unit, "Act of God", false, false); - server.sendServerChat(connId, unit.getDisplayName() + " has been destroyed."); - } catch (NumberFormatException e) { - server.sendServerChat(connId, "Kill command failed (2). Proper format is \"/kill \" where id is the units numerical ID"); - } - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "Kill command failed (1). Proper format is \"/kill \" where id is the units ID"); - } - } - - @Override - public TWGameManager getGameManager() { - return gameManager; + gameManager.destroyEntity(unit, "Act of God", false, false); + server.sendServerChat(unit.getDisplayName() + " has been devastated."); } } diff --git a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java index 5424526f93d..9a970eb2d1f 100644 --- a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java +++ b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java @@ -20,84 +20,66 @@ import megamek.common.options.OptionsConstants; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.props.OrbitalBombardment; import megamek.server.totalwarfare.TWGameManager; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + /** * @author Luana Scoppio */ -public class OrbitalBombardmentCommand extends ServerCommand implements IsGM { - - private final TWGameManager gameManager; +public class OrbitalBombardmentCommand extends GamemasterServerCommand { - /** Creates new NukeCommand */ public OrbitalBombardmentCommand(Server server, TWGameManager gameManager) { - super(server, "ob", "GM Drops a bomb onto the board doing of 100 damage with a 3 hex radius, to be exploded at" + - "the end of the next weapons attack phase." + - "Allowed formats:"+ - "/ob and" + - "/ob [factor=#] [radius=#]" + - "the damage at impact point is the factor times 10, default factor value is 10. " + - "and hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23), the explosion blast radius default " + - "is equal to 4, it automatically applies a linear damage dropoff each hex away from the center." + - " All parameters in square brackets may be omitted. " + - " Example: /ob 10 10 factor=12 "); - this.gameManager = gameManager; + super(server, gameManager, "ob", "GM orders an unknown warship to strike the board doing of 100 damage with a 4 hex radius, to be exploded at" + + "the end of the next weapons attack phase." + + "Allowed formats: " + + "/ob and" + + "/ob [dmg=#] [r=#] and" + + "/ob and " + + "/ob " + + "X and Y are the hex position where is x=column number and y=row number (hex 0923 would be x=9 and y=23), " + + "dmg is the amount of damage at impact point, default is 100, the damage drops off linearly according to the radius. " + + "r is radius, defaults to 4. " + + " Example: /ob 10 10 dmg=120 r=4 and /ob 10 10 120 4 are equivalent. " + + " Parameters in square brackets may be omitted, and using named variables permits to write them out of order. " + + " Example: /ob 10 10 r=12 dmg=300"); + } + + @Override + public List> defineArguments() { + return List.of( + new IntegerArgument("x"), + new IntegerArgument("y"), + new IntegerArgument("dmg", 10, Integer.MAX_VALUE, 100), + new IntegerArgument("r", 1, 10, 4)); } /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { + protected void runAsGM(int connId, Map> args) { - // Check to make sure nuking is allowed by game options! - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } + var orbitalBombardmentBuilder = new OrbitalBombardment.Builder(); - if (args.length >= 3) { - var orbitalBombardmentBuilder = new OrbitalBombardment.Builder(); - try { - int[] position = new int[2]; - for (int i = 1; i < 3; i++) { - position[i-1] = Integer.parseInt(args[i]) - 1; - } - // is the hex on the board? - if (!gameManager.getGame().getBoard().contains(position[0], position[1])) { - server.sendServerChat(connId, "Specified hex is not on the board."); - return; - } + orbitalBombardmentBuilder.x((int) args.get("x").getValue() - 1).y((int) args.get("y").getValue() - 1); + orbitalBombardmentBuilder.radius((int) args.get("r").getValue()); + orbitalBombardmentBuilder.damageFactor((int) args.get("dmg").getValue()); + var orbitalBombardment = orbitalBombardmentBuilder.build(); - orbitalBombardmentBuilder - .x(position[0]) - .y(position[1]); - - if (args.length > 3) { - for (int i = 3; i < args.length; i++) { - String[] keyValue = args[i].split("="); - if (keyValue[0].equals("factor")) { - orbitalBombardmentBuilder.damageFactor(Integer.parseInt(keyValue[1])); - } else if (keyValue[0].equals("radius")) { - orbitalBombardmentBuilder.radius(Integer.parseInt(keyValue[1])); - } - } - } - - gameManager.addScheduledOrbitalBombardment(orbitalBombardmentBuilder.build()); - server.sendServerChat(connId, "This isn't a shooting star! Take cover!"); - } catch (Exception e) { - server.sendServerChat(connId, "Orbital bombardment command failed (2). Proper format is \"/ob [factor=10] [radius=4]\" where hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23)"); - } - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "Orbital bombardment command failed (1). Proper format is \"/ob [factor=10] [radius=4]\" where hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23)"); + // is the hex on the board? + if (!gameManager.getGame().getBoard().contains(orbitalBombardment.getX(), orbitalBombardment.getY())) { + server.sendServerChat(connId, "Specified hex is not on the board."); + return; } - } - @Override - public TWGameManager getGameManager() { - return gameManager; + gameManager.addScheduledOrbitalBombardment(orbitalBombardment); + server.sendServerChat("Orbital bombardment incoming!"); } + } diff --git a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java index 5715ae19736..75373384714 100644 --- a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java +++ b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java @@ -22,44 +22,30 @@ import megamek.common.planetaryconditions.Fog; import megamek.common.planetaryconditions.Wind; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; import megamek.server.totalwarfare.TWGameManager; +import java.util.List; +import java.util.Map; + /** * @author Luana Scoppio */ -public class RemoveSmokeCommand extends ServerCommand implements IsGM { - - private final TWGameManager gameManager; +public class RemoveSmokeCommand extends GamemasterServerCommand { /** Creates new KillCommand */ public RemoveSmokeCommand(Server server, TWGameManager gameManager) { - super(server, "nosmoke", "GM removes all smoke cloud hexes. Usage: /nosmoke"); - this.gameManager = gameManager; + super(server, gameManager, "nosmoke", "GM removes all smoke cloud hexes. Usage: /nosmoke"); } - /** - * Run this command with the arguments supplied - */ @Override - public void run(int connId, String[] args) { - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - // Check argument integrity. - if (args.length == 1) { - // Check command - gameManager.getSmokeCloudList().forEach(gameManager::removeSmokeTerrain); - server.sendServerChat(connId, "GM cleared the smoke clouds."); - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "nosmoke command failed (1)."); - } + public List> defineArguments() { + return List.of(); } @Override - public TWGameManager getGameManager() { - return gameManager; + protected void runAsGM(int connId, Map> args) { + gameManager.getSmokeCloudList().forEach(gameManager::removeSmokeTerrain); + server.sendServerChat(connId, "GM cleared the smoke clouds."); } } diff --git a/megamek/src/megamek/server/commands/arguments/Argument.java b/megamek/src/megamek/server/commands/arguments/Argument.java new file mode 100644 index 00000000000..39d4aa056c3 --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/Argument.java @@ -0,0 +1,22 @@ +package megamek.server.commands.arguments; + +// A generic Argument class that can be extended for different argument types +public abstract class Argument { + protected T value; + + private final String name; + + public Argument(String name) { + this.name = name; + } + + public T getValue() { + return value; + } + + public String getName() { + return name; + } + + public abstract void parse(String input) throws IllegalArgumentException; +} diff --git a/megamek/src/megamek/server/commands/arguments/EnumArgument.java b/megamek/src/megamek/server/commands/arguments/EnumArgument.java new file mode 100644 index 00000000000..5c51072579b --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/EnumArgument.java @@ -0,0 +1,44 @@ +package megamek.server.commands.arguments; + +import java.util.Arrays; + +public class EnumArgument> extends Argument { + private final Class enumType; + private final E defaultValue; + + public EnumArgument(String name, Class enumType, E defaultValue) { + super(name); + this.enumType = enumType; + this.defaultValue = defaultValue; + } + + public Class getEnumType() { + return enumType; + } + + @Override + public void parse(String input) throws IllegalArgumentException { + if (input == null && defaultValue != null) { + value = defaultValue; + return; + } else { + if (input == null) { + throw new IllegalArgumentException(getName() + " is required."); + } + } + try { + value = Enum.valueOf(enumType, input.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(getName() + " must be one of: " + + String.join(", ", Arrays.toString(enumType.getEnumConstants()))); + } + } + + @Override + public E getValue() { + if (value == null && defaultValue != null) { + return defaultValue; + } + return value; + } +} diff --git a/megamek/src/megamek/server/commands/arguments/IntegerArgument.java b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java new file mode 100644 index 00000000000..26340b84879 --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java @@ -0,0 +1,63 @@ +package megamek.server.commands.arguments; + +public class IntegerArgument extends Argument { + private final int minValue; + private final int maxValue; + private final Integer defaultValue; + + public IntegerArgument(String name) { + this(name, Integer.MIN_VALUE, Integer.MAX_VALUE, null); + } + + public IntegerArgument(String name, int minValue, int maxValue) { + this(name, minValue, maxValue, null); + } + + public IntegerArgument(String name, int minValue, int maxValue, Integer defaultValue) { + super(name); + this.minValue = minValue; + this.maxValue = maxValue; + this.defaultValue = defaultValue; + } + + @Override + public Integer getValue() { + if (value == null && defaultValue != null) { + return defaultValue; + } + return value; + } + + @Override + public void parse(String input) throws IllegalArgumentException { + if (input == null && defaultValue != null) { + value = defaultValue; + return; + } else { + if (input == null) { + throw new IllegalArgumentException(getName() + " is required."); + } + } + try { + int parsedValue = Integer.parseInt(input); + if (parsedValue < minValue || parsedValue > maxValue) { + throw new IllegalArgumentException(getName() + " must be between " + minValue + " and " + maxValue); + } + value = parsedValue; + } catch (NumberFormatException e) { + throw new IllegalArgumentException(getName() + " must be an integer."); + } + } + + public boolean hasDefaultValue() { + return defaultValue != null; + } + + public int getMinValue() { + return minValue; + } + + public int getMaxValue() { + return maxValue; + } +} diff --git a/megamek/src/megamek/server/props/OrbitalBombardment.java b/megamek/src/megamek/server/props/OrbitalBombardment.java index e49e1c965e4..0bfa383c45f 100644 --- a/megamek/src/megamek/server/props/OrbitalBombardment.java +++ b/megamek/src/megamek/server/props/OrbitalBombardment.java @@ -18,6 +18,8 @@ */ package megamek.server.props; +import megamek.common.Coords; + /** * Represents an orbital bombardment event. * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with @@ -31,19 +33,23 @@ public class OrbitalBombardment { private final int y; private final int damageFactor; private final int radius; - + private final Coords coords; /** * Represents an orbital bombardment event. * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with * regular/linear damage droppoff. * - * @param builder */ private OrbitalBombardment(Builder builder) { this.x = builder.x; this.y = builder.y; this.damageFactor = builder.damageFactor; this.radius = builder.radius; + this.coords = new Coords(x, y); + } + + public Coords getCoords() { + return coords; } public int getX() { diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 4eb440a79a0..57c86de9f08 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -190,8 +190,11 @@ public List getCommandList(Server server) { commands.add(new CheckBVTeamCommand(server)); commands.add(new NukeCommand(server, this)); commands.add(new KillCommand(server, this)); + commands.add(new OrbitalBombardmentCommand(server, this)); commands.add(new ChangeOwnershipCommand(server, this)); commands.add(new DisasterCommand(server, this)); + commands.add(new FirestarterCommand(server, this)); + commands.add(new FirestormCommand(server, this)); commands.add(new RemoveSmokeCommand(server, this)); commands.add(new ChangeWeatherCommand(server, this)); commands.add(new TraitorCommand(server, this)); @@ -20194,8 +20197,6 @@ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords posi } else { range += entity.getElevation(); } - } else { - continue; } // We might need to nuke everyone in the explosion hex. If so... @@ -20394,7 +20395,35 @@ public void addScheduledNuke(int[] nuke) { * through it's builder. */ public void addScheduledOrbitalBombardment(OrbitalBombardment orbitalBombardment) { + Report r = new Report(1302); + r.indent(); + r.newlines = 0; + r.add("Unknown warship in orbit"); + r.add(orbitalBombardment.getCoords().getBoardNum()); + getvPhaseReport().addElement(r); + Report.addNewline(getvPhaseReport()); + + drawOrbitalBombardmentOnBoard(orbitalBombardment); scheduledOrbitalBombardment.add(orbitalBombardment); + getGame().setOrbitalBombardmentVector(new Vector<>(scheduledOrbitalBombardment)); + } + + private void drawOrbitalBombardmentOnBoard(OrbitalBombardment orbitalBombardment) { + + for (var coord : orbitalBombardment.getCoords().allAtDistanceOrLess(orbitalBombardment.getRadius())) { + getGame().getBoard().addSpecialHexDisplay( + coord, + new SpecialHexDisplay( + SpecialHexDisplay.Type.ORBITAL_BOMBARDMENT, + getGame().getRoundCount(), + getGame().getPlayersList().get(0), // It doesnt matter which is the player, but I dont want to cause a nullpointer. + "Orbital bombardment incoming, landing on round " + + getGame().getRoundCount() + + ", fired by an unknown warship in orbit", + SpecialHexDisplay.SHD_OBSCURED_ALL) + ); + sendChangedHex(coord); + } } /** @@ -20419,8 +20448,15 @@ void resolveScheduledNukes() { */ void resolveScheduledOrbitalBombardments() { scheduledOrbitalBombardment - .forEach(ob -> doOrbitalBombardment(new Coords(ob.getX(), ob.getY()), ob.getDamageFactor(), ob.getRadius(), vPhaseReport)); + .forEach(ob -> doOrbitalBombardment(new Coords(ob.getX(), ob.getY()), ob.getDamageFactor(), ob.getRadius())); scheduledOrbitalBombardment.clear(); + getGame().resetOrbitalBombardmentAttacks(); + + // All right. We're done. + var r = new Report(1301, Report.PUBLIC); + r.indent(); + r.newlines = 2; + getvPhaseReport().add(r); } /** @@ -20446,19 +20482,12 @@ public void doNuclearExplosion(Coords position, int nukeType, Vector vDe * @param position the position that will be hit by the orbital bombardment * @param damageFactor the factor by which the base damage will be multiplied * @param radius the radius which the damage will hit - * @param vDesc a vector that contains the output report */ - public void doOrbitalBombardment(Coords position, int damageFactor, int radius, Vector vDesc) { - // Just in case. - if (vDesc == null) { - vDesc = new Vector<>(); - } - + public void doOrbitalBombardment(Coords position, int damageFactor, int radius) { Report r = new Report(1300, Report.PUBLIC); - r.indent(); r.add(position.getBoardNum(), true); - vDesc.add(r); + getvPhaseReport().add(r); // Then, do actual blast damage. // Use the standard blast function for this. @@ -20470,41 +20499,7 @@ public void doOrbitalBombardment(Coords position, int damageFactor, int radius, doExplosion(baseDamage, degradation , false, position, true, tmpV, blastedUnitsVec, -1, true); Report.indentAll(tmpV, 2); - vDesc.addAll(tmpV); - - // Next, for whatever's left, do terrain effects - // such as clearing, roughing, and boiling off water. - boolean damageFlag = true; - - // Lastly, do secondary effects. - for (Entity entity : game.getEntitiesVector()) { - // loaded units and off board units don't have a position, - // so we don't count 'em here - if ((entity.getTransportId() != Entity.NONE) || (entity.getPosition() == null)) { - continue; - } - - // If it's already destroyed... - if ((entity.isDoomed()) || (entity.isDestroyed())) { - continue; - } - - // If it's too far away for this... - if (position.distance(entity.getPosition()) > radius) { - continue; - } - - // Actually do secondary effects against it. - // Since the effects are unit-dependant, we'll just define it in the - // entity. -// applySecondaryNuclearEffects(entity, position, vDesc); - } - - // All right. We're done. - r = new Report(1216, Report.PUBLIC); - r.indent(); - r.newlines = 2; - vDesc.add(r); + getvPhaseReport().addAll(tmpV); } /** @@ -31692,6 +31687,10 @@ void clearBombIcons() { game.getBoard().clearBombIcons(); } + void clearOrbitalBombardmentIcons() { + game.getBoard().clearOrbitalBombardmentIcons(); + } + /** * Convenience function to send a ground object update. */ From 0a364f8939a5896141b6f2214d0e87105f6c9f78 Mon Sep 17 00:00:00 2001 From: stonewall072 Date: Thu, 14 Nov 2024 09:09:27 -0500 Subject: [PATCH 33/57] Updated SRMAXHandler to ignore specality armors. --- megamek/src/megamek/common/weapons/SRMAXHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/megamek/src/megamek/common/weapons/SRMAXHandler.java b/megamek/src/megamek/common/weapons/SRMAXHandler.java index e047b52aee3..2276aeeb145 100644 --- a/megamek/src/megamek/common/weapons/SRMAXHandler.java +++ b/megamek/src/megamek/common/weapons/SRMAXHandler.java @@ -20,6 +20,7 @@ package megamek.common.weapons; import megamek.common.Game; +import megamek.common.HitData; import megamek.common.ToHitData; import megamek.common.actions.WeaponAttackAction; import megamek.server.totalwarfare.TWGameManager; @@ -38,5 +39,6 @@ public SRMAXHandler(ToHitData t, WeaponAttackAction w, Game g, TWGameManager m) sSalvoType = " acid-head missile(s) "; nSalvoBonus = -2; damageType = DamageType.ACID; + generalDamageType = HitData.DAMAGE_IGNORES_DMG_REDUCTION; } } From 02e9645ad8db22b7bbd0d07a49a689c18a4370fa Mon Sep 17 00:00:00 2001 From: Coppio Date: Fri, 15 Nov 2024 00:45:26 -0300 Subject: [PATCH 34/57] feat: new commands implemented --- megamek/data/images/hexes/obinc.gif | Bin 0 -> 834 bytes .../i18n/megamek/client/messages.properties | 92 +++++++++++++- .../megamek/common/report-messages.properties | 1 + .../src/megamek/client/ui/swing/MapMenu.java | 24 ++-- .../gmCommands/GamemasterCommandPanel.java | 33 +++-- .../ui/swing/tileset/TilesetManager.java | 2 +- .../src/megamek/common/SpecialHexDisplay.java | 4 +- megamek/src/megamek/server/Server.java | 7 ++ .../commands/ChangeOwnershipCommand.java | 53 ++++---- .../server/commands/ChangeWeatherCommand.java | 119 +++++++++--------- .../server/commands/DisasterCommand.java | 44 +++---- .../server/commands/FirestarterCommand.java | 52 ++++---- .../server/commands/FirestormCommand.java | 55 ++++---- .../commands/GamemasterServerCommand.java | 69 +++++++--- .../megamek/server/commands/HelpCommand.java | 10 +- .../megamek/server/commands/KillCommand.java | 45 +++---- .../commands/OrbitalBombardmentCommand.java | 66 ++++------ .../server/commands/RemoveSmokeCommand.java | 33 ++--- .../server/commands/TraitorCommand.java | 27 ++-- .../server/commands/arguments/Argument.java | 15 ++- .../commands/arguments/EnumArgument.java | 16 ++- .../commands/arguments/IntegerArgument.java | 25 +++- .../arguments/OptionalIntegerArgument.java | 77 ++++++++++++ .../server/props/OrbitalBombardment.java | 39 +++--- .../server/totalwarfare/TWGameManager.java | 37 +++--- 25 files changed, 570 insertions(+), 375 deletions(-) create mode 100644 megamek/data/images/hexes/obinc.gif create mode 100644 megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java diff --git a/megamek/data/images/hexes/obinc.gif b/megamek/data/images/hexes/obinc.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5f4c4b6b2d7e52a27ac6721fd9e4c2da1740757 GIT binary patch literal 834 zcmbu)3r~`J0LStFuNVcTh?W&u26pJ;)6FiLS&AYm@pvrDu9i$m1-lWM>A)M2Sf(gV z^f}FTAZIIQnp-WqV2y?oLu)Qwo$b`tPRD9(u9ms7>^1b=_YHg!l4KDZl{-ixxw4#0 zwt)0F*!`a0ti+)PM#!4CDg^z-d4a7=U7+1Skj2 z04CrpUrBY>7CFDQlbO|?5ZHNC_eZPXw$$c0>e4-S%yUVMKbu)pt{h6gKZ}EVXuKIM92BoSkXkZi z9n_?67mw$RcJv)+zE3Q8628Kf=G;Fn>T`6q-3q6tMVt1@mcL#d)jO8wZ@uQ%t{VUU z{b*RKXJB2!ORDaKuAUZ4BI)ge>-W<^sv_U7btBDYI$!fJr>nPH!6|=E4Hlh$p^$a? z=50B2va&$_STt<(-n4mCo`K|d+XAMHWG}6ktTCt~K4sf1qeHb;)yJIvr>*BI22I)R zq8f9 z9b!>vhs~d(GTj-jOJi($&ciXOIx?+vnql*i@O?EYj<_sK+`?g_MZN`Db=8t(Z>&4g La#cnNA)9^zuIXm% literal 0 HcmV?d00001 diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 9cc5a513173..7c316346a05 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -4625,16 +4625,96 @@ CMVPanel.copyText=Copy as Text CMVPanel.MUL=Open MUL CMVPanel.font=Font: +# Scenario Chooser +ScenarioChooser.title=Choose Scenario + +# SBF Target Dialog +SBFTargetDialog.title=Targeting + + #Gamemaster Menu Text Gamemaster.Gamemaster=Gamemaster Gamemaster.EditDamage=Edit Damage Gamemaster.Configure=Configure Gamemaster.Traitor=Traitor Unit -Gamemaster.SpecialCommands=Special Commands Gamemaster.KillUnit=Kill Unit +Gamemaster.SpecialCommands=Special Commands -# Scenario Chooser -ScenarioChooser.title=Choose Scenario - -# SBF Target Dialog -SBFTargetDialog.title=Targeting +#Gamemaster Chat Commands +Gamemaster.cmd.missingUnit=Specified unit is not on the board. +Gamemaster.cmd.error.integerparse=must be between the min and max values: +Gamemaster.cmd.help=Usage: +Gamemaster.cmd.params.required=Required. +Gamemaster.cmd.params.optional=Optional. +Gamemaster.cmd.x=The x coordinate of the hex. +Gamemaster.cmd.y=The y coordinate of the hex. +# Remove Smoke cmd +Gamemaster.cmd.removesmoke.help=Removes all smoke cloud hexes. +Gamemaster.cmd.removesmoke.success=The air is cleaner and the smoke is gone. +# Kill Unit cmd +Gamemaster.cmd.kill.unitID=ID of the unit to kill. +Gamemaster.cmd.kill.help=Kills a single unit. +Gamemaster.cmd.kill.success=Is going to be destroyed at the end of this phase. +Gamemaster.cmd.kill.reason=Killed by GM. +# Change ownership cmd +Gamemaster.cmd.changeownership.help=Changes the ownership of a unit from one player to another. +Gamemaster.cmd.changeownership.unitID=ID of the unit to change ownership. +Gamemaster.cmd.changeownership.playerID=ID of the player to receive the unit. +Gamemaster.cmd.changeownership.unitNotFound=No such entity. +Gamemaster.cmd.changeownership.playerNotFound=No such player. +Gamemaster.cmd.changeownership.playerUnassigned=Player must be assigned a team. +Gamemaster.cmd.changeownership.success=Ownership of unit {0} will be transferred to player {1} at the end of this round. +# Change weather cmd +Gamemaster.cmd.changeweather.help=Change any of the planetary conditions. Effects change at the next round. +Gamemaster.cmd.changeweather.fog=Fog: 0=none, 1=light, 2=heavy +Gamemaster.cmd.changeweather.light=Light: 0=daylight, 1=dusk, 2=full moon, 3=glare, 4=moonless night, 5=solar flare, 6=pitch black +Gamemaster.cmd.changeweather.wind=Wind: 0=calm, 1=light gale, 2=moderate gale, 3=strong gale, 4=storm, 5=tornado F1-F3, 6=tornado F4 +Gamemaster.cmd.changeweather.winddir=Wind direction: 0=south, 1=southwest, 2=northwest, 3=north, 4=northeast, 5=southeast, 6=random +Gamemaster.cmd.changeweather.atmo=Atmosphere: 0=vacuum, 1=trace, 2=thin, 3=standard, 4=high, 5=very high +Gamemaster.cmd.changeweather.blowsand=Blowing Sand: 0=no, 1=yes +Gamemaster.cmd.changeweather.emi=EMI: 0=no, 1=yes +Gamemaster.cmd.changeweather.weather=Weather: 0=clear, 1=light rain, 2=moderate rain, 3=heavy rain, 4=gusting rain, 5=downpour, 6=light snow, 7=moderate snow, 8=snow flurries, 9=heavy snow, 10=sleet, 11=ice storm, 12=light hail, 13=heavy hail, 14=lightning storm +# Disaster cmd +Gamemaster.cmd.disaster.help=Causes a disaster on the board. +Gamemaster.cmd.disaster.type=Type of disaster. Beware, some disasters are very destructive! +Gamemaster.cmd.changeweather.fog.success=The fog has changed. +Gamemaster.cmd.changeweather.fog.error=Invalid fog value. Must be between 0 and {0} + +Gamemaster.cmd.changeweather.wind.success=The wind strength has changed. +Gamemaster.cmd.changeweather.wind.error=Invalid wind value. Must be between 0 and {0} + +Gamemaster.cmd.changeweather.winddir.success=The wind direction has changed. +Gamemaster.cmd.changeweather.winddir.error=Invalid wind direction value. Must be between 0 and {0} + +Gamemaster.cmd.changeweather.light.success=The light has changed. +Gamemaster.cmd.changeweather.light.error=Invalid light value. Must be between 0 and {0} + +Gamemaster.cmd.changeweather.atmo.success0=The air has vanished, put your vac suits! +Gamemaster.cmd.changeweather.atmo.success=The air is changing. +Gamemaster.cmd.changeweather.atmo.error=Invalid atmosphere value. Must be between 0 and {0} + +Gamemaster.cmd.changeweather.blowsand.success1=Sand started blowing. +Gamemaster.cmd.changeweather.blowsand.success=The sand has settled. +Gamemaster.cmd.changeweather.blowsand.error=Invalid blowsand value. Must be between 0 and {0} + +Gamemaster.cmd.changeweather.weather.success=The weather has changed. +Gamemaster.cmd.changeweather.weather.error=Invalid weather value. Must be between 0 and {0} + +Gamemaster.cmd.changeweather.emi.success1=EMI is active. +Gamemaster.cmd.changeweather.emi.success=EMI is inactive. +Gamemaster.cmd.changeweather.emi.error=Invalid EMI value. Must be between 0 and {0} +# Firestarter cmd +Gamemaster.cmd.fire.type=Type of fire. They are 1=Normal, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV. +Gamemaster.cmd.fire.help=Starts a fire on the board. + +# Firestorm cmd +Gamemaster.cmd.firestorm.help=Starts fire in the entire board. +Gamemaster.cmd.fire.failed=Failed to ignite fire. +Gamemaster.cmd.fire.percent=Percentage of the board hexes to ignite. + +# Orbital bombardment cmd +Gamemaster.cmd.orbitalbombardment.help=Calls an orbital bombardment on the board. It hits after the firing phase. +Gamemaster.cmd.orbitalbombardment.dmg=Damage of the bombardment at target hex. +Gamemaster.cmd.orbitalbombardment.radius=Radius of the bombardment. +Gamemaster.cmd.orbitalbombardment.error.outofbounds=Specified hex is not on the board. +Gamemaster.cmd.orbitalbombardment.success=Orbital bombardment incoming! \ No newline at end of file diff --git a/megamek/i18n/megamek/common/report-messages.properties b/megamek/i18n/megamek/common/report-messages.properties index 5bb6ad59327..b82e7e2a3aa 100755 --- a/megamek/i18n/megamek/common/report-messages.properties +++ b/megamek/i18n/megamek/common/report-messages.properties @@ -59,6 +59,7 @@ 1300=Orbital bombardment hit hex !!! 1301=End of orbital bombardment resolution 1302= has commenced an orbital bombardment, it will land at the end of the next weapons phase at hex . +1303=Start of orbital bombardment resolution # 1500s - ammo handling related 1500= () selected diff --git a/megamek/src/megamek/client/ui/swing/MapMenu.java b/megamek/src/megamek/client/ui/swing/MapMenu.java index 743528ea0d2..505e6fee4f9 100644 --- a/megamek/src/megamek/client/ui/swing/MapMenu.java +++ b/megamek/src/megamek/client/ui/swing/MapMenu.java @@ -441,22 +441,14 @@ private record Tuple(String name, GamemasterServerCommand command) {} private JMenu createGMSpecialCommandsMenu() { JMenu menu = new JMenu(Messages.getString("Gamemaster.SpecialCommands")); - var commands = List.of( - new Tuple("Kill Unit", new KillCommand(null, null)), - new Tuple("Change Ownership", new ChangeOwnershipCommand(null, null)), - new Tuple("Change Weather", new ChangeWeatherCommand(null, null)), - new Tuple("Disasters", new DisasterCommand(null, null)), - new Tuple("Orbital Bombardment", new OrbitalBombardmentCommand(null, null)), - new Tuple("Remove Smoke", new RemoveSmokeCommand(null, null)), - new Tuple("Firestarter", new FirestarterCommand(null, null)), - new Tuple("Firestorm", new FirestormCommand(null, null)) - ); - - for (var cmd : commands) { - JMenuItem item = new JMenuItem(cmd.name()); - item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd.command()).setVisible(true)); - menu.add(item); - } + Server.getServerInstance().getAllCommands().stream() + .filter(cmd -> cmd instanceof GamemasterServerCommand) + .map(cmd -> (GamemasterServerCommand) cmd) + .forEach(cmd -> { + JMenuItem item = new JMenuItem(cmd.getName()); + item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd).setVisible(true)); + menu.add(item); + }); return menu; } diff --git a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java index f85f1b7b55d..bd47005e518 100644 --- a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java +++ b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java @@ -1,6 +1,5 @@ package megamek.client.ui.swing.gmCommands; -import megamek.client.IClient; import megamek.client.ui.swing.ClientGUI; import megamek.server.commands.GamemasterServerCommand; import megamek.server.commands.arguments.Argument; @@ -8,6 +7,7 @@ import megamek.server.commands.arguments.IntegerArgument; import javax.swing.*; +import java.awt.*; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -24,25 +24,30 @@ public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerC this.client = client; setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); - JLabel helpLabel = new JLabel(command.getHelp()); + JLabel helpLabel = new JLabel(command.getHelpHtml()); add(helpLabel); List> arguments = command.defineArguments(); Map argumentComponents = new HashMap<>(); for (Argument argument : arguments) { + JPanel argumentPanel = new JPanel(); + argumentPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + JLabel label = new JLabel(argument.getName() + ":"); - add(label); + argumentPanel.add(label); - if (argument instanceof IntegerArgument intArg) { + if (argument instanceof IntegerArgument) { + IntegerArgument intArg = (IntegerArgument) argument; JSpinner spinner = new JSpinner(new SpinnerNumberModel( intArg.hasDefaultValue() ? intArg.getValue() : 0, intArg.getMinValue(), intArg.getMaxValue(), 1)); - add(spinner); + argumentPanel.add(spinner); argumentComponents.put(argument.getName(), spinner); - } else if (argument instanceof EnumArgument enumArg) { + } else if (argument instanceof EnumArgument) { + EnumArgument enumArg = (EnumArgument) argument; JComboBox comboBox = new JComboBox<>(); for (Enum constant : enumArg.getEnumType().getEnumConstants()) { comboBox.addItem(constant.name()); @@ -50,9 +55,11 @@ public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerC if (enumArg.getValue() != null) { comboBox.setSelectedItem(enumArg.getValue().name()); } - add(comboBox); + argumentPanel.add(comboBox); argumentComponents.put(argument.getName(), comboBox); } + + add(argumentPanel); } JButton executeButton = new JButton("Execute Command"); @@ -63,6 +70,18 @@ public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerC setLocationRelativeTo(parent); } + private String wrapText(String text, int lineLength) { + StringBuilder wrappedText = new StringBuilder(""); + int currentIndex = 0; + while (currentIndex < text.length()) { + int endIndex = Math.min(currentIndex + lineLength, text.length()); + wrappedText.append(text, currentIndex, endIndex).append("
"); + currentIndex = endIndex; + } + wrappedText.append(""); + return wrappedText.toString(); + } + private void executeCommand(Map argumentComponents) { List> arguments = command.defineArguments(); String[] args = new String[arguments.size()]; diff --git a/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java b/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java index 1a3ec4ff91e..bd4a3b6feef 100644 --- a/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java +++ b/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java @@ -77,7 +77,7 @@ public class TilesetManager implements IPreferenceChangeListener { private static final String FILENAME_ARTILLERY_ADJUSTED_IMAGE = "artyadj.gif"; private static final String FILENAME_ARTILLERY_INCOMING_IMAGE = "artyinc.gif"; - private static final String FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE = "obinc.gif"; + public static final String FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE = "obinc.gif"; public static final int ARTILLERY_AUTOHIT = 0; public static final int ARTILLERY_ADJUSTED = 1; diff --git a/megamek/src/megamek/common/SpecialHexDisplay.java b/megamek/src/megamek/common/SpecialHexDisplay.java index 2fb11e1cac3..64875395302 100644 --- a/megamek/src/megamek/common/SpecialHexDisplay.java +++ b/megamek/src/megamek/common/SpecialHexDisplay.java @@ -23,6 +23,8 @@ import megamek.common.util.ImageUtil; import megamek.common.util.fileUtils.MegaMekFile; +import static megamek.client.ui.swing.tileset.TilesetManager.FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE; + /** * @author dirk */ @@ -101,7 +103,7 @@ public boolean drawAfter() { return true; } }, - ORBITAL_BOMBARDMENT(new MegaMekFile(Configuration.hexesDir(), "obinc.gif").toString()); + ORBITAL_BOMBARDMENT(new MegaMekFile(Configuration.hexesDir(), FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE).toString()); private transient Image defaultImage; private final String defaultImagePath; diff --git a/megamek/src/megamek/server/Server.java b/megamek/src/megamek/server/Server.java index d62d8555e92..ee832da035b 100644 --- a/megamek/src/megamek/server/Server.java +++ b/megamek/src/megamek/server/Server.java @@ -538,6 +538,13 @@ public Collection getAllCommandNames() { return commandsHash.keySet(); } + /** + * Returns the list of all server commands + */ + public List getAllCommands() { + return new ArrayList<>(commandsHash.values()); + } + /** * Sent when a client attempts to connect. */ diff --git a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java index d9ca02e4e9f..d2860a04112 100644 --- a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java +++ b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java @@ -1,23 +1,19 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; +import megamek.client.ui.Messages; import megamek.common.Entity; import megamek.common.Player; import megamek.server.Server; @@ -25,49 +21,48 @@ import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; -import java.util.ArrayList; import java.util.List; import java.util.Map; /** * The Server Command "/changeOwner" that will switch an entity's owner to another player. * - * @author Luana Scoppio + * @author Luana Coppio */ public class ChangeOwnershipCommand extends GamemasterServerCommand { + public static final String UNIT_ID = "unitID"; + public static final String PLAYER_ID = "playerID"; + public ChangeOwnershipCommand(Server server, TWGameManager gameManager) { super(server, gameManager, "changeOwner", - "Switches ownership of a player's entity to another player during the end phase. " - + "Usage: /changeOwner " - + "The following is an example of changing unit ID 7 to player ID 2: /changeOwner 7 2 "); + Messages.getString("Gamemaster.cmd.changeownership.help")); } @Override public List> defineArguments() { - List> arguments = new ArrayList<>(); - arguments.add(new IntegerArgument("unitID", 0, Integer.MAX_VALUE)); - arguments.add(new IntegerArgument("playerID", 0, Integer.MAX_VALUE)); - return arguments; + return List.of( + new IntegerArgument(UNIT_ID, Messages.getString("Gamemaster.cmd.changeownership.unitID")), + new IntegerArgument(PLAYER_ID, Messages.getString("Gamemaster.cmd.changeownership.playerID"))); } @Override protected void runAsGM(int connId, Map> args) { - IntegerArgument unitID = (IntegerArgument) args.get("unitID"); - IntegerArgument playerID = (IntegerArgument) args.get("playerID"); + IntegerArgument unitID = (IntegerArgument) args.get(UNIT_ID); + IntegerArgument playerID = (IntegerArgument) args.get(PLAYER_ID); Entity ent = gameManager.getGame().getEntity(unitID.getValue()); Player player = server.getGame().getPlayer(playerID.getValue()); if (null == ent) { - server.sendServerChat(connId, "No such entity."); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.changeownership.unitNotFound")); } else if (null == player) { - server.sendServerChat(connId, "No such player."); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.changeownership.playerNotFound")); } else if (player.getTeam() == Player.TEAM_UNASSIGNED) { - server.sendServerChat(connId, "Player must be assigned a team."); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.changeownership.playerUnassigned")); } else { - server.sendServerChat(connId, ent.getDisplayName() + " will switch to " + player.getName() + "'s side at the end of this turn."); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.changeownership.success", ent.getDisplayName(), player.getName())); ent.setTraitorId(player.getId()); } } diff --git a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java index 3ff818d1c1d..b28f24962ed 100644 --- a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java +++ b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java @@ -1,71 +1,59 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; +import megamek.client.ui.Messages; import megamek.common.planetaryconditions.*; import megamek.server.Server; import megamek.server.commands.arguments.Argument; -import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.commands.arguments.OptionalIntegerArgument; import megamek.server.totalwarfare.TWGameManager; - -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; -import java.util.stream.Stream; /** - * @author Luana Scoppio + * @author Luana Coppio */ public class ChangeWeatherCommand extends GamemasterServerCommand { - private static final String HELP_TEXT = "GM changes (weather) planetary conditions. The parameters are optional and unordered " + - "and the effects are applied at the beginning of the next turn. The square brackets means that argument is optional. " + - "Usage format: /weather [fog=0-2] [wind=0-6] [winddir=0-6] [light=0-6] [atmo=0-5] [blowsand=0-1] [weather=0-14] " + - "light= 0: daylight, 1: dusk, 2: full moon, 3: glare, 4: moonless night, 5: solar flare, 6: pitch black " + - "fog= 0: none, 1: light, 2: heavy " + - "wind= 0: calm, 1: light gale, 2: moderate gale, 3: strong gale, 4: storm, 5: tornado F1-F3, 6: tornado F4 " + - "winddir= 0: south, 1: southwest, 2: northwest, 3: north, 4: northeast, 5: southeast, 6: random " + - "atmo= 0: vacuum, 1: trace, 2: thin, 3: standard, 4: high, 5: very high " + - "blowsand= 0: no, 1: yes " + - "emi= 0: no, 1: yes " + - "weather= 0: clear, 1: light rain, 2: moderate rain, 3: heavy rain, 4: gusting rain, 5: downpour, 6: light snow " + - "7: moderate snow, 8: snow flurries, 9: heavy snow, 10: sleet, 11: ice storm, 12: light hail, 13: heavy hail " + - "14: lightning storm"; + private static final String FOG = "fog"; + private static final String LIGHT = "light"; + private static final String WIND = "wind"; + private static final String WIND_DIR = "winddir"; + private static final String ATMO = "atmo"; + private static final String BLOWSAND = "blowsand"; + private static final String EMIS = "emi"; + private static final String WEATHER = "weather"; /** Creates new ChangeWeatherCommand */ public ChangeWeatherCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "weather", HELP_TEXT); + super(server, gameManager, WEATHER, Messages.getString("Gamemaster.cmd.changeweather.help")); } + @Override public List> defineArguments() { - List> arguments = new ArrayList<>(); - arguments.add(new IntegerArgument("fog", 0, 2)); - arguments.add(new IntegerArgument("light", 0, 6)); - arguments.add(new IntegerArgument("wind", 0, 6)); - arguments.add(new IntegerArgument("atmo", 0, 5)); - arguments.add(new IntegerArgument("blowsand", 0, 1)); - arguments.add(new IntegerArgument("emi", 0, 1)); - arguments.add(new IntegerArgument("weather", 0, 14)); - return arguments; + return List.of(new OptionalIntegerArgument(FOG, Messages.getString("Gamemaster.cmd.changeweather.fog"), 0, 2), + new OptionalIntegerArgument(LIGHT, Messages.getString("Gamemaster.cmd.changeweather.light"), 0, 6), + new OptionalIntegerArgument(WIND, Messages.getString("Gamemaster.cmd.changeweather.wind"), 0, 6), + new OptionalIntegerArgument(WIND_DIR, Messages.getString("Gamemaster.cmd.changeweather.winddir"), 0, 6), + new OptionalIntegerArgument(ATMO, Messages.getString("Gamemaster.cmd.changeweather.atmo"), 0, 5), + new OptionalIntegerArgument(BLOWSAND, Messages.getString("Gamemaster.cmd.changeweather.blowsand"), 0, 1), + new OptionalIntegerArgument(EMIS, Messages.getString("Gamemaster.cmd.changeweather.emi"), 0, 1), + new OptionalIntegerArgument(WEATHER, Messages.getString("Gamemaster.cmd.changeweather.weather"), 0, 14)); } private void updatePlanetaryCondition(int value, int connId, int maxLength, Consumer setter, @@ -78,7 +66,6 @@ private void updatePlanetaryCondition(int value, int connId, int maxLength, Cons } } - private record Condition(int maxLength, Consumer setter, Function successMessage, Function errorMessage) {} /** @@ -89,27 +76,36 @@ public void runAsGM(int connId, Map> args) { var planetaryConditions = getGameManager().getGame().getPlanetaryConditions(); Map conditions = Map.of( - "fog", new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), - value -> "The fog has changed.", maxLength -> "Invalid fog value. Must be between 0 and " + (maxLength - 1)), - "wind", new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), - value -> "The wind strength has changed.", maxLength -> "Invalid wind value. Must be between 0 and " + (maxLength - 1)), - "winddir", new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), - value -> "The wind direction has changed.", maxLength -> "Invalid wind direction value. Must be between 0 and " + (maxLength - 1)), - "light", new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), - value -> "The light has changed.", maxLength -> "Invalid light value. Must be between 0 and " + (maxLength - 1)), - "atmo", new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), - value -> value == 0 ? "The air has vanished, put your vac suits!" : "The air is changing.", maxLength -> "Invalid atmosphere value. Must be between 0 and " + (maxLength - 1)), - "blowsand", new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), - value -> value == 1 ? "Sand started blowing." : "The sand has settled.", maxLength -> "Invalid blowsand value. Must be between 0 and " + (maxLength - 1)), - "weather", new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), - value -> "The weather has changed.", maxLength -> "Invalid weather value. Must be between 0 and " + (maxLength - 1)), - "emi", new Condition(EMI.values().length, value -> planetaryConditions.setEMI(EMI.values()[value]), - value -> value == 1 ? "EMI is active." : "EMI is inactive.", maxLength -> "Invalid EMI value. Must be between 0 and " + (maxLength - 1)) + FOG, new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), + value -> Messages.getString("Gamemaster.cmd.changeweather.fog.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.fog.error", (maxLength - 1))), + WIND, new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), + value -> Messages.getString("Gamemaster.cmd.changeweather.wind.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.wind.error", (maxLength - 1))), + WIND_DIR, new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), + value -> Messages.getString("Gamemaster.cmd.changeweather.winddir.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.winddir.error", (maxLength - 1))), + LIGHT, new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), + value -> Messages.getString("Gamemaster.cmd.changeweather.light.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.light.error", (maxLength - 1))), + ATMO, new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), + value -> value == 0 ? Messages.getString("Gamemaster.cmd.changeweather.atmo.success0") : Messages.getString("Gamemaster.cmd.changeweather.atmo.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.atmo.error", (maxLength - 1))), + BLOWSAND, new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), + value -> value == 1 ? Messages.getString("Gamemaster.cmd.changeweather.blowsand.success1") : Messages.getString("Gamemaster.cmd.changeweather.blowsand.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.blowsand.error", (maxLength - 1))), + WEATHER, new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), + value -> Messages.getString("Gamemaster.cmd.changeweather.weather.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.weather.error", (maxLength - 1))), + EMIS, new Condition(EMI.values().length, value -> planetaryConditions.setEMI(EMI.values()[value]), + value -> value == 1 ? Messages.getString("Gamemaster.cmd.changeweather.emi.success1") : Messages.getString("Gamemaster.cmd.changeweather.emi.success"), + maxLength -> Messages.getString("Gamemaster.cmd.changeweather.emi.error", (maxLength - 1))) ); + conditions.forEach((prefix, condition) -> { - if (args.containsKey(prefix)) { + if (args.containsKey(prefix) && ((OptionalIntegerArgument) args.get(prefix)).getValue().isPresent()) { updatePlanetaryCondition( - (int) args.get(prefix).getValue(), + ((OptionalIntegerArgument) args.get(prefix)).getValue().get(), connId, condition.maxLength, condition.setter, @@ -120,5 +116,4 @@ public void runAsGM(int connId, Map> args) { getGameManager().getGame().setPlanetaryConditions(planetaryConditions); } - } diff --git a/megamek/src/megamek/server/commands/DisasterCommand.java b/megamek/src/megamek/server/commands/DisasterCommand.java index f3fc13e354d..0c7d3dc4b2f 100644 --- a/megamek/src/megamek/server/commands/DisasterCommand.java +++ b/megamek/src/megamek/server/commands/DisasterCommand.java @@ -1,25 +1,20 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; +import megamek.client.ui.Messages; import megamek.common.Coords; -import megamek.logging.MMLogger; import megamek.server.Server; import megamek.server.commands.arguments.Argument; import megamek.server.commands.arguments.EnumArgument; @@ -27,13 +22,14 @@ import java.util.List; import java.util.Map; -import java.util.Objects; /** - * @author Luana Scoppio + * @author Luana Coppio */ public class DisasterCommand extends GamemasterServerCommand { + public static final String TYPE = "type"; + enum Disaster { RANDOM, HURRICANE, @@ -56,18 +52,12 @@ public static Disaster getRandomDisaster() { } public DisasterCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "gomorrah", "GM calls a disaster, arguments in square brackets are optional. " + - "Usage: /gomorrah [type] " + - "if not type is passed, one is chosen at random. " + - "Type can be one of the following: hurricane, lightning, ob, ob2, ob3, sandstorm, hailstorm, eclipse, solarflare, " + - "supernova, smog, firestorm, traitor. " + - "The type ob, ob2 and ob3 are orbital bombardment with one, two or three random hit locations, at default values " + - "for damage (100) and radius (4)."); + super(server, gameManager, "disaster", Messages.getString("Gamemaster.cmd.disaster.help")); } @Override public List> defineArguments() { - return List.of(new EnumArgument<>("type", Disaster.class, Disaster.RANDOM)); + return List.of(new EnumArgument<>(TYPE, Messages.getString("Gamemaster.cmd.disaster.type"), Disaster.class, Disaster.RANDOM)); } private void runDisasterCommand(int connId, Disaster disaster) { @@ -157,10 +147,10 @@ private void orbitalBombardment(int connId) { */ @Override protected void runAsGM(int connId, Map> args) { - if (args.get("type").getValue().equals(Disaster.RANDOM)) { + if (args.get(TYPE).getValue().equals(Disaster.RANDOM)) { runDisasterCommand(connId, Disaster.getRandomDisaster()); } else { - runDisasterCommand(connId, (Disaster) args.get("type").getValue()); + runDisasterCommand(connId, (Disaster) args.get(TYPE).getValue()); } } } diff --git a/megamek/src/megamek/server/commands/FirestarterCommand.java b/megamek/src/megamek/server/commands/FirestarterCommand.java index 8e4fece3254..2af7f0d4913 100644 --- a/megamek/src/megamek/server/commands/FirestarterCommand.java +++ b/megamek/src/megamek/server/commands/FirestarterCommand.java @@ -1,23 +1,19 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; +import megamek.client.ui.Messages; import megamek.common.Coords; import megamek.common.Hex; import megamek.server.Server; @@ -32,26 +28,28 @@ /** * The Server Command "/firestarter" that will put one hex on fire. * - * @author Luana Scoppio + * @author Luana Coppio */ public class FirestarterCommand extends GamemasterServerCommand { + private static final String FIRESTARTER = "firestarter"; + private static final String X = "x"; + private static final String Y = "y"; + private static final String TYPE = "type"; + public FirestarterCommand(Server server, TWGameManager gameManager) { super(server, gameManager, - "firestarter", - "Starts fire in one specific hex at a specific intensity. " - + "Usage: /firestarter [] " - + "The intensity can be 1=Norma, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV, default is 1."); + FIRESTARTER, + Messages.getString("Gamemaster.cmd.fire.help")); } - @Override public List> defineArguments() { return List.of( - new IntegerArgument("x"), - new IntegerArgument("y"), - new IntegerArgument("intensity", 1, 4, 1)); + new IntegerArgument(X, Messages.getString("Gamemaster.cmd.x")), + new IntegerArgument(Y, Messages.getString("Gamemaster.cmd.y")), + new IntegerArgument(TYPE, Messages.getString("Gamemaster.cmd.fire.type"), 1, 4, 1)); } /** @@ -61,10 +59,9 @@ public List> defineArguments() { */ @Override protected void runAsGM(int connId, Map> args) { - int xArg = (int) args.get("x").getValue() - 1; - int yArg = (int) args.get("y").getValue() -1; - int fireType = (int) args.get("intensity").getValue(); - + int xArg = (int) args.get(X).getValue() - 1; + int yArg = (int) args.get(Y).getValue() - 1; + int fireType = (int) args.get(TYPE).getValue(); igniteHex(new Coords(xArg, yArg), fireType); } @@ -77,5 +74,4 @@ private void igniteHex(Coords coords, int fireType) { throw new IllegalArgumentException("Failed to ignite hex: " + e.getMessage()); } } - } diff --git a/megamek/src/megamek/server/commands/FirestormCommand.java b/megamek/src/megamek/server/commands/FirestormCommand.java index 03d2e03d961..e349392718c 100644 --- a/megamek/src/megamek/server/commands/FirestormCommand.java +++ b/megamek/src/megamek/server/commands/FirestormCommand.java @@ -1,23 +1,19 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; +import megamek.client.ui.Messages; import megamek.common.Coords; import megamek.common.Hex; import megamek.server.Server; @@ -25,7 +21,6 @@ import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -33,24 +28,27 @@ /** * The Server Command "/firestorm" that starts a blazing inferno on the board. * - * @author Luana Scoppio + * @author Luana Coppio */ public class FirestormCommand extends GamemasterServerCommand { + private static final String FIRESTORM = "firestorm"; + private static final String TYPE = "type"; + private static final String PERCENT = "percent"; + public FirestormCommand(Server server, TWGameManager gameManager) { super(server, gameManager, - "firestorm", - "Starts fire in the entire board. " - + "Usage: /firestorm [] []" - + "The intensity can be 1=Normal, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV, default is 1. " - + "The size can be a percent of the board, from 1 to 100, default is 25."); + FIRESTORM, + Messages.getString("Gamemaster.cmd.firestorm.help")); } @Override public List> defineArguments() { - return List.of(new IntegerArgument("intensity", 1, 4, 1), - new IntegerArgument("percent", 1, 100, 25)); + return List.of( + new IntegerArgument(TYPE, Messages.getString("Gamemaster.cmd.fire.type"), 1, 4, 1), + new IntegerArgument(PERCENT, Messages.getString("Gamemaster.cmd.fire.percent"), 1, 100, 25) + ); } /** @@ -61,13 +59,13 @@ public List> defineArguments() { @Override protected void runAsGM(int connId, Map> args) { try { - var fireType = (int) args.get("intensity").getValue(); - var percent = (int) args.get("percent").getValue(); + var fireType = (int) args.get(TYPE).getValue(); + var percent = (int) args.get(PERCENT).getValue(); var coords = getRandomCoords(numberOfCoordsFromPercent(percent)); coords.forEach(c -> igniteHex(c, fireType)); } catch (Exception e) { - logger.error("Failed to ignite fire.", e); - server.sendServerChat(connId, "Failed to ignite fire."); + logger.error(Messages.getString("Gamemaster.cmd.fire.failed"), e); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.fire.failed")); } } @@ -95,7 +93,8 @@ private HashSet getRandomCoords(int size) { private void igniteHex(Coords coords, int fireType) { Hex hex = gameManager.getGame().getBoard().getHex(coords); if (null == hex) { - // Just ignore null hexes... they should not happen, but I don't want to crash the command + // Just ignore null hexes... + // they should not happen, but I don't want to crash the command return; } gameManager.ignite(coords, fireType, gameManager.getvPhaseReport()); diff --git a/megamek/src/megamek/server/commands/GamemasterServerCommand.java b/megamek/src/megamek/server/commands/GamemasterServerCommand.java index 2c56403cc29..cd3674e09bf 100644 --- a/megamek/src/megamek/server/commands/GamemasterServerCommand.java +++ b/megamek/src/megamek/server/commands/GamemasterServerCommand.java @@ -1,23 +1,19 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; +import megamek.client.ui.Messages; import megamek.logging.MMLogger; import megamek.server.Server; import megamek.server.commands.arguments.Argument; @@ -31,7 +27,9 @@ * @author Luana Coppio */ public abstract class GamemasterServerCommand extends ServerCommand { - + private static final String NEWLINE = "\n"; + private static final String WHITESPACE = " "; + private static final String LONG_WHITESPACE = " "; private static final String EMPTY_ARGUMENT = null; protected final TWGameManager gameManager; protected final static MMLogger logger = MMLogger.create(GamemasterServerCommand.class); @@ -82,6 +80,7 @@ public void run(int connId, String[] args) { // Parses the arguments using the definition private Map> parseArguments(String[] args) { + List> argumentDefinitions = defineArguments(); Map> parsedArguments = new HashMap<>(); List positionalArguments = new ArrayList<>(); @@ -94,7 +93,8 @@ private Map> parseArguments(String[] args) { // Separate positional arguments and named arguments boolean namedArgumentStarted = false; - for (String arg : List.of(args)) { + for (int i = 1; i < args.length; i++) { + String arg = args[i]; String[] keyValue = arg.split("="); if (keyValue.length == 2) { @@ -140,6 +140,43 @@ private Map> parseArguments(String[] args) { return parsedArguments; } + public String getHelpHtml() { + return "" + + this.getHelp() + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll(" ", " ") + .replaceAll(NEWLINE, "
")+ + ""; + } + + @Override + public String getHelp() { + StringBuilder help = new StringBuilder(); + help.append(super.getHelp()) + .append(NEWLINE) + .append(Messages.getString("Gamemaster.cmd.help")) + .append(NEWLINE) + .append("/") + .append(getName()); + + for (Argument arg : defineArguments()) { + help.append(WHITESPACE) + .append(arg.getRepr()); + } + + help.append(NEWLINE); + for (var arg : defineArguments()) { + help.append(LONG_WHITESPACE) + .append(arg.getName()) + .append(":") + .append(WHITESPACE) + .append(arg.getHelp()) + .append(NEWLINE); + } + return help.toString(); + } + // The new method for game master commands that uses parsed arguments protected abstract void runAsGM(int connId, Map> args); } diff --git a/megamek/src/megamek/server/commands/HelpCommand.java b/megamek/src/megamek/server/commands/HelpCommand.java index 8c68edde3d3..ceaeb93c94c 100644 --- a/megamek/src/megamek/server/commands/HelpCommand.java +++ b/megamek/src/megamek/server/commands/HelpCommand.java @@ -22,7 +22,7 @@ * The help command lists the other commands when run without arguments. When * run with another command name as an argument, it queries that command for its * help string and send that to the client. - * + * * @author Ben * @since March 30, 2002, 7:03 PM */ @@ -51,8 +51,10 @@ public void run(int connId, String[] args) { + "\" not recognized. Commands available: " + commandList()); } else { - server.sendServerChat(connId, "/" + command.getName() + " : " - + command.getHelp()); + var help = command.getHelp(); + for (String line : help.split("\n")) { + server.sendServerChat(connId, line); + } } } } @@ -64,7 +66,7 @@ private String commandList() { Collections.sort(cmdNames); for (String cmdName : cmdNames) { - if (commandList.length() > 0) { + if (!commandList.isEmpty()) { commandList.append(", "); } commandList.append(cmdName); diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index 3001ae0fe5a..d0d19a94970 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -1,24 +1,19 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; -import megamek.common.options.OptionsConstants; +import megamek.client.ui.Messages; import megamek.server.Server; import megamek.server.commands.arguments.Argument; import megamek.server.commands.arguments.IntegerArgument; @@ -28,24 +23,20 @@ import java.util.Map; /** - * @author Luana Scoppio + * @author Luana Coppio */ public class KillCommand extends GamemasterServerCommand{ - private final TWGameManager gameManager; + public static final String UNIT_ID = "unitID"; /** Creates new KillCommand */ public KillCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "kill", "Allows a GM to destroy a single unit instantly" + - "Usage: "+ - "/kill " + - "where id is the units ID. The units ID can be found by hovering over the unit."); - this.gameManager = gameManager; + super(server, gameManager, "kill", Messages.getString("Gamemaster.cmd.kill.help")); } @Override public List> defineArguments() { - return List.of(new IntegerArgument("unitID", 0, Integer.MAX_VALUE)); + return List.of(new IntegerArgument(UNIT_ID, Messages.getString("Gamemaster.cmd.kill.unitID"))); } /** @@ -53,14 +44,14 @@ public List> defineArguments() { */ @Override protected void runAsGM(int connId, Map> args) { - int unitId = (int) args.get("unitID").getValue(); + int unitId = (int) args.get(UNIT_ID).getValue(); // is the unit on the board? var unit = gameManager.getGame().getEntity(unitId); if (unit == null) { - server.sendServerChat(connId, "Specified unit is not on the board."); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.missingUnit")); return; } - gameManager.destroyEntity(unit, "Act of God", false, false); - server.sendServerChat(unit.getDisplayName() + " has been devastated."); + gameManager.destroyEntity(unit, Messages.getString("Gamemaster.cmd.kill.reason"), false, false); + server.sendServerChat(unit.getDisplayName() + Messages.getString("Gamemaster.cmd.kill.success")); } } diff --git a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java index 9a970eb2d1f..7d9a08b65db 100644 --- a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java +++ b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java @@ -1,62 +1,49 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; -import megamek.common.options.OptionsConstants; +import megamek.client.ui.Messages; import megamek.server.Server; import megamek.server.commands.arguments.Argument; import megamek.server.commands.arguments.IntegerArgument; import megamek.server.props.OrbitalBombardment; import megamek.server.totalwarfare.TWGameManager; -import java.util.ArrayList; import java.util.List; import java.util.Map; /** - * @author Luana Scoppio + * @author Luana Coppio */ public class OrbitalBombardmentCommand extends GamemasterServerCommand { + public static final String X = "x"; + public static final String Y = "y"; + public static final String DMG = "dmg"; + public static final String RADIUS = "radius"; + public OrbitalBombardmentCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "ob", "GM orders an unknown warship to strike the board doing of 100 damage with a 4 hex radius, to be exploded at" - + "the end of the next weapons attack phase." - + "Allowed formats: " - + "/ob and" - + "/ob [dmg=#] [r=#] and" - + "/ob and " - + "/ob " - + "X and Y are the hex position where is x=column number and y=row number (hex 0923 would be x=9 and y=23), " - + "dmg is the amount of damage at impact point, default is 100, the damage drops off linearly according to the radius. " - + "r is radius, defaults to 4. " - + " Example: /ob 10 10 dmg=120 r=4 and /ob 10 10 120 4 are equivalent. " - + " Parameters in square brackets may be omitted, and using named variables permits to write them out of order. " - + " Example: /ob 10 10 r=12 dmg=300"); + super(server, gameManager, "ob", Messages.getString("Gamemaster.cmd.orbitalbombardment.help")); } @Override public List> defineArguments() { return List.of( - new IntegerArgument("x"), - new IntegerArgument("y"), - new IntegerArgument("dmg", 10, Integer.MAX_VALUE, 100), - new IntegerArgument("r", 1, 10, 4)); + new IntegerArgument(X, Messages.getString("Gamemaster.cmd.x")), + new IntegerArgument(Y, Messages.getString("Gamemaster.cmd.y")), + new IntegerArgument(DMG, Messages.getString("Gamemaster.cmd.orbitalbombardment.dmg"), 10, Integer.MAX_VALUE, 100), + new IntegerArgument(RADIUS, Messages.getString("Gamemaster.cmd.orbitalbombardment.radius"), 1, 10, 4)); } /** @@ -67,19 +54,20 @@ protected void runAsGM(int connId, Map> args) { var orbitalBombardmentBuilder = new OrbitalBombardment.Builder(); - orbitalBombardmentBuilder.x((int) args.get("x").getValue() - 1).y((int) args.get("y").getValue() - 1); - orbitalBombardmentBuilder.radius((int) args.get("r").getValue()); - orbitalBombardmentBuilder.damageFactor((int) args.get("dmg").getValue()); + orbitalBombardmentBuilder.x((int) args.get(X).getValue() - 1) + .y((int) args.get(Y).getValue() - 1) + .radius((int) args.get(RADIUS).getValue()) + .damage((int) args.get(DMG).getValue()); var orbitalBombardment = orbitalBombardmentBuilder.build(); // is the hex on the board? if (!gameManager.getGame().getBoard().contains(orbitalBombardment.getX(), orbitalBombardment.getY())) { - server.sendServerChat(connId, "Specified hex is not on the board."); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.orbitalbombardment.error.outofbounds")); return; } gameManager.addScheduledOrbitalBombardment(orbitalBombardment); - server.sendServerChat("Orbital bombardment incoming!"); + server.sendServerChat(Messages.getString("Gamemaster.cmd.orbitalbombardment.success")); } } diff --git a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java index 75373384714..7286cc99955 100644 --- a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java +++ b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java @@ -1,26 +1,19 @@ /* - * Copyright (C) 2024 Luana Scoppio (luana.coppio@gmail.com) - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; -import megamek.common.planetaryconditions.Fog; -import megamek.common.planetaryconditions.Wind; +import megamek.client.ui.Messages; import megamek.server.Server; import megamek.server.commands.arguments.Argument; import megamek.server.totalwarfare.TWGameManager; @@ -29,13 +22,13 @@ import java.util.Map; /** - * @author Luana Scoppio + * @author Luana Coppio */ public class RemoveSmokeCommand extends GamemasterServerCommand { /** Creates new KillCommand */ public RemoveSmokeCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "nosmoke", "GM removes all smoke cloud hexes. Usage: /nosmoke"); + super(server, gameManager, "nosmoke", Messages.getString("Gamemaster.cmd.removesmoke.help")); } @Override @@ -46,6 +39,6 @@ public List> defineArguments() { @Override protected void runAsGM(int connId, Map> args) { gameManager.getSmokeCloudList().forEach(gameManager::removeSmokeTerrain); - server.sendServerChat(connId, "GM cleared the smoke clouds."); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.removesmoke.success")); } } diff --git a/megamek/src/megamek/server/commands/TraitorCommand.java b/megamek/src/megamek/server/commands/TraitorCommand.java index 6b19396f8bb..a03e977511d 100644 --- a/megamek/src/megamek/server/commands/TraitorCommand.java +++ b/megamek/src/megamek/server/commands/TraitorCommand.java @@ -1,20 +1,15 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.commands; @@ -25,7 +20,7 @@ /** * The Server Command "/traitor" that will switch an entity's owner to another player. - * + * * @author Jay Lawson (Taharqa) */ public class TraitorCommand extends ServerCommand { @@ -43,7 +38,7 @@ public TraitorCommand(Server server, TWGameManager gameManager) { /** * Run this command with the arguments supplied - * + * * @see megamek.server.commands.ServerCommand#run(int, java.lang.String[]) */ @Override diff --git a/megamek/src/megamek/server/commands/arguments/Argument.java b/megamek/src/megamek/server/commands/arguments/Argument.java index 39d4aa056c3..e04da44df35 100644 --- a/megamek/src/megamek/server/commands/arguments/Argument.java +++ b/megamek/src/megamek/server/commands/arguments/Argument.java @@ -3,11 +3,12 @@ // A generic Argument class that can be extended for different argument types public abstract class Argument { protected T value; - private final String name; + private final String description; - public Argument(String name) { + public Argument(String name, String description) { this.name = name; + this.description = description; } public T getValue() { @@ -18,5 +19,15 @@ public String getName() { return name; } + public String getDescription() { + return description; + } + + public String getRepr() { + return "<" + getName() + ">"; + } + + public abstract String getHelp(); + public abstract void parse(String input) throws IllegalArgumentException; } diff --git a/megamek/src/megamek/server/commands/arguments/EnumArgument.java b/megamek/src/megamek/server/commands/arguments/EnumArgument.java index 5c51072579b..f317027432f 100644 --- a/megamek/src/megamek/server/commands/arguments/EnumArgument.java +++ b/megamek/src/megamek/server/commands/arguments/EnumArgument.java @@ -1,13 +1,15 @@ package megamek.server.commands.arguments; +import megamek.client.ui.Messages; + import java.util.Arrays; public class EnumArgument> extends Argument { private final Class enumType; private final E defaultValue; - public EnumArgument(String name, Class enumType, E defaultValue) { - super(name); + public EnumArgument(String name, String description, Class enumType, E defaultValue) { + super(name, description); this.enumType = enumType; this.defaultValue = defaultValue; } @@ -41,4 +43,14 @@ public E getValue() { } return value; } + + @Override + public String getHelp() { + return getDescription() + + " (" + String.join(", ", Arrays.toString(enumType.getEnumConstants())) + ")" + + (defaultValue != null ? + " [default: " + defaultValue + "]. " + Messages.getString("Gamemaster.cmd.params.optional") : + " " + Messages.getString("Gamemaster.cmd.params.required")); + } + } diff --git a/megamek/src/megamek/server/commands/arguments/IntegerArgument.java b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java index 26340b84879..e3d7b27d962 100644 --- a/megamek/src/megamek/server/commands/arguments/IntegerArgument.java +++ b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java @@ -1,20 +1,24 @@ package megamek.server.commands.arguments; +import megamek.client.ui.Messages; + +import java.util.Arrays; + public class IntegerArgument extends Argument { private final int minValue; private final int maxValue; private final Integer defaultValue; - public IntegerArgument(String name) { - this(name, Integer.MIN_VALUE, Integer.MAX_VALUE, null); + public IntegerArgument(String name, String description) { + this(name, description, Integer.MIN_VALUE, Integer.MAX_VALUE, null); } - public IntegerArgument(String name, int minValue, int maxValue) { - this(name, minValue, maxValue, null); + public IntegerArgument(String name, String description, int minValue, int maxValue) { + this(name, description, minValue, maxValue, null); } - public IntegerArgument(String name, int minValue, int maxValue, Integer defaultValue) { - super(name); + public IntegerArgument(String name, String description, int minValue, int maxValue, Integer defaultValue) { + super(name, description); this.minValue = minValue; this.maxValue = maxValue; this.defaultValue = defaultValue; @@ -60,4 +64,13 @@ public int getMinValue() { public int getMaxValue() { return maxValue; } + + @Override + public String getHelp() { + return getDescription() + (minValue == Integer.MIN_VALUE ? "": " Min: " + minValue) + + (defaultValue != null ? + " [default: " + defaultValue + "]. " + Messages.getString("Gamemaster.cmd.params.optional") : + " " + Messages.getString("Gamemaster.cmd.params.required")); + } + } diff --git a/megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java b/megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java new file mode 100644 index 00000000000..fc857b1148e --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java @@ -0,0 +1,77 @@ +/* + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ +package megamek.server.commands.arguments; + +import megamek.client.ui.Messages; + +import java.util.Optional; + +/** + * @author Luana Coppio + */ +public class OptionalIntegerArgument extends Argument> { + private final int minValue; + private final int maxValue; + + public OptionalIntegerArgument(String name, String description) { + this(name, description, Integer.MIN_VALUE, Integer.MAX_VALUE); + } + + public OptionalIntegerArgument(String name, String description, int minValue, int maxValue) { + super(name, description); + this.minValue = minValue; + this.maxValue = maxValue; + } + + @Override + public Optional getValue() { + return value; + } + + @Override + public void parse(String input) throws IllegalArgumentException { + if (input == null) { + value = Optional.empty(); + return; + } + try { + int parsedValue = Integer.parseInt(input); + if (parsedValue < getMinValue() || parsedValue > getMaxValue()) { + throw new IllegalArgumentException(getName() + Messages.getString("Gamemaster.cmd.error.integerparse") + getMinValue() + " and " + getMaxValue()); + } + value = Optional.of(parsedValue); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(getName() + " must be an integer."); + } + } + + public int getMinValue() { + return minValue; + } + + public int getMaxValue() { + return maxValue; + } + + @Override + public String getRepr() { + return "[" + getName() + "]"; + } + + @Override + public String getHelp() { + return getDescription() + (minValue == Integer.MIN_VALUE ? "": " Min: " + minValue) + + (maxValue == Integer.MAX_VALUE ? "": " Max: " + maxValue) + ". " + Messages.getString("Gamemaster.cmd.params.optional"); + } +} diff --git a/megamek/src/megamek/server/props/OrbitalBombardment.java b/megamek/src/megamek/server/props/OrbitalBombardment.java index 0bfa383c45f..972011043ac 100644 --- a/megamek/src/megamek/server/props/OrbitalBombardment.java +++ b/megamek/src/megamek/server/props/OrbitalBombardment.java @@ -1,20 +1,15 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * - * This file is part of MegaMek. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * MegaMek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MegaMek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. */ package megamek.server.props; @@ -25,13 +20,13 @@ * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with * regular/linear damage droppoff. * - * @author Luana Scoppio + * @author Luana Coppio */ public class OrbitalBombardment { private final int x; private final int y; - private final int damageFactor; + private final int damage; private final int radius; private final Coords coords; /** @@ -43,7 +38,7 @@ public class OrbitalBombardment { private OrbitalBombardment(Builder builder) { this.x = builder.x; this.y = builder.y; - this.damageFactor = builder.damageFactor; + this.damage = builder.damage; this.radius = builder.radius; this.coords = new Coords(x, y); } @@ -60,8 +55,8 @@ public int getY() { return y; } - public int getDamageFactor() { - return damageFactor; + public int getDamage() { + return damage; } public int getRadius() { @@ -77,7 +72,7 @@ public int getRadius() { public static class Builder { private int x; private int y; - private int damageFactor = 10; + private int damage = 10; private int radius = 4; public Builder x(int x) { @@ -90,8 +85,8 @@ public Builder y(int y) { return this; } - public Builder damageFactor(int damageFactor) { - this.damageFactor = damageFactor; + public Builder damage(int damage) { + this.damage = damage; return this; } diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 57c86de9f08..05e4fdb164d 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -20306,17 +20306,16 @@ private void explosionDamage(Coords position, Vector vDesc, Entity e, in } private void orbitalBombardmentDamage(Coords position, Vector vDesc, Entity e, int damage) { + var distanceFromGroundZero = e.getPosition().distance(position); while (damage > 0) { int cluster = Math.min(5, damage); int table = ToHitData.HIT_NORMAL; int hitSide = ToHitData.SIDE_RANDOM; + if (e instanceof ProtoMek) { table = ToHitData.HIT_SPECIAL_PROTO; - } else if (e instanceof Mek) { - table = ToHitData.HIT_ABOVE; - hitSide = e.sideTable(position); - } else if (e instanceof Tank) { - if (e.isAirborneVTOLorWIGE()) { + } else if ((e instanceof Mek) || (e instanceof Tank)) { + if (distanceFromGroundZero == 0) { table = ToHitData.HIT_ABOVE; } hitSide = e.sideTable(position); @@ -20409,20 +20408,19 @@ public void addScheduledOrbitalBombardment(OrbitalBombardment orbitalBombardment } private void drawOrbitalBombardmentOnBoard(OrbitalBombardment orbitalBombardment) { - for (var coord : orbitalBombardment.getCoords().allAtDistanceOrLess(orbitalBombardment.getRadius())) { getGame().getBoard().addSpecialHexDisplay( coord, new SpecialHexDisplay( SpecialHexDisplay.Type.ORBITAL_BOMBARDMENT, getGame().getRoundCount(), - getGame().getPlayersList().get(0), // It doesnt matter which is the player, but I dont want to cause a nullpointer. + getGame().getPlayersList().get(0), // It doesnt the player, I just dont want to cause a nullpointer. "Orbital bombardment incoming, landing on round " + getGame().getRoundCount() + ", fired by an unknown warship in orbit", SpecialHexDisplay.SHD_OBSCURED_ALL) ); - sendChangedHex(coord); + sendChangedHex(coords); } } @@ -20447,13 +20445,21 @@ void resolveScheduledNukes() { * explode any scheduled orbital bombardments */ void resolveScheduledOrbitalBombardments() { + if (scheduledOrbitalBombardment.isEmpty()) { + return; + } + + var r = new Report(1303, Report.PUBLIC); + r.indent(); + r.newlines = 2; + getvPhaseReport().add(r); + scheduledOrbitalBombardment - .forEach(ob -> doOrbitalBombardment(new Coords(ob.getX(), ob.getY()), ob.getDamageFactor(), ob.getRadius())); + .forEach(ob -> doOrbitalBombardment(new Coords(ob.getX(), ob.getY()), ob.getDamage(), ob.getRadius())); scheduledOrbitalBombardment.clear(); getGame().resetOrbitalBombardmentAttacks(); - // All right. We're done. - var r = new Report(1301, Report.PUBLIC); + r = new Report(1301, Report.PUBLIC); r.indent(); r.newlines = 2; getvPhaseReport().add(r); @@ -20480,10 +20486,10 @@ public void doNuclearExplosion(Coords position, int nukeType, Vector vDe /** * do an orbital bombardment * @param position the position that will be hit by the orbital bombardment - * @param damageFactor the factor by which the base damage will be multiplied + * @param damage the damage of the bombardment at target hex * @param radius the radius which the damage will hit */ - public void doOrbitalBombardment(Coords position, int damageFactor, int radius) { + public void doOrbitalBombardment(Coords position, int damage, int radius) { Report r = new Report(1300, Report.PUBLIC); r.indent(); r.add(position.getBoardNum(), true); @@ -20494,9 +20500,8 @@ public void doOrbitalBombardment(Coords position, int damageFactor, int radius) Vector tmpV = new Vector<>(); Vector blastedUnitsVec = new Vector<>(); int range = radius + 1; - int baseDamage = damageFactor * 10; - var degradation = baseDamage / range; - doExplosion(baseDamage, degradation , false, position, true, tmpV, + var degradation = damage / range; + doExplosion(damage, degradation , false, position, true, tmpV, blastedUnitsVec, -1, true); Report.indentAll(tmpV, 2); getvPhaseReport().addAll(tmpV); From 4d3ecdabe690ba632810c2793102528a1c2a7b84 Mon Sep 17 00:00:00 2001 From: Coppio Date: Tue, 12 Nov 2024 13:58:11 -0300 Subject: [PATCH 35/57] chore: gm improving gm commands, removing unnecessary options --- megamek/i18n/megamek/common/options/messages.properties | 2 -- megamek/src/megamek/common/options/GameOptions.java | 1 - megamek/src/megamek/common/options/OptionsConstants.java | 1 - megamek/src/megamek/server/commands/KillCommand.java | 4 ---- .../server/commands/OrbitalBombardmentCommand.java | 8 ++++---- 5 files changed, 4 insertions(+), 12 deletions(-) diff --git a/megamek/i18n/megamek/common/options/messages.properties b/megamek/i18n/megamek/common/options/messages.properties index b99011e2e51..17f1fe80a6e 100644 --- a/megamek/i18n/megamek/common/options/messages.properties +++ b/megamek/i18n/megamek/common/options/messages.properties @@ -140,8 +140,6 @@ GameOptionsInfo.option.allow_nukes.displayableName=Allow command-line nukes. GameOptionsInfo.option.allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. GameOptionsInfo.option.really_allow_nukes.displayableName=REALLY allow command-line nukes. GameOptionsInfo.option.really_allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. -GameOptionsInfo.option.gm_can_kill_units.displayableName=Allow command-line kill (GM only). -GameOptionsInfo.option.gm_can_kill_units.description=This must be checked to allow the GM to kill units using command line. If this is not checked, the command is disabled. GameOptionsInfo.group.advancedRules.displayableName=Advanced Rules diff --git a/megamek/src/megamek/common/options/GameOptions.java b/megamek/src/megamek/common/options/GameOptions.java index c780f42b731..56875bb6c21 100755 --- a/megamek/src/megamek/common/options/GameOptions.java +++ b/megamek/src/megamek/common/options/GameOptions.java @@ -93,7 +93,6 @@ public synchronized void initialize() { addOption(allowed, OptionsConstants.ALLOWED_NO_CLAN_PHYSICAL, false); addOption(allowed, OptionsConstants.ALLOWED_ALLOW_NUKES, false); addOption(allowed, OptionsConstants.ALLOWED_REALLY_ALLOW_NUKES, false); - addOption(allowed, OptionsConstants.ALLOWED_GM_CAN_KILL_UNITS, false); IBasicOptionGroup advancedRules = addGroup("advancedRules"); addOption(advancedRules, OptionsConstants.ADVANCED_MINEFIELDS, false); diff --git a/megamek/src/megamek/common/options/OptionsConstants.java b/megamek/src/megamek/common/options/OptionsConstants.java index 5af5898077b..6850acaf3fb 100644 --- a/megamek/src/megamek/common/options/OptionsConstants.java +++ b/megamek/src/megamek/common/options/OptionsConstants.java @@ -330,7 +330,6 @@ public class OptionsConstants { public static final String ALLOWED_NO_CLAN_PHYSICAL = "no_clan_physical"; public static final String ALLOWED_ALLOW_NUKES = "allow_nukes"; public static final String ALLOWED_REALLY_ALLOW_NUKES = "really_allow_nukes"; - public static final String ALLOWED_GM_CAN_KILL_UNITS = "gm_can_kill_units"; public static final String ADVANCED_MINEFIELDS = "minefields"; public static final String ADVANCED_HIDDEN_UNITS = "hidden_units"; public static final String ADVANCED_BLACK_ICE= "black_ice"; diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index bc436c49380..45f2b6d7dca 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -45,10 +45,6 @@ public KillCommand(Server server, TWGameManager gameManager) { public void run(int connId, String[] args) { // Check to make sure gm kills are allowed! - if (!(server.getGame().getOptions().booleanOption(OptionsConstants.ALLOWED_GM_CAN_KILL_UNITS))) { - server.sendServerChat(connId, "Command-line kill is not enabled in this game."); - return; - } if (!isGM(connId)) { server.sendServerChat(connId, "You are not a Game Master."); return; diff --git a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java index c3d31e2202f..5424526f93d 100644 --- a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java +++ b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java @@ -35,12 +35,12 @@ public OrbitalBombardmentCommand(Server server, TWGameManager gameManager) { super(server, "ob", "GM Drops a bomb onto the board doing of 100 damage with a 3 hex radius, to be exploded at" + "the end of the next weapons attack phase." + "Allowed formats:"+ - "/bomb and" + - "/bomb [factor=10] [radius=4]" + - "the damage at impact point is 10 times the factor, default is 10. " + + "/ob and" + + "/ob [factor=#] [radius=#]" + + "the damage at impact point is the factor times 10, default factor value is 10. " + "and hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23), the explosion blast radius default " + "is equal to 4, it automatically applies a linear damage dropoff each hex away from the center." + - " All parameters in square brackets may be ommited. " + + " All parameters in square brackets may be omitted. " + " Example: /ob 10 10 factor=12 "); this.gameManager = gameManager; } From 36b6b37338f76d5b293b352262075af51a6f5700 Mon Sep 17 00:00:00 2001 From: Coppio Date: Thu, 14 Nov 2024 01:33:17 -0300 Subject: [PATCH 36/57] feat: commands need a second pass for test and eval --- .../i18n/megamek/client/messages.properties | 4 +- .../megamek/client/messages_es.properties | 3 +- .../megamek/client/messages_ru.properties | 3 +- .../megamek/common/report-messages.properties | 3 +- .../client/ui/swing/CommonMenuBar.java | 5 - .../src/megamek/client/ui/swing/MapMenu.java | 144 +++++++++++++---- .../client/ui/swing/MovementDisplay.java | 37 +++-- .../client/ui/swing/boardview/BoardView.java | 37 +++++ .../swing/boardview/TerrainShadowHelper.java | 8 +- .../gmCommands/GamemasterCommandPanel.java | 82 ++++++++++ .../client/ui/swing/minimap/Minimap.java | 3 + .../ui/swing/tileset/TilesetManager.java | 8 + megamek/src/megamek/common/Board.java | 29 +++- megamek/src/megamek/common/Entity.java | 10 ++ megamek/src/megamek/common/Game.java | 28 +++- .../src/megamek/common/SpecialHexDisplay.java | 19 +-- .../common/weapons/AreaEffectHelper.java | 19 ++- .../commands/ChangeOwnershipCommand.java | 67 ++++---- .../server/commands/ChangeWeatherCommand.java | 98 ++++++------ .../server/commands/DisasterCommand.java | 148 +++++++++++++++--- .../server/commands/FirestarterCommand.java | 81 ++++++++++ .../server/commands/FirestormCommand.java | 103 ++++++++++++ .../commands/GamemasterServerCommand.java | 145 +++++++++++++++++ megamek/src/megamek/server/commands/IsGM.java | 13 -- .../megamek/server/commands/KillCommand.java | 52 +++--- .../commands/OrbitalBombardmentCommand.java | 102 +++++------- .../server/commands/RemoveSmokeCommand.java | 36 ++--- .../server/commands/arguments/Argument.java | 22 +++ .../commands/arguments/EnumArgument.java | 44 ++++++ .../commands/arguments/IntegerArgument.java | 63 ++++++++ .../server/props/OrbitalBombardment.java | 10 +- .../server/totalwarfare/TWGameManager.java | 93 ++++++----- 32 files changed, 1149 insertions(+), 370 deletions(-) create mode 100644 megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java create mode 100644 megamek/src/megamek/server/commands/FirestarterCommand.java create mode 100644 megamek/src/megamek/server/commands/FirestormCommand.java create mode 100644 megamek/src/megamek/server/commands/GamemasterServerCommand.java delete mode 100644 megamek/src/megamek/server/commands/IsGM.java create mode 100644 megamek/src/megamek/server/commands/arguments/Argument.java create mode 100644 megamek/src/megamek/server/commands/arguments/EnumArgument.java create mode 100644 megamek/src/megamek/server/commands/arguments/IntegerArgument.java diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 4c96ba383f0..9cc5a513173 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -2693,7 +2693,6 @@ MovementDisplay.moveLowerElevation=Go Down MovementDisplay.BackWardsElevationChange=Moving Backwards over an elevation change.\n MovementDisplay.CarefulStand.title=Careful Stand? MovementDisplay.CarefulStand.message=Do you wish to use careful stand?\n -MovementDisplay.Traitor=Traitor Unit MovementDisplay.NotUpToSpeed=Selected unit cannot run/flank because it has poor performance and is not up to speed MovementDisplay.UpToSpeed=Selected unit is up to speed so it can run/flank MovementDisplay.UnjamRAC.title=Unjam? @@ -4630,6 +4629,9 @@ CMVPanel.font=Font: Gamemaster.Gamemaster=Gamemaster Gamemaster.EditDamage=Edit Damage Gamemaster.Configure=Configure +Gamemaster.Traitor=Traitor Unit +Gamemaster.SpecialCommands=Special Commands +Gamemaster.KillUnit=Kill Unit # Scenario Chooser ScenarioChooser.title=Choose Scenario diff --git a/megamek/i18n/megamek/client/messages_es.properties b/megamek/i18n/megamek/client/messages_es.properties index 086d314aee1..98e1e7aeb78 100644 --- a/megamek/i18n/megamek/client/messages_es.properties +++ b/megamek/i18n/megamek/client/messages_es.properties @@ -2438,7 +2438,6 @@ MovementDisplay.moveLowerElevation=Bajar MovementDisplay.BackWardsElevationChange=Moverse hacia atrás sobre un cambio de elevación.\n MovementDisplay.CarefulStand.title=¿Mantenerse con Precaución? MovementDisplay.CarefulStand.message=¿Desea Mantenerse con Precaución?\n -MovementDisplay.Traitor=Unidad Traidora MovementDisplay.NotUpToSpeed=La unidad seleccionada no puede correr/flanquear porque tiene un rendimiento deficiente y no está al día MovementDisplay.UpToSpeed=La unidad seleccionada está al día para que pueda correr/flanquear MovementDisplay.UnjamRAC.title=¿Destrabar? @@ -4267,3 +4266,5 @@ ForceGeneratorDialog.reinforced=Reforzado\ ForceGeneratorDialog.understrength=Más Débiles\ ForceGeneratorDialog.default=Predeterminado ForceGeneratorDialog.noCrew=Sin tripulación + +Gamemaster.Traitor=Unidad Traidora \ No newline at end of file diff --git a/megamek/i18n/megamek/client/messages_ru.properties b/megamek/i18n/megamek/client/messages_ru.properties index 06812521aca..69f44bd0bed 100644 --- a/megamek/i18n/megamek/client/messages_ru.properties +++ b/megamek/i18n/megamek/client/messages_ru.properties @@ -1373,7 +1373,6 @@ MovementDisplay.moveLowerElevation=Спуститься MovementDisplay.BackWardsElevationChange=Преодоление смены уровня высоты реверсом хода.\n MovementDisplay.CarefulStand.title=Использовать осторожную стойку? MovementDisplay.CarefulStand.message=Хотите ли вы использовать осторожную стойку?\n -MovementDisplay.Traitor=Юнит предатель MovementDisplay.NotUpToSpeed=Выбранный юнит не может бежать/ехать быстро потому что у него плохая форма и он не достигнет скорости MovementDisplay.UpToSpeed=Выбранному юниту хватает скорости и он может бежать/ехать быстро MovementDisplay.UnjamRAC.title=Расклинить? @@ -2258,3 +2257,5 @@ BotConfigDialog.princessHelp.title=Справка по Принцессе SavePrincessDialog.question=Сохранить изменения в эту конфигурацию? SavePrincessDialog.saveTargets=Сохранить список стратегичеких целей? + +Gamemaster.Traitor=Юнит предатель \ No newline at end of file diff --git a/megamek/i18n/megamek/common/report-messages.properties b/megamek/i18n/megamek/common/report-messages.properties index 20be24c6ee5..5bb6ad59327 100755 --- a/megamek/i18n/megamek/common/report-messages.properties +++ b/megamek/i18n/megamek/common/report-messages.properties @@ -56,8 +56,9 @@ 1242=no effect #1300s - Orbital Bombardment related -1300=An orbital bombardment hit hex !!! +1300=Orbital bombardment hit hex !!! 1301=End of orbital bombardment resolution +1302= has commenced an orbital bombardment, it will land at the end of the next weapons phase at hex . # 1500s - ammo handling related 1500= () selected diff --git a/megamek/src/megamek/client/ui/swing/CommonMenuBar.java b/megamek/src/megamek/client/ui/swing/CommonMenuBar.java index a79418fee26..b992fc2d72b 100644 --- a/megamek/src/megamek/client/ui/swing/CommonMenuBar.java +++ b/megamek/src/megamek/client/ui/swing/CommonMenuBar.java @@ -356,11 +356,6 @@ public CommonMenuBar() { toggleCFWarning.setToolTipText(Messages.getString("CommonMenuBar.viewToggleCFWarningToolTip")); toggleCFWarning.setSelected(GUIP.getShowCFWarnings()); - /* - * TODO: moveTraitor = createMenuItem(menu, - * getString("CommonMenuBar.moveTraitor"), MovementDisplay.MOVE_TRAITOR); - */ - // Create the Help menu menu = new JMenu(Messages.getString("CommonMenuBar.HelpMenu")); menu.setMnemonic(VK_H); diff --git a/megamek/src/megamek/client/ui/swing/MapMenu.java b/megamek/src/megamek/client/ui/swing/MapMenu.java index 3fad530711a..743528ea0d2 100644 --- a/megamek/src/megamek/client/ui/swing/MapMenu.java +++ b/megamek/src/megamek/client/ui/swing/MapMenu.java @@ -24,22 +24,14 @@ import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.math.BigInteger; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.StringTokenizer; -import java.util.Vector; - -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import javax.swing.UIManager; +import java.util.*; + +import javax.swing.*; import megamek.client.Client; import megamek.client.event.BoardViewEvent; import megamek.client.ui.Messages; +import megamek.client.ui.swing.gmCommands.GamemasterCommandPanel; import megamek.client.ui.swing.lobby.LobbyUtility; import megamek.common.*; import megamek.common.Building.DemolitionCharge; @@ -54,6 +46,8 @@ import megamek.common.weapons.other.CLFireExtinguisher; import megamek.common.weapons.other.ISFireExtinguisher; import megamek.logging.MMLogger; +import megamek.server.Server; +import megamek.server.commands.*; /** * Context menu for the board. @@ -209,23 +203,6 @@ private boolean createMenu() { } } - - // Traitor Command - JMenuItem item = new JMenuItem(Messages.getString("MovementDisplay.Traitor")); - item.setActionCommand(MovementDisplay.MoveCommand.MOVE_TRAITOR.getCmd()); - item.addActionListener(evt -> { - try { - if (currentPanel instanceof MovementDisplay) { - ((MovementDisplay) currentPanel).actionPerformed(evt); - } - } catch (Exception ex) { - logger.error(ex, ""); - } - }); - - if (game.getPhase().isMovement()) { - add(item); - } } menu = touchOffExplosivesMenu(); @@ -433,10 +410,15 @@ private JMenu createGamemasterMenu() { JMenu dmgMenu = new JMenu(Messages.getString("Gamemaster.EditDamage")); JMenu cfgMenu = new JMenu(Messages.getString("Gamemaster.Configure")); + JMenu traitorMenu = new JMenu(Messages.getString("Gamemaster.Traitor")); + JMenu killMenu = new JMenu(Messages.getString("Gamemaster.KillUnit")); + JMenu specialCommandsMenu = createGMSpecialCommandsMenu(); var entities = client.getGame().getEntitiesVector(coords); for (Entity entity : entities) { dmgMenu.add(createUnitEditorMenuItem(entity)); cfgMenu.add(createCustomMekMenuItem(entity)); + traitorMenu.add(createTraitorMenuItem(entity)); + killMenu.add(createKillMenuItem(entity)); } if (dmgMenu.getItemCount() != 0) { menu.add(dmgMenu); @@ -444,10 +426,41 @@ private JMenu createGamemasterMenu() { if (cfgMenu.getItemCount() != 0) { menu.add(cfgMenu); } + if (traitorMenu.getItemCount() != 0) { + menu.add(traitorMenu); + } + if (killMenu.getItemCount() != 0) { + menu.add(killMenu); + } + menu.add(specialCommandsMenu); return menu; } } + private record Tuple(String name, GamemasterServerCommand command) {} + + private JMenu createGMSpecialCommandsMenu() { + JMenu menu = new JMenu(Messages.getString("Gamemaster.SpecialCommands")); + var commands = List.of( + new Tuple("Kill Unit", new KillCommand(null, null)), + new Tuple("Change Ownership", new ChangeOwnershipCommand(null, null)), + new Tuple("Change Weather", new ChangeWeatherCommand(null, null)), + new Tuple("Disasters", new DisasterCommand(null, null)), + new Tuple("Orbital Bombardment", new OrbitalBombardmentCommand(null, null)), + new Tuple("Remove Smoke", new RemoveSmokeCommand(null, null)), + new Tuple("Firestarter", new FirestarterCommand(null, null)), + new Tuple("Firestorm", new FirestormCommand(null, null)) + ); + + for (var cmd : commands) { + JMenuItem item = new JMenuItem(cmd.name()); + item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd.command()).setVisible(true)); + menu.add(item); + } + + return menu; + } + JMenuItem createCustomMekMenuItem(Entity entity) { JMenuItem item = new JMenuItem(entity.getDisplayName()); item.addActionListener(evt -> { @@ -473,6 +486,79 @@ JMenuItem createUnitEditorMenuItem(Entity entity) { return item; } + private JMenuItem createTraitorMenuItem(Entity en) { + // Traitor Command + JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.Traitor") + " " + en.getDisplayName()); + item.addActionListener(evt -> { + gui.getBoardView().setShouldIgnoreKeys(false); + var players = client.getGame().getPlayersList(); + Integer[] playerIds = new Integer[players.size() - 1]; + String[] playerNames = new String[players.size() - 1]; + String[] options = new String[players.size() - 1]; + + Player currentOwner = en.getOwner(); + // Loop through the players vector and fill in the arrays + int idx = 0; + for (var player : players) { + if (player.getName().equals(currentOwner.getName()) + || (player.getTeam() == Player.TEAM_UNASSIGNED)) { + continue; + } + playerIds[idx] = player.getId(); + playerNames[idx] = player.getName(); + options[idx] = player.getName() + " (ID: " + player.getId() + ")"; + idx++; + } + + // No players available? + if (idx == 0) { + JOptionPane.showMessageDialog(gui.getFrame(), + "No players available. Units cannot be traitored to players " + + "that aren't assigned to a team."); + return; + } + + // Dialog for choosing which player to transfer to + String option = (String) JOptionPane.showInputDialog(gui.getFrame(), + "Choose the player to gain ownership of this unit (" + en.getDisplayName() + ") when it turns traitor", + "Traitor", JOptionPane.QUESTION_MESSAGE, null, + options, options[0]); + + // Verify that we have a valid option... + if (option != null) { + // Now that we've selected a player, correctly associate the ID and name + int id = playerIds[Arrays.asList(options).indexOf(option)]; + String name = playerNames[Arrays.asList(options).indexOf(option)]; + + // And now we perform the actual transfer + int confirm = JOptionPane.showConfirmDialog( + gui.getFrame(), + en.getDisplayName() + " will switch to " + name + + "'s side at the end of this turn. Are you sure?", + "Confirm", + JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION) { + client.sendChat(String.format("/changeOwner %d %d", en.getId(), id)); + } + } + }); + + return item; + } + + private JMenuItem createKillMenuItem(Entity en) { + JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.KillUnit") + " " + en.getDisplayName()); + item.addActionListener(evt -> { + int confirm = JOptionPane.showConfirmDialog( + gui.getFrame(), + "Are you sure you want to kill " + en.getDisplayName() + "?", "Confirm", JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION) { + client.sendChat(String.format("/kill %d", en.getId())); + } + }); + return item; + } + private JMenu createSelectMenu() { JMenu menu = new JMenu("Select"); // add select options diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index 57b1492f687..47ef702b5f8 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -19,20 +19,6 @@ */ package megamek.client.ui.swing; -import static megamek.common.MiscType.F_CHAFF_POD; -import static megamek.common.options.OptionsConstants.ADVGRNDMOV_TACOPS_ZIPLINES; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.InputEvent; -import java.awt.event.MouseEvent; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - import megamek.client.event.BoardViewEvent; import megamek.client.ui.Messages; import megamek.client.ui.SharedUtility; @@ -62,6 +48,19 @@ import megamek.common.preference.PreferenceManager; import megamek.logging.MMLogger; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.util.List; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static megamek.common.MiscType.F_CHAFF_POD; +import static megamek.common.options.OptionsConstants.ADVGRNDMOV_TACOPS_ZIPLINES; + public class MovementDisplay extends ActionPhaseDisplay { private static final MMLogger logger = MMLogger.create(MovementDisplay.class); @@ -230,7 +229,7 @@ public String toString() { } public String getHotKeyDesc() { - String result = ""; + String result; String msgNext = Messages.getString("Next"); String msgPrevious = Messages.getString("Previous"); @@ -5297,11 +5296,15 @@ public synchronized void actionPerformed(ActionEvent ev) { String[] playerNames = new String[players.size() - 1]; String[] options = new String[players.size() - 1]; Entity e = ce(); + if (e == null) { + return; + } + Player currentOwner = e.getOwner(); // Loop through the players vector and fill in the arrays int idx = 0; for (var player : players) { - if (player.getName().equals(clientgui.getClient().getLocalPlayer().getName()) + if (player.getName().equals(currentOwner.getName()) || (player.getTeam() == Player.TEAM_UNASSIGNED)) { continue; } @@ -5321,7 +5324,7 @@ public synchronized void actionPerformed(ActionEvent ev) { // Dialog for choosing which player to transfer to String option = (String) JOptionPane.showInputDialog(clientgui.getFrame(), - "Choose the player to gain ownership of this unit when it turns traitor", + "Choose the player to gain ownership of this unit (" + e.getDisplayName() + ") when it turns traitor", "Traitor", JOptionPane.QUESTION_MESSAGE, null, options, options[0]); diff --git a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java index 1a5d79f083a..50c9e923c09 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java +++ b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java @@ -87,6 +87,7 @@ import megamek.common.util.ImageUtil; import megamek.common.util.fileUtils.MegaMekFile; import megamek.logging.MMLogger; +import megamek.server.props.OrbitalBombardment; /** * Displays the board; lets the user scroll around and select points on it. @@ -637,6 +638,7 @@ public void mouseDragged(MouseEvent e) { SpecialHexDisplay.Type.BOMB_HIT.init(); SpecialHexDisplay.Type.BOMB_DRIFT.init(); SpecialHexDisplay.Type.PLAYER_NOTE.init(); + SpecialHexDisplay.Type.ORBITAL_BOMBARDMENT.init(); fovHighlightingAndDarkening = new FovHighlightingAndDarkening(this); @@ -1454,6 +1456,38 @@ private Mounted selectedWeapon() { return (clientgui != null) ? clientgui.getDisplayedWeapon().orElse(null) : null; } + private void drawOrbitalBombardmentHexes(Graphics boardGraphics) { + Image orbitalBombardmentImage = tileManager.getOrbitalBombardmentImage(); + Rectangle view = boardGraphics.getClipBounds(); + boolean justDraw = false; + // Compute the origin of the viewing area + int drawX = (view.x / (int) (HEX_WC * scale)) - 1; + int drawY = (view.y / (int) (HEX_H * scale)) - 1; + + // Compute size of viewing area + int drawWidth = (view.width / (int) (HEX_WC * scale)) + 3; + int drawHeight = (view.height / (int) (HEX_H * scale)) + 3; + + // Draw incoming artillery sprites - requires server to update client's + // view of game + for (Enumeration attacks = game.getOrbitalBombardmentAttacks(); attacks.hasMoreElements();) { + final OrbitalBombardment orbitalBombardment = attacks.nextElement(); + final Coords c = new Coords(orbitalBombardment.getX(), orbitalBombardment.getY()); + // Is the Coord within the viewing area? + boolean insideViewArea = ((c.getX() >= drawX) && (c.getX() <= (drawX + drawWidth)) + && (c.getY() >= drawY) && (c.getY() <= (drawY + drawHeight))); + if (insideViewArea) { + Point p = getHexLocation(c); + boardGraphics.drawImage(getScaledImage(orbitalBombardmentImage, true), p.x, p.y, boardPanel); + for (Coords c2 : c.allAtDistanceOrLess(orbitalBombardment.getRadius())) { + Point p2 = getHexLocation(c2); + boardGraphics.drawImage(getScaledImage(orbitalBombardmentImage, true), p2.x, p2.y, boardPanel); + } + } + + } + } + /** * Display artillery modifier in pretargeted hexes */ @@ -1639,6 +1673,9 @@ public BufferedImage getEntireBoardImage(boolean ignoreUnits, boolean useBaseZoo // Artillery targets drawArtilleryHexes(boardGraph); + // draw Orbital Bombardment targets; + drawOrbitalBombardmentHexes(boardGraph); + // draw highlight border drawSprite(boardGraph, highlightSprite); diff --git a/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java b/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java index 9b04715eb81..2de4ebb2d26 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java +++ b/megamek/src/megamek/client/ui/swing/boardview/TerrainShadowHelper.java @@ -185,9 +185,11 @@ BufferedImage updateShadowMap() { surrounded = false; } else { Hex nhex = board.getHex(c.translated(dir)); - int lv = nhex.getLevel(); - if (lv < level) { - surrounded = false; + if (nhex != null) { + int lv = nhex.getLevel(); + if (lv < level) { + surrounded = false; + } } } } diff --git a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java new file mode 100644 index 00000000000..f85f1b7b55d --- /dev/null +++ b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java @@ -0,0 +1,82 @@ +package megamek.client.ui.swing.gmCommands; + +import megamek.client.IClient; +import megamek.client.ui.swing.ClientGUI; +import megamek.server.commands.GamemasterServerCommand; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.EnumArgument; +import megamek.server.commands.arguments.IntegerArgument; + +import javax.swing.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +// JPanel wrapper for game master commands +public class GamemasterCommandPanel extends JDialog { + private final GamemasterServerCommand command; + private final ClientGUI client; + + public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerCommand command) { + super(parent, command.getName(), true); + this.command = command; + this.client = client; + setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); + + JLabel helpLabel = new JLabel(command.getHelp()); + add(helpLabel); + + List> arguments = command.defineArguments(); + Map argumentComponents = new HashMap<>(); + + for (Argument argument : arguments) { + JLabel label = new JLabel(argument.getName() + ":"); + add(label); + + if (argument instanceof IntegerArgument intArg) { + JSpinner spinner = new JSpinner(new SpinnerNumberModel( + intArg.hasDefaultValue() ? intArg.getValue() : 0, + intArg.getMinValue(), + intArg.getMaxValue(), + 1)); + add(spinner); + argumentComponents.put(argument.getName(), spinner); + } else if (argument instanceof EnumArgument enumArg) { + JComboBox comboBox = new JComboBox<>(); + for (Enum constant : enumArg.getEnumType().getEnumConstants()) { + comboBox.addItem(constant.name()); + } + if (enumArg.getValue() != null) { + comboBox.setSelectedItem(enumArg.getValue().name()); + } + add(comboBox); + argumentComponents.put(argument.getName(), comboBox); + } + } + + JButton executeButton = new JButton("Execute Command"); + executeButton.addActionListener(e -> executeCommand(argumentComponents)); + add(executeButton); + + pack(); + setLocationRelativeTo(parent); + } + + private void executeCommand(Map argumentComponents) { + List> arguments = command.defineArguments(); + String[] args = new String[arguments.size()]; + + for (int i = 0; i < arguments.size(); i++) { + Argument argument = arguments.get(i); + JComponent component = argumentComponents.get(argument.getName()); + + if (component instanceof JSpinner) { + args[i] = argument.getName() + "=" + ((JSpinner) component).getValue().toString(); + } else if (component instanceof JComboBox) { + args[i] = argument.getName() + "=" + Objects.requireNonNull(((JComboBox) component).getSelectedItem()); + } + } + client.getClient().sendChat("/" + command.getName() + " " + String.join(" ", args)); + } +} diff --git a/megamek/src/megamek/client/ui/swing/minimap/Minimap.java b/megamek/src/megamek/client/ui/swing/minimap/Minimap.java index 7aa0f11da92..10df3f5a6ba 100644 --- a/megamek/src/megamek/client/ui/swing/minimap/Minimap.java +++ b/megamek/src/megamek/client/ui/swing/minimap/Minimap.java @@ -536,6 +536,9 @@ private void drawMap(boolean forceDraw) { for (int j = 0; j < board.getWidth(); j++) { for (int k = 0; k < board.getHeight(); k++) { Hex h = board.getHex(j, k); + if (h == null) { + continue; + } if (dirtyMap || dirty[j / 10][k / 10]) { gg.setColor(terrainColor(h)); if (h.containsTerrain(SPACE)) { diff --git a/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java b/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java index b051ee2b2e9..1a3ec4ff91e 100644 --- a/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java +++ b/megamek/src/megamek/client/ui/swing/tileset/TilesetManager.java @@ -77,6 +77,8 @@ public class TilesetManager implements IPreferenceChangeListener { private static final String FILENAME_ARTILLERY_ADJUSTED_IMAGE = "artyadj.gif"; private static final String FILENAME_ARTILLERY_INCOMING_IMAGE = "artyinc.gif"; + private static final String FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE = "obinc.gif"; + public static final int ARTILLERY_AUTOHIT = 0; public static final int ARTILLERY_ADJUSTED = 1; public static final int ARTILLERY_INCOMING = 2; @@ -106,6 +108,7 @@ public class TilesetManager implements IPreferenceChangeListener { private Image artilleryAutohit; private Image artilleryAdjusted; private Image artilleryIncoming; + private Image orbitalBombardmentIncoming; /** * Hexes under the effects of ECM have a shaded "static" image displayed, @@ -414,6 +417,10 @@ public Image getEcmStaticImage(Color tint) { return image; } + public Image getOrbitalBombardmentImage() { + return orbitalBombardmentIncoming; + } + public Image getArtilleryTarget(int which) { switch (which) { case ARTILLERY_AUTOHIT: @@ -486,6 +493,7 @@ public void loadNeededImages(Game game) { artilleryAutohit = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ARTILLERY_AUTOHIT_IMAGE); artilleryAdjusted = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ARTILLERY_ADJUSTED_IMAGE); artilleryIncoming = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ARTILLERY_INCOMING_IMAGE); + orbitalBombardmentIncoming = LoadSpecificImage(Configuration.hexesDir(), FILENAME_ORBITAL_BOMBARDMENT_INCOMING_IMAGE); started = true; } diff --git a/megamek/src/megamek/common/Board.java b/megamek/src/megamek/common/Board.java index 66bd8facb55..f3bdc36db1f 100644 --- a/megamek/src/megamek/common/Board.java +++ b/megamek/src/megamek/common/Board.java @@ -21,11 +21,7 @@ package megamek.common; import static java.util.stream.Collectors.toList; -import static megamek.common.SpecialHexDisplay.Type.ARTILLERY_DRIFT; -import static megamek.common.SpecialHexDisplay.Type.ARTILLERY_MISS; -import static megamek.common.SpecialHexDisplay.Type.BOMB_DRIFT; -import static megamek.common.SpecialHexDisplay.Type.BOMB_HIT; -import static megamek.common.SpecialHexDisplay.Type.BOMB_MISS; +import static megamek.common.SpecialHexDisplay.Type.*; import java.io.*; import java.util.*; @@ -1752,7 +1748,7 @@ public Hashtable> getSpecialHexDisplayTabl public void setSpecialHexDisplayTable(Hashtable> shd) { Hashtable> temp = new Hashtable<>(); - // Grab all current ARTILLERY_MISS instances + // Grab all current ARTILLERY_MISS and ARTILLERY_DRIFT instances for (Map.Entry> e : specialHexes.entrySet()) { for (SpecialHexDisplay special : e.getValue()) { if (Set.of(ARTILLERY_MISS, ARTILLERY_DRIFT).contains(special.getType())) { @@ -2087,4 +2083,25 @@ public static int decodeCustomDeploymentZoneID(int zoneID) { public static int encodeCustomDeploymentZoneID(int zoneID) { return zoneID + NUM_ZONES_X2; } + + public void clearOrbitalBombardmentIcons() { + for (Coords coords : specialHexes.keySet()) { + removeOrbitalBombardmentIcons(coords); + } + } + + public void removeOrbitalBombardmentIcons(Coords coords) { + // Do nothing if the coords aren't on this board. + if (!this.contains(coords) || null == specialHexes.get(coords)) { + return; + } + + // Use iterator so we can remove while traversing + for (Iterator iterator = specialHexes.get(coords).iterator(); iterator.hasNext();) { + SpecialHexDisplay shd = iterator.next(); + if (ORBITAL_BOMBARDMENT.equals(shd.getType())) { + iterator.remove(); + } + } + } } diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java index 06d10d45800..d54020dc530 100644 --- a/megamek/src/megamek/common/Entity.java +++ b/megamek/src/megamek/common/Entity.java @@ -4790,6 +4790,16 @@ public List getCriticalSlots(int location) { return result; } + public boolean hasUndamagedCriticalSlots() { + return IntStream.range(0, locations()) + .mapToLong(i -> getCriticalSlots(i) + .stream() + .filter(Objects::nonNull) + .filter(CriticalSlot::isHittable) + .count() + ).sum() > 0; + } + /** * @return True when this unit has a RISC Super-Cooled Myomer System (even if * the SCM is destroyed). diff --git a/megamek/src/megamek/common/Game.java b/megamek/src/megamek/common/Game.java index cd106d57c9d..55f5ea13373 100644 --- a/megamek/src/megamek/common/Game.java +++ b/megamek/src/megamek/common/Game.java @@ -15,12 +15,6 @@ */ package megamek.common; -import static java.util.stream.Collectors.toList; - -import java.io.Serializable; -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; - import megamek.MMConstants; import megamek.Version; import megamek.client.bot.princess.BehaviorSettings; @@ -39,9 +33,16 @@ import megamek.common.weapons.AttackHandler; import megamek.logging.MMLogger; import megamek.server.SmokeCloud; +import megamek.server.props.OrbitalBombardment; import megamek.server.victory.VictoryHelper; import megamek.server.victory.VictoryResult; +import java.io.Serializable; +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; + +import static java.util.stream.Collectors.toList; + /** * The game class is the root of all data about the game in progress. Both the * Client and the Server should have one of these objects, and it is their job @@ -113,7 +114,7 @@ public final class Game extends AbstractGame implements Serializable, PlanetaryC private Vector vibrabombs = new Vector<>(); private Vector attacks = new Vector<>(); private Vector offboardArtilleryAttacks = new Vector<>(); - + private Vector orbitalBombardmentAttacks = new Vector(); private int lastEntityId; private Vector tagInfoForTurn = new Vector<>(); @@ -2202,6 +2203,19 @@ public int removeSpecificEntityTurnsFor(Entity entity) { return turnsToRemove.size(); } + public void setOrbitalBombardmentVector(Vector v) { + orbitalBombardmentAttacks = v; + processGameEvent(new GameBoardChangeEvent(this)); + } + + public void resetOrbitalBombardmentAttacks() { + orbitalBombardmentAttacks.removeAllElements(); + } + + public Enumeration getOrbitalBombardmentAttacks() { + return orbitalBombardmentAttacks.elements(); + } + public void setArtilleryVector(Vector v) { offboardArtilleryAttacks = v; processGameEvent(new GameBoardChangeEvent(this)); diff --git a/megamek/src/megamek/common/SpecialHexDisplay.java b/megamek/src/megamek/common/SpecialHexDisplay.java index 170966e71dd..2fb11e1cac3 100644 --- a/megamek/src/megamek/common/SpecialHexDisplay.java +++ b/megamek/src/megamek/common/SpecialHexDisplay.java @@ -96,16 +96,12 @@ public boolean drawBefore() { } }, PLAYER_NOTE(new MegaMekFile(Configuration.hexesDir(), "note.png").toString()) { - @Override - public boolean drawBefore() { - return true; - } - @Override public boolean drawAfter() { return true; } - }; + }, + ORBITAL_BOMBARDMENT(new MegaMekFile(Configuration.hexesDir(), "obinc.gif").toString()); private transient Image defaultImage; private final String defaultImagePath; @@ -250,16 +246,17 @@ public int getObscuredLevel() { * @return */ public boolean isObscured(Player other) { + if (owner == null) { + return false; + } if ((obscured == SHD_OBSCURED_OWNER) && owner.equals(other)) { return false; } else if ((obscured == SHD_OBSCURED_TEAM) && (other != null) && (owner.getTeam() == other.getTeam())) { return false; - } else if (obscured == SHD_OBSCURED_ALL) { - return false; - } else { - return true; } + + return obscured != SHD_OBSCURED_ALL; } public void setObscured(int obscured) { @@ -272,7 +269,7 @@ public void setObscured(int obscured) { * display * in the appropriate phase. Other bomb- or artillery-related graphics are * optional. - * + * * @param phase * @param curRound * @param playerChecking diff --git a/megamek/src/megamek/common/weapons/AreaEffectHelper.java b/megamek/src/megamek/common/weapons/AreaEffectHelper.java index b9a4e04ca5d..32ea8900b05 100644 --- a/megamek/src/megamek/common/weapons/AreaEffectHelper.java +++ b/megamek/src/megamek/common/weapons/AreaEffectHelper.java @@ -13,19 +13,16 @@ */ package megamek.common.weapons; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Vector; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.IntStream; import megamek.common.*; import megamek.common.planetaryconditions.Atmosphere; import megamek.common.planetaryconditions.PlanetaryConditions; import megamek.logging.MMLogger; import megamek.server.totalwarfare.TWGameManager; +import org.apache.commons.lang3.IntegerRange; /** * Class containing functionality that helps out with area effect weapons. @@ -805,6 +802,14 @@ public static void applyExplosionClusterDamageToEntity(Entity entity, int damage HitData hit = entity.rollHitLocation(table, Compute.targetSideTable(position, entity)); vDesc.addAll(gameManager.damageEntity(entity, hit, cluster, false, DamageType.IGNORE_PASSENGER, false, true)); + + // If there is nothing left to destroy in the unit + if ( + entity.isDoomed() + && (!entity.hasUndamagedCriticalSlots() || entity.getRemovalCondition() == IEntityRemovalConditions.REMOVE_DEVASTATED) + ) { + break; + } damage -= cluster; } } diff --git a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java index d50836c22e2..d9ca02e4e9f 100644 --- a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java +++ b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java @@ -21,59 +21,54 @@ import megamek.common.Entity; import megamek.common.Player; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + /** * The Server Command "/changeOwner" that will switch an entity's owner to another player. * * @author Luana Scoppio */ -public class ChangeOwnershipCommand extends ServerCommand implements IsGM { - - private final TWGameManager gameManager; +public class ChangeOwnershipCommand extends GamemasterServerCommand { public ChangeOwnershipCommand(Server server, TWGameManager gameManager) { super(server, + gameManager, "changeOwner", "Switches ownership of a player's entity to another player during the end phase. " - + "Usage: /changeOwner " - + "The following is an example of changing unit ID 7 to player ID 2: /changeOwner 7 2 "); - this.gameManager = gameManager; + + "Usage: /changeOwner " + + "The following is an example of changing unit ID 7 to player ID 2: /changeOwner 7 2 "); } - /** - * Run this command with the arguments supplied - * - * @see ServerCommand#run(int, String[]) - */ @Override - public void run(int connId, String[] args) { - try { - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - int eid = Integer.parseInt(args[1]); - Entity ent = gameManager.getGame().getEntity(eid); - int pid = Integer.parseInt(args[2]); - Player player = server.getGame().getPlayer(pid); - if (null == ent) { - server.sendServerChat(connId, "No such entity."); - } else if (null == player) { - server.sendServerChat(connId, "No such player."); - } else if (player.getTeam() == Player.TEAM_UNASSIGNED) { - server.sendServerChat(connId, "Player must be assigned a team."); - } else { - server.sendServerChat(connId, ent.getDisplayName() + " will switch to " + player.getName() + "'s side at the end of this turn."); - ent.setTraitorId(pid); - } - } catch (NumberFormatException ignored) { - } + public List> defineArguments() { + List> arguments = new ArrayList<>(); + arguments.add(new IntegerArgument("unitID", 0, Integer.MAX_VALUE)); + arguments.add(new IntegerArgument("playerID", 0, Integer.MAX_VALUE)); + return arguments; } @Override - public TWGameManager getGameManager() { - return gameManager; + protected void runAsGM(int connId, Map> args) { + IntegerArgument unitID = (IntegerArgument) args.get("unitID"); + IntegerArgument playerID = (IntegerArgument) args.get("playerID"); + + Entity ent = gameManager.getGame().getEntity(unitID.getValue()); + Player player = server.getGame().getPlayer(playerID.getValue()); + if (null == ent) { + server.sendServerChat(connId, "No such entity."); + } else if (null == player) { + server.sendServerChat(connId, "No such player."); + } else if (player.getTeam() == Player.TEAM_UNASSIGNED) { + server.sendServerChat(connId, "Player must be assigned a team."); + } else { + server.sendServerChat(connId, ent.getDisplayName() + " will switch to " + player.getName() + "'s side at the end of this turn."); + ent.setTraitorId(player.getId()); + } } } diff --git a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java index 1e75fd97e2d..3ff818d1c1d 100644 --- a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java +++ b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java @@ -20,9 +20,13 @@ import megamek.common.planetaryconditions.*; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; @@ -31,9 +35,7 @@ /** * @author Luana Scoppio */ -public class ChangeWeatherCommand extends ServerCommand { - - private final TWGameManager gameManager; +public class ChangeWeatherCommand extends GamemasterServerCommand { private static final String HELP_TEXT = "GM changes (weather) planetary conditions. The parameters are optional and unordered " + "and the effects are applied at the beginning of the next turn. The square brackets means that argument is optional. " + @@ -44,19 +46,30 @@ public class ChangeWeatherCommand extends ServerCommand { "winddir= 0: south, 1: southwest, 2: northwest, 3: north, 4: northeast, 5: southeast, 6: random " + "atmo= 0: vacuum, 1: trace, 2: thin, 3: standard, 4: high, 5: very high " + "blowsand= 0: no, 1: yes " + + "emi= 0: no, 1: yes " + "weather= 0: clear, 1: light rain, 2: moderate rain, 3: heavy rain, 4: gusting rain, 5: downpour, 6: light snow " + "7: moderate snow, 8: snow flurries, 9: heavy snow, 10: sleet, 11: ice storm, 12: light hail, 13: heavy hail " + "14: lightning storm"; /** Creates new ChangeWeatherCommand */ public ChangeWeatherCommand(Server server, TWGameManager gameManager) { - super(server, "weather", HELP_TEXT); - this.gameManager = gameManager; + super(server, gameManager, "weather", HELP_TEXT); + } + + public List> defineArguments() { + List> arguments = new ArrayList<>(); + arguments.add(new IntegerArgument("fog", 0, 2)); + arguments.add(new IntegerArgument("light", 0, 6)); + arguments.add(new IntegerArgument("wind", 0, 6)); + arguments.add(new IntegerArgument("atmo", 0, 5)); + arguments.add(new IntegerArgument("blowsand", 0, 1)); + arguments.add(new IntegerArgument("emi", 0, 1)); + arguments.add(new IntegerArgument("weather", 0, 14)); + return arguments; } - private void updatePlanetaryCondition(String arg, String prefix, int connId, int maxLength, Consumer setter, + private void updatePlanetaryCondition(int value, int connId, int maxLength, Consumer setter, Function successMessage, Function errorMessage) { - var value = Integer.parseInt(arg.substring(prefix.length())); if (value >= 0 && value < maxLength) { setter.accept(value); server.sendServerChat(connId, successMessage.apply(value)); @@ -65,50 +78,47 @@ private void updatePlanetaryCondition(String arg, String prefix, int connId, int } } + private record Condition(int maxLength, Consumer setter, Function successMessage, Function errorMessage) {} /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { - if (!server.getPlayer(connId).getGameMaster()) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - var planetaryConditions = gameManager.getGame().getPlanetaryConditions(); + public void runAsGM(int connId, Map> args) { + var planetaryConditions = getGameManager().getGame().getPlanetaryConditions(); - if (args.length > 1) { + Map conditions = Map.of( + "fog", new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), + value -> "The fog has changed.", maxLength -> "Invalid fog value. Must be between 0 and " + (maxLength - 1)), + "wind", new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), + value -> "The wind strength has changed.", maxLength -> "Invalid wind value. Must be between 0 and " + (maxLength - 1)), + "winddir", new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), + value -> "The wind direction has changed.", maxLength -> "Invalid wind direction value. Must be between 0 and " + (maxLength - 1)), + "light", new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), + value -> "The light has changed.", maxLength -> "Invalid light value. Must be between 0 and " + (maxLength - 1)), + "atmo", new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), + value -> value == 0 ? "The air has vanished, put your vac suits!" : "The air is changing.", maxLength -> "Invalid atmosphere value. Must be between 0 and " + (maxLength - 1)), + "blowsand", new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), + value -> value == 1 ? "Sand started blowing." : "The sand has settled.", maxLength -> "Invalid blowsand value. Must be between 0 and " + (maxLength - 1)), + "weather", new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), + value -> "The weather has changed.", maxLength -> "Invalid weather value. Must be between 0 and " + (maxLength - 1)), + "emi", new Condition(EMI.values().length, value -> planetaryConditions.setEMI(EMI.values()[value]), + value -> value == 1 ? "EMI is active." : "EMI is inactive.", maxLength -> "Invalid EMI value. Must be between 0 and " + (maxLength - 1)) + ); + conditions.forEach((prefix, condition) -> { + if (args.containsKey(prefix)) { + updatePlanetaryCondition( + (int) args.get(prefix).getValue(), + connId, + condition.maxLength, + condition.setter, + condition.successMessage, + condition.errorMessage); + } + }); - Map conditions = Map.of( - "fog=", new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), - value -> "The fog has changed.", maxLength -> "Invalid fog value. Must be between 0 and " + (maxLength - 1)), - "wind=", new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), - value -> "The wind strength has changed.", maxLength -> "Invalid wind value. Must be between 0 and " + (maxLength - 1)), - "winddir=", new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), - value -> "The wind direction has changed.", maxLength -> "Invalid wind direction value. Must be between 0 and " + (maxLength - 1)), - "light=", new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), - value -> "The light has changed.", maxLength -> "Invalid light value. Must be between 0 and " + (maxLength - 1)), - "atmo=", new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), - value -> value == 0 ? "The air has vanished, put your vac suits!" : "The air is changing.", maxLength -> "Invalid atmosphere value. Must be between 0 and " + (maxLength - 1)), - "blowsand=", new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), - value -> value == 1 ? "Sand started blowing." : "The sand has settled.", maxLength -> "Invalid blowsand value. Must be between 0 and " + (maxLength - 1)), - "weather=", new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), - value -> "The weather has changed.", maxLength -> "Invalid weather value. Must be between 0 and " + (maxLength - 1)) - ); - - Stream.of(args) - .forEach(arg -> conditions.forEach((prefix, condition) -> { - if (arg.startsWith(prefix)) { - updatePlanetaryCondition(arg, prefix, connId, condition.maxLength, condition.setter, condition.successMessage, condition.errorMessage); - } - })); - - gameManager.getGame().setPlanetaryConditions(planetaryConditions); - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "weather command failed. " + HELP_TEXT); - } + getGameManager().getGame().setPlanetaryConditions(planetaryConditions); } + } diff --git a/megamek/src/megamek/server/commands/DisasterCommand.java b/megamek/src/megamek/server/commands/DisasterCommand.java index 0a7137cd88b..f3fc13e354d 100644 --- a/megamek/src/megamek/server/commands/DisasterCommand.java +++ b/megamek/src/megamek/server/commands/DisasterCommand.java @@ -18,45 +18,149 @@ */ package megamek.server.commands; +import megamek.common.Coords; +import megamek.logging.MMLogger; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.EnumArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.List; +import java.util.Map; +import java.util.Objects; + /** * @author Luana Scoppio */ -public class DisasterCommand extends ServerCommand { +public class DisasterCommand extends GamemasterServerCommand { - private final TWGameManager gameManager; + enum Disaster { + RANDOM, + HURRICANE, + LIGHTNING_STORM, + ORBITAL_BOMBARDMENT, + ORBITAL_BOMBARDMENT_2, + ORBITAL_BOMBARDMENT_3, + SANDSTORM, + HAILSTORM, + ECLIPSE, + SOLAR_FLARE, + SUPERNOVA, + SMOG, + FIRESTORM, + TRAITOR; + + public static Disaster getRandomDisaster() { + return values()[(int) (Math.random() * values().length)]; + } + } - /** Creates new DisasterCommand */ public DisasterCommand(Server server, TWGameManager gameManager) { - super(server, "disaster", "GM calls a disaster at random, arguments in square brackets are optional. Usage: /disaster [type] " + + super(server, gameManager, "gomorrah", "GM calls a disaster, arguments in square brackets are optional. " + + "Usage: /gomorrah [type] " + "if not type is passed, one is chosen at random. " + - "type= 0: hurricane, 1: lightning storm, 2: meteor shower, 3: orbital bombardment, 4: wildfire, 5: sandstorm, 6: hailstorm, " + - "7: heatwave"); - this.gameManager = gameManager; + "Type can be one of the following: hurricane, lightning, ob, ob2, ob3, sandstorm, hailstorm, eclipse, solarflare, " + + "supernova, smog, firestorm, traitor. " + + "The type ob, ob2 and ob3 are orbital bombardment with one, two or three random hit locations, at default values " + + "for damage (100) and radius (4)."); + } + + @Override + public List> defineArguments() { + return List.of(new EnumArgument<>("type", Disaster.class, Disaster.RANDOM)); + } + + private void runDisasterCommand(int connId, Disaster disaster) { + switch (disaster) { + case HURRICANE: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "wind=6", "winddir=6"}); + server.sendServerChat("Hurricane incoming!"); + break; + case LIGHTNING_STORM: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "weather=14"}); + server.sendServerChat("Lightning storm incoming!"); + break; + case ECLIPSE: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "light=4"}); + server.sendServerChat("The sun is being eclipsed..."); + break; + case SOLAR_FLARE: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "light=5", "emi=1"}); + new FirestormCommand(server, gameManager).run(connId, new String[]{"firestorm", "1", "5"}); + server.sendServerChat("Sensors warn of an imminent solar flare incoming! Expect some fires."); + break; + case SUPERNOVA: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "light=5", "emi=1", "atmo=2", "wind=0", "weather=0"}); + new FirestormCommand(server, gameManager).run(connId, new String[]{"firestorm", "2", "75"}); + server.sendServerChat("The star is going supernova!"); + server.sendServerChat("Everything is on fire! We are doomed!"); + break; + case ORBITAL_BOMBARDMENT_3: + orbitalBombardment(connId); + case ORBITAL_BOMBARDMENT_2: + orbitalBombardment(connId); + case ORBITAL_BOMBARDMENT: + orbitalBombardment(connId); + break; + case SANDSTORM: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "blowsand=1", "wind=4", "winddir=6"}); + server.sendServerChat("A sandstorm is approaching!"); + break; + case HAILSTORM: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "weather=13", "wind=4", "winddir=6"}); + server.sendServerChat("A hailstorm is incoming!"); + break; + case FIRESTORM: + new FirestormCommand(server, gameManager).run(connId, new String[]{"firestorm", "2", "50"}); + server.sendServerChat("A firestorm is consuming the battlefield!"); + break; + case SMOG: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "atmo=5", "fog=2", "light=1"}); + server.sendServerChat("A thick smog is covering the battlefield!"); + break; + case TRAITOR: + default: + { + var players = gameManager.getGame().getPlayersList(); + var randomPlayer = players.get((int) (Math.random() * players.size())); + + var units = gameManager.getGame().getPlayerEntities(randomPlayer, true); + var randomUnit = units.get((int) (Math.random() * units.size())); + + var otherPlayers = players.stream().filter(p -> p != randomPlayer).toList(); + var newOwner = otherPlayers.get((int) (Math.random() * otherPlayers.size())); + + new ChangeOwnershipCommand(server, gameManager).run(connId, + new String[]{"traitor", "" + randomUnit.getId(), "" + newOwner.getId()}); + server.sendServerChat("A traitor has been revealed!"); + } + } + } + + private Coords getRandomHexCoords() { + var board = gameManager.getGame().getBoard(); + var x = (int) (Math.random() * board.getWidth()); + var y = (int) (Math.random() * board.getHeight()); + return new Coords(x, y); + } + + private void orbitalBombardment(int connId) { + var coords = getRandomHexCoords(); + new OrbitalBombardmentCommand(server, gameManager).run(connId, new String[]{"ob", + coords.getX() + 1 + "", + coords.getY() + 1 + "" + }); } /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { - if (!server.getPlayer(connId).getGameMaster()) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - // Check argument integrity. - if (args.length == 1) { - // Check command - // NOT IMPLEMENTED - server.sendServerChat(connId, "Oh no..."); - } else if (args.length == 2) { - // Error out; it's not a valid call. - server.sendServerChat(connId, "Oh no..."); + protected void runAsGM(int connId, Map> args) { + if (args.get("type").getValue().equals(Disaster.RANDOM)) { + runDisasterCommand(connId, Disaster.getRandomDisaster()); } else { - server.sendServerChat(connId, "disaster command failed (1)."); + runDisasterCommand(connId, (Disaster) args.get("type").getValue()); } } } diff --git a/megamek/src/megamek/server/commands/FirestarterCommand.java b/megamek/src/megamek/server/commands/FirestarterCommand.java new file mode 100644 index 00000000000..8e4fece3254 --- /dev/null +++ b/megamek/src/megamek/server/commands/FirestarterCommand.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.Coords; +import megamek.common.Hex; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * The Server Command "/firestarter" that will put one hex on fire. + * + * @author Luana Scoppio + */ +public class FirestarterCommand extends GamemasterServerCommand { + + public FirestarterCommand(Server server, TWGameManager gameManager) { + super(server, + gameManager, + "firestarter", + "Starts fire in one specific hex at a specific intensity. " + + "Usage: /firestarter [] " + + "The intensity can be 1=Norma, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV, default is 1."); + } + + + @Override + public List> defineArguments() { + return List.of( + new IntegerArgument("x"), + new IntegerArgument("y"), + new IntegerArgument("intensity", 1, 4, 1)); + } + + /** + * Run this command with the arguments supplied + * + * @see ServerCommand#run(int, String[]) + */ + @Override + protected void runAsGM(int connId, Map> args) { + int xArg = (int) args.get("x").getValue() - 1; + int yArg = (int) args.get("y").getValue() -1; + int fireType = (int) args.get("intensity").getValue(); + + igniteHex(new Coords(xArg, yArg), fireType); + } + + private void igniteHex(Coords coords, int fireType) { + try { + Hex hex = gameManager.getGame().getBoard().getHex(coords); + Objects.requireNonNull(hex, "Hex not found."); + gameManager.ignite(coords, fireType, gameManager.getvPhaseReport()); + } catch (Exception e) { + throw new IllegalArgumentException("Failed to ignite hex: " + e.getMessage()); + } + } + +} diff --git a/megamek/src/megamek/server/commands/FirestormCommand.java b/megamek/src/megamek/server/commands/FirestormCommand.java new file mode 100644 index 00000000000..03d2e03d961 --- /dev/null +++ b/megamek/src/megamek/server/commands/FirestormCommand.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.common.Coords; +import megamek.common.Hex; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +/** + * The Server Command "/firestorm" that starts a blazing inferno on the board. + * + * @author Luana Scoppio + */ +public class FirestormCommand extends GamemasterServerCommand { + + public FirestormCommand(Server server, TWGameManager gameManager) { + super(server, + gameManager, + "firestorm", + "Starts fire in the entire board. " + + "Usage: /firestorm [] []" + + "The intensity can be 1=Normal, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV, default is 1. " + + "The size can be a percent of the board, from 1 to 100, default is 25."); + } + + @Override + public List> defineArguments() { + return List.of(new IntegerArgument("intensity", 1, 4, 1), + new IntegerArgument("percent", 1, 100, 25)); + } + + /** + * Run this command with the arguments supplied + * + * @see ServerCommand#run(int, String[]) + */ + @Override + protected void runAsGM(int connId, Map> args) { + try { + var fireType = (int) args.get("intensity").getValue(); + var percent = (int) args.get("percent").getValue(); + var coords = getRandomCoords(numberOfCoordsFromPercent(percent)); + coords.forEach(c -> igniteHex(c, fireType)); + } catch (Exception e) { + logger.error("Failed to ignite fire.", e); + server.sendServerChat(connId, "Failed to ignite fire."); + } + } + + private int numberOfCoordsFromPercent(int percent) { + var boardHeight = gameManager.getGame().getBoard().getHeight(); + var boardWidth = gameManager.getGame().getBoard().getWidth(); + return Math.max((boardWidth * boardHeight * percent / 100), 1); + } + + private HashSet getRandomCoords(int size) { + var boardHeight = gameManager.getGame().getBoard().getHeight(); + var boardWidth = gameManager.getGame().getBoard().getWidth(); + var coordsSet = new HashSet(); + var maxTries = size * 10; + while (coordsSet.size() < size && maxTries > 0) { + var x = (int) (Math.random() * boardWidth); + var y = (int) (Math.random() * boardHeight); + coordsSet.add(new Coords(x, y)); + maxTries--; + } + + return coordsSet; + } + + private void igniteHex(Coords coords, int fireType) { + Hex hex = gameManager.getGame().getBoard().getHex(coords); + if (null == hex) { + // Just ignore null hexes... they should not happen, but I don't want to crash the command + return; + } + gameManager.ignite(coords, fireType, gameManager.getvPhaseReport()); + } +} diff --git a/megamek/src/megamek/server/commands/GamemasterServerCommand.java b/megamek/src/megamek/server/commands/GamemasterServerCommand.java new file mode 100644 index 00000000000..2c56403cc29 --- /dev/null +++ b/megamek/src/megamek/server/commands/GamemasterServerCommand.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MegaMek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.server.commands; + +import megamek.logging.MMLogger; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.*; + +/** + * A ServerCommand that can only be used by Game Masters + * + * @author Luana Coppio + */ +public abstract class GamemasterServerCommand extends ServerCommand { + + private static final String EMPTY_ARGUMENT = null; + protected final TWGameManager gameManager; + protected final static MMLogger logger = MMLogger.create(GamemasterServerCommand.class); + private final String errorMsg; + /** + * Creates new ServerCommand that can only be used by Game Masters + * + * @param server instance of the server + * @param gameManager instance of the game manager + * @param name the name of the command + * @param helpText the help text for the command + */ + public GamemasterServerCommand(Server server, TWGameManager gameManager, String name, String helpText) { + super(server, name, helpText); + this.gameManager = gameManager; + this.errorMsg = "Error executing command: " + name; + } + + private boolean isGM(int connId) { + return server.getGameManager().getGame().getPlayer(connId).getGameMaster(); + } + + protected TWGameManager getGameManager() { + return gameManager; + } + + @Override + public void run(int connId, String[] args) { + if (!isGM(connId)) { + server.sendServerChat(connId, "This command can only be used by a game master."); + return; + } + + try { + Map> parsedArguments = parseArguments(args); + runAsGM(connId, parsedArguments); + } catch (IllegalArgumentException e) { + server.sendServerChat(connId, "Invalid arguments: " + e.getMessage() + "\nUsage: " + this.getHelp()); + } catch (Exception e) { + server.sendServerChat(connId, "An error occurred while executing the command. Check the log for more information"); + logger.error(errorMsg, e); + } + } + + // Method to parse arguments, to be implemented by the specific command class + public abstract List> defineArguments(); + + + // Parses the arguments using the definition + private Map> parseArguments(String[] args) { + List> argumentDefinitions = defineArguments(); + Map> parsedArguments = new HashMap<>(); + List positionalArguments = new ArrayList<>(); + + // Map argument names to definitions for easy lookup + Map> argumentMap = new HashMap<>(); + for (Argument argument : argumentDefinitions) { + argumentMap.put(argument.getName(), argument); + } + + // Separate positional arguments and named arguments + boolean namedArgumentStarted = false; + for (String arg : List.of(args)) { + String[] keyValue = arg.split("="); + + if (keyValue.length == 2) { + // Handle named arguments + namedArgumentStarted = true; + String key = keyValue[0]; + String value = keyValue[1]; + + if (!argumentMap.containsKey(key)) { + throw new IllegalArgumentException("Unknown argument: " + key); + } + + Argument argument = argumentMap.get(key); + argument.parse(value); + parsedArguments.put(key, argument); + } else { + // Handle positional arguments + if (namedArgumentStarted) { + throw new IllegalArgumentException("Positional arguments cannot come after named arguments."); + } + positionalArguments.add(arg); + } + } + + // Parse positional arguments + int index = 0; + for (Argument argument : argumentDefinitions) { + if (parsedArguments.containsKey(argument.getName())) { + continue; + } + if (index < positionalArguments.size()) { + String value = positionalArguments.get(index); + argument.parse(value); + parsedArguments.put(argument.getName(), argument); + index++; + } else { + // designed to throw an error if the arg doesn't have a default value + argument.parse(EMPTY_ARGUMENT); + parsedArguments.put(argument.getName(), argument); + } + } + + return parsedArguments; + } + + // The new method for game master commands that uses parsed arguments + protected abstract void runAsGM(int connId, Map> args); +} diff --git a/megamek/src/megamek/server/commands/IsGM.java b/megamek/src/megamek/server/commands/IsGM.java deleted file mode 100644 index 6c8fcff5545..00000000000 --- a/megamek/src/megamek/server/commands/IsGM.java +++ /dev/null @@ -1,13 +0,0 @@ -package megamek.server.commands; - -import megamek.server.totalwarfare.TWGameManager; - -public interface IsGM { - - TWGameManager getGameManager(); - - default boolean isGM(int connId) { - return getGameManager().getGame().getPlayer(connId).getGameMaster(); - } - -} diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index 45f2b6d7dca..3001ae0fe5a 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -20,59 +20,47 @@ import megamek.common.options.OptionsConstants; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.totalwarfare.TWGameManager; +import java.util.List; +import java.util.Map; + /** * @author Luana Scoppio */ -public class KillCommand extends ServerCommand implements IsGM { +public class KillCommand extends GamemasterServerCommand{ private final TWGameManager gameManager; /** Creates new KillCommand */ public KillCommand(Server server, TWGameManager gameManager) { - super(server, "kill", "Allows a GM to destroy a single unit instantly" + + super(server, gameManager, "kill", "Allows a GM to destroy a single unit instantly" + "Usage: "+ "/kill " + "where id is the units ID. The units ID can be found by hovering over the unit."); this.gameManager = gameManager; } + @Override + public List> defineArguments() { + return List.of(new IntegerArgument("unitID", 0, Integer.MAX_VALUE)); + } + /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { - - // Check to make sure gm kills are allowed! - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); + protected void runAsGM(int connId, Map> args) { + int unitId = (int) args.get("unitID").getValue(); + // is the unit on the board? + var unit = gameManager.getGame().getEntity(unitId); + if (unit == null) { + server.sendServerChat(connId, "Specified unit is not on the board."); return; } - // Check argument integrity. - if (args.length == 2) { - // Check command - try { - int unitId = Integer.parseInt(args[1]); - // is the unit on the board? - var unit = gameManager.getGame().getEntity(unitId); - if (unit == null) { - server.sendServerChat(connId, "Specified unit is not on the board."); - return; - } - gameManager.destroyEntity(unit, "Act of God", false, false); - server.sendServerChat(connId, unit.getDisplayName() + " has been destroyed."); - } catch (NumberFormatException e) { - server.sendServerChat(connId, "Kill command failed (2). Proper format is \"/kill \" where id is the units numerical ID"); - } - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "Kill command failed (1). Proper format is \"/kill \" where id is the units ID"); - } - } - - @Override - public TWGameManager getGameManager() { - return gameManager; + gameManager.destroyEntity(unit, "Act of God", false, false); + server.sendServerChat(unit.getDisplayName() + " has been devastated."); } } diff --git a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java index 5424526f93d..9a970eb2d1f 100644 --- a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java +++ b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java @@ -20,84 +20,66 @@ import megamek.common.options.OptionsConstants; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; import megamek.server.props.OrbitalBombardment; import megamek.server.totalwarfare.TWGameManager; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + /** * @author Luana Scoppio */ -public class OrbitalBombardmentCommand extends ServerCommand implements IsGM { - - private final TWGameManager gameManager; +public class OrbitalBombardmentCommand extends GamemasterServerCommand { - /** Creates new NukeCommand */ public OrbitalBombardmentCommand(Server server, TWGameManager gameManager) { - super(server, "ob", "GM Drops a bomb onto the board doing of 100 damage with a 3 hex radius, to be exploded at" + - "the end of the next weapons attack phase." + - "Allowed formats:"+ - "/ob and" + - "/ob [factor=#] [radius=#]" + - "the damage at impact point is the factor times 10, default factor value is 10. " + - "and hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23), the explosion blast radius default " + - "is equal to 4, it automatically applies a linear damage dropoff each hex away from the center." + - " All parameters in square brackets may be omitted. " + - " Example: /ob 10 10 factor=12 "); - this.gameManager = gameManager; + super(server, gameManager, "ob", "GM orders an unknown warship to strike the board doing of 100 damage with a 4 hex radius, to be exploded at" + + "the end of the next weapons attack phase." + + "Allowed formats: " + + "/ob and" + + "/ob [dmg=#] [r=#] and" + + "/ob and " + + "/ob " + + "X and Y are the hex position where is x=column number and y=row number (hex 0923 would be x=9 and y=23), " + + "dmg is the amount of damage at impact point, default is 100, the damage drops off linearly according to the radius. " + + "r is radius, defaults to 4. " + + " Example: /ob 10 10 dmg=120 r=4 and /ob 10 10 120 4 are equivalent. " + + " Parameters in square brackets may be omitted, and using named variables permits to write them out of order. " + + " Example: /ob 10 10 r=12 dmg=300"); + } + + @Override + public List> defineArguments() { + return List.of( + new IntegerArgument("x"), + new IntegerArgument("y"), + new IntegerArgument("dmg", 10, Integer.MAX_VALUE, 100), + new IntegerArgument("r", 1, 10, 4)); } /** * Run this command with the arguments supplied */ @Override - public void run(int connId, String[] args) { + protected void runAsGM(int connId, Map> args) { - // Check to make sure nuking is allowed by game options! - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } + var orbitalBombardmentBuilder = new OrbitalBombardment.Builder(); - if (args.length >= 3) { - var orbitalBombardmentBuilder = new OrbitalBombardment.Builder(); - try { - int[] position = new int[2]; - for (int i = 1; i < 3; i++) { - position[i-1] = Integer.parseInt(args[i]) - 1; - } - // is the hex on the board? - if (!gameManager.getGame().getBoard().contains(position[0], position[1])) { - server.sendServerChat(connId, "Specified hex is not on the board."); - return; - } + orbitalBombardmentBuilder.x((int) args.get("x").getValue() - 1).y((int) args.get("y").getValue() - 1); + orbitalBombardmentBuilder.radius((int) args.get("r").getValue()); + orbitalBombardmentBuilder.damageFactor((int) args.get("dmg").getValue()); + var orbitalBombardment = orbitalBombardmentBuilder.build(); - orbitalBombardmentBuilder - .x(position[0]) - .y(position[1]); - - if (args.length > 3) { - for (int i = 3; i < args.length; i++) { - String[] keyValue = args[i].split("="); - if (keyValue[0].equals("factor")) { - orbitalBombardmentBuilder.damageFactor(Integer.parseInt(keyValue[1])); - } else if (keyValue[0].equals("radius")) { - orbitalBombardmentBuilder.radius(Integer.parseInt(keyValue[1])); - } - } - } - - gameManager.addScheduledOrbitalBombardment(orbitalBombardmentBuilder.build()); - server.sendServerChat(connId, "This isn't a shooting star! Take cover!"); - } catch (Exception e) { - server.sendServerChat(connId, "Orbital bombardment command failed (2). Proper format is \"/ob [factor=10] [radius=4]\" where hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23)"); - } - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "Orbital bombardment command failed (1). Proper format is \"/ob [factor=10] [radius=4]\" where hex x, y is x=column number and y=row number (hex 0923 would be x=9 and y=23)"); + // is the hex on the board? + if (!gameManager.getGame().getBoard().contains(orbitalBombardment.getX(), orbitalBombardment.getY())) { + server.sendServerChat(connId, "Specified hex is not on the board."); + return; } - } - @Override - public TWGameManager getGameManager() { - return gameManager; + gameManager.addScheduledOrbitalBombardment(orbitalBombardment); + server.sendServerChat("Orbital bombardment incoming!"); } + } diff --git a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java index 5715ae19736..75373384714 100644 --- a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java +++ b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java @@ -22,44 +22,30 @@ import megamek.common.planetaryconditions.Fog; import megamek.common.planetaryconditions.Wind; import megamek.server.Server; +import megamek.server.commands.arguments.Argument; import megamek.server.totalwarfare.TWGameManager; +import java.util.List; +import java.util.Map; + /** * @author Luana Scoppio */ -public class RemoveSmokeCommand extends ServerCommand implements IsGM { - - private final TWGameManager gameManager; +public class RemoveSmokeCommand extends GamemasterServerCommand { /** Creates new KillCommand */ public RemoveSmokeCommand(Server server, TWGameManager gameManager) { - super(server, "nosmoke", "GM removes all smoke cloud hexes. Usage: /nosmoke"); - this.gameManager = gameManager; + super(server, gameManager, "nosmoke", "GM removes all smoke cloud hexes. Usage: /nosmoke"); } - /** - * Run this command with the arguments supplied - */ @Override - public void run(int connId, String[] args) { - if (!isGM(connId)) { - server.sendServerChat(connId, "You are not a Game Master."); - return; - } - - // Check argument integrity. - if (args.length == 1) { - // Check command - gameManager.getSmokeCloudList().forEach(gameManager::removeSmokeTerrain); - server.sendServerChat(connId, "GM cleared the smoke clouds."); - } else { - // Error out; it's not a valid call. - server.sendServerChat(connId, "nosmoke command failed (1)."); - } + public List> defineArguments() { + return List.of(); } @Override - public TWGameManager getGameManager() { - return gameManager; + protected void runAsGM(int connId, Map> args) { + gameManager.getSmokeCloudList().forEach(gameManager::removeSmokeTerrain); + server.sendServerChat(connId, "GM cleared the smoke clouds."); } } diff --git a/megamek/src/megamek/server/commands/arguments/Argument.java b/megamek/src/megamek/server/commands/arguments/Argument.java new file mode 100644 index 00000000000..39d4aa056c3 --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/Argument.java @@ -0,0 +1,22 @@ +package megamek.server.commands.arguments; + +// A generic Argument class that can be extended for different argument types +public abstract class Argument { + protected T value; + + private final String name; + + public Argument(String name) { + this.name = name; + } + + public T getValue() { + return value; + } + + public String getName() { + return name; + } + + public abstract void parse(String input) throws IllegalArgumentException; +} diff --git a/megamek/src/megamek/server/commands/arguments/EnumArgument.java b/megamek/src/megamek/server/commands/arguments/EnumArgument.java new file mode 100644 index 00000000000..5c51072579b --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/EnumArgument.java @@ -0,0 +1,44 @@ +package megamek.server.commands.arguments; + +import java.util.Arrays; + +public class EnumArgument> extends Argument { + private final Class enumType; + private final E defaultValue; + + public EnumArgument(String name, Class enumType, E defaultValue) { + super(name); + this.enumType = enumType; + this.defaultValue = defaultValue; + } + + public Class getEnumType() { + return enumType; + } + + @Override + public void parse(String input) throws IllegalArgumentException { + if (input == null && defaultValue != null) { + value = defaultValue; + return; + } else { + if (input == null) { + throw new IllegalArgumentException(getName() + " is required."); + } + } + try { + value = Enum.valueOf(enumType, input.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(getName() + " must be one of: " + + String.join(", ", Arrays.toString(enumType.getEnumConstants()))); + } + } + + @Override + public E getValue() { + if (value == null && defaultValue != null) { + return defaultValue; + } + return value; + } +} diff --git a/megamek/src/megamek/server/commands/arguments/IntegerArgument.java b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java new file mode 100644 index 00000000000..26340b84879 --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java @@ -0,0 +1,63 @@ +package megamek.server.commands.arguments; + +public class IntegerArgument extends Argument { + private final int minValue; + private final int maxValue; + private final Integer defaultValue; + + public IntegerArgument(String name) { + this(name, Integer.MIN_VALUE, Integer.MAX_VALUE, null); + } + + public IntegerArgument(String name, int minValue, int maxValue) { + this(name, minValue, maxValue, null); + } + + public IntegerArgument(String name, int minValue, int maxValue, Integer defaultValue) { + super(name); + this.minValue = minValue; + this.maxValue = maxValue; + this.defaultValue = defaultValue; + } + + @Override + public Integer getValue() { + if (value == null && defaultValue != null) { + return defaultValue; + } + return value; + } + + @Override + public void parse(String input) throws IllegalArgumentException { + if (input == null && defaultValue != null) { + value = defaultValue; + return; + } else { + if (input == null) { + throw new IllegalArgumentException(getName() + " is required."); + } + } + try { + int parsedValue = Integer.parseInt(input); + if (parsedValue < minValue || parsedValue > maxValue) { + throw new IllegalArgumentException(getName() + " must be between " + minValue + " and " + maxValue); + } + value = parsedValue; + } catch (NumberFormatException e) { + throw new IllegalArgumentException(getName() + " must be an integer."); + } + } + + public boolean hasDefaultValue() { + return defaultValue != null; + } + + public int getMinValue() { + return minValue; + } + + public int getMaxValue() { + return maxValue; + } +} diff --git a/megamek/src/megamek/server/props/OrbitalBombardment.java b/megamek/src/megamek/server/props/OrbitalBombardment.java index e49e1c965e4..0bfa383c45f 100644 --- a/megamek/src/megamek/server/props/OrbitalBombardment.java +++ b/megamek/src/megamek/server/props/OrbitalBombardment.java @@ -18,6 +18,8 @@ */ package megamek.server.props; +import megamek.common.Coords; + /** * Represents an orbital bombardment event. * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with @@ -31,19 +33,23 @@ public class OrbitalBombardment { private final int y; private final int damageFactor; private final int radius; - + private final Coords coords; /** * Represents an orbital bombardment event. * x and y are board positions, damageFactor is the damage at impact point times 10, and radius is the blast radius of the explosion with * regular/linear damage droppoff. * - * @param builder */ private OrbitalBombardment(Builder builder) { this.x = builder.x; this.y = builder.y; this.damageFactor = builder.damageFactor; this.radius = builder.radius; + this.coords = new Coords(x, y); + } + + public Coords getCoords() { + return coords; } public int getX() { diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 4eb440a79a0..57c86de9f08 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -190,8 +190,11 @@ public List getCommandList(Server server) { commands.add(new CheckBVTeamCommand(server)); commands.add(new NukeCommand(server, this)); commands.add(new KillCommand(server, this)); + commands.add(new OrbitalBombardmentCommand(server, this)); commands.add(new ChangeOwnershipCommand(server, this)); commands.add(new DisasterCommand(server, this)); + commands.add(new FirestarterCommand(server, this)); + commands.add(new FirestormCommand(server, this)); commands.add(new RemoveSmokeCommand(server, this)); commands.add(new ChangeWeatherCommand(server, this)); commands.add(new TraitorCommand(server, this)); @@ -20194,8 +20197,6 @@ public void doExplosion(int[] damages, boolean autoDestroyInSameHex, Coords posi } else { range += entity.getElevation(); } - } else { - continue; } // We might need to nuke everyone in the explosion hex. If so... @@ -20394,7 +20395,35 @@ public void addScheduledNuke(int[] nuke) { * through it's builder. */ public void addScheduledOrbitalBombardment(OrbitalBombardment orbitalBombardment) { + Report r = new Report(1302); + r.indent(); + r.newlines = 0; + r.add("Unknown warship in orbit"); + r.add(orbitalBombardment.getCoords().getBoardNum()); + getvPhaseReport().addElement(r); + Report.addNewline(getvPhaseReport()); + + drawOrbitalBombardmentOnBoard(orbitalBombardment); scheduledOrbitalBombardment.add(orbitalBombardment); + getGame().setOrbitalBombardmentVector(new Vector<>(scheduledOrbitalBombardment)); + } + + private void drawOrbitalBombardmentOnBoard(OrbitalBombardment orbitalBombardment) { + + for (var coord : orbitalBombardment.getCoords().allAtDistanceOrLess(orbitalBombardment.getRadius())) { + getGame().getBoard().addSpecialHexDisplay( + coord, + new SpecialHexDisplay( + SpecialHexDisplay.Type.ORBITAL_BOMBARDMENT, + getGame().getRoundCount(), + getGame().getPlayersList().get(0), // It doesnt matter which is the player, but I dont want to cause a nullpointer. + "Orbital bombardment incoming, landing on round " + + getGame().getRoundCount() + + ", fired by an unknown warship in orbit", + SpecialHexDisplay.SHD_OBSCURED_ALL) + ); + sendChangedHex(coord); + } } /** @@ -20419,8 +20448,15 @@ void resolveScheduledNukes() { */ void resolveScheduledOrbitalBombardments() { scheduledOrbitalBombardment - .forEach(ob -> doOrbitalBombardment(new Coords(ob.getX(), ob.getY()), ob.getDamageFactor(), ob.getRadius(), vPhaseReport)); + .forEach(ob -> doOrbitalBombardment(new Coords(ob.getX(), ob.getY()), ob.getDamageFactor(), ob.getRadius())); scheduledOrbitalBombardment.clear(); + getGame().resetOrbitalBombardmentAttacks(); + + // All right. We're done. + var r = new Report(1301, Report.PUBLIC); + r.indent(); + r.newlines = 2; + getvPhaseReport().add(r); } /** @@ -20446,19 +20482,12 @@ public void doNuclearExplosion(Coords position, int nukeType, Vector vDe * @param position the position that will be hit by the orbital bombardment * @param damageFactor the factor by which the base damage will be multiplied * @param radius the radius which the damage will hit - * @param vDesc a vector that contains the output report */ - public void doOrbitalBombardment(Coords position, int damageFactor, int radius, Vector vDesc) { - // Just in case. - if (vDesc == null) { - vDesc = new Vector<>(); - } - + public void doOrbitalBombardment(Coords position, int damageFactor, int radius) { Report r = new Report(1300, Report.PUBLIC); - r.indent(); r.add(position.getBoardNum(), true); - vDesc.add(r); + getvPhaseReport().add(r); // Then, do actual blast damage. // Use the standard blast function for this. @@ -20470,41 +20499,7 @@ public void doOrbitalBombardment(Coords position, int damageFactor, int radius, doExplosion(baseDamage, degradation , false, position, true, tmpV, blastedUnitsVec, -1, true); Report.indentAll(tmpV, 2); - vDesc.addAll(tmpV); - - // Next, for whatever's left, do terrain effects - // such as clearing, roughing, and boiling off water. - boolean damageFlag = true; - - // Lastly, do secondary effects. - for (Entity entity : game.getEntitiesVector()) { - // loaded units and off board units don't have a position, - // so we don't count 'em here - if ((entity.getTransportId() != Entity.NONE) || (entity.getPosition() == null)) { - continue; - } - - // If it's already destroyed... - if ((entity.isDoomed()) || (entity.isDestroyed())) { - continue; - } - - // If it's too far away for this... - if (position.distance(entity.getPosition()) > radius) { - continue; - } - - // Actually do secondary effects against it. - // Since the effects are unit-dependant, we'll just define it in the - // entity. -// applySecondaryNuclearEffects(entity, position, vDesc); - } - - // All right. We're done. - r = new Report(1216, Report.PUBLIC); - r.indent(); - r.newlines = 2; - vDesc.add(r); + getvPhaseReport().addAll(tmpV); } /** @@ -31692,6 +31687,10 @@ void clearBombIcons() { game.getBoard().clearBombIcons(); } + void clearOrbitalBombardmentIcons() { + game.getBoard().clearOrbitalBombardmentIcons(); + } + /** * Convenience function to send a ground object update. */ From 9cdff42548eb165d26c2e84a30ef91c8e9591d8d Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Fri, 15 Nov 2024 18:51:20 -0500 Subject: [PATCH 37/57] code cleanup --- .../ui/advancedSearchMap/BoardTableModel.java | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index 49e1cf7f86d..fb74f8ef95b 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -152,45 +152,58 @@ public Integer getHeightAt(int row) { return height.get(row); } + public List getTagAt(int row) { + if (tags.size() <= row) { + return null; + } + + String tag = tags.get(row); + tag = tag.substring(1, tag.length() -1); + return Arrays.stream(tag.split(", ")).toList(); + } + public ImageIcon getIconAt(int row, int height) { + ImageIcon icon = null; String path = getPathAt(row); - Board board = new Board(16, 17); - board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); - BufferedImage image = Minimap.getMinimapImageMaxZoom(board); + if (path != null) { + Board board = new Board(16, 17); + board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); + + BufferedImage image = Minimap.getMinimapImageMaxZoom(board); - int scaledHeight = Math.min(image.getHeight(), height); - int scaledWidth = Math.max(1, image.getWidth() * scaledHeight / image.getHeight()); + int scaledHeight = Math.min(image.getHeight(), height); + int scaledWidth = Math.max(1, image.getWidth() * scaledHeight / image.getHeight()); + + image = ImageUtil.getScaledImage(image, scaledWidth, scaledHeight); + icon = new ImageIcon(image); + } - image = ImageUtil.getScaledImage(image, scaledWidth, scaledHeight); - ImageIcon icon = new ImageIcon(image); return icon; } public String getInfoAt(int row) { + String info = ""; String path = getPathAt(row); - Board board = new Board(16, 17); - board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); - - String info; - String col = UIUtil.tag("TD", "", path); - info = UIUtil.tag("TR", "", col); - col = UIUtil.tag("TD", "", board.getWidth() + "x" + board.getHeight()); - info += UIUtil.tag("TR", "", col); - col = UIUtil.tag("TD", "", board.getTags().toString()); - info += UIUtil.tag("TR", "", col); - info = UIUtil.tag("TABLE", "", info); - String attr = String.format("WIDTH=%s", UIUtil.scaleForGUI(500)); - info = UIUtil.tag("DIV", attr, info); - info = UIUtil.tag("BODY", "", info); - info = UIUtil.tag("HTML", "", info); - return info; - } + if (path != null) { + Board board = new Board(16, 17); + board.load(new MegaMekFile(Configuration.boardsDir(), path).getFile()); + + + String col = UIUtil.tag("TD", "", path); + info = UIUtil.tag("TR", "", col); + col = UIUtil.tag("TD", "", board.getWidth() + "x" + board.getHeight()); + info += UIUtil.tag("TR", "", col); + col = UIUtil.tag("TD", "", board.getTags().toString()); + info += UIUtil.tag("TR", "", col); + info = UIUtil.tag("TABLE", "", info); + String attr = String.format("WIDTH=%s", UIUtil.scaleForGUI(500)); + info = UIUtil.tag("DIV", attr, info); + info = UIUtil.tag("BODY", "", info); + info = UIUtil.tag("HTML", "", info); + } - public List getTagAt(int row) { - String tag = tags.get(row); - tag = tag.substring(1, tag.length() -1); - return Arrays.stream(tag.split(", ")).toList(); + return info; } } From 231657f328da5fdb66108f00de4f75e099012001 Mon Sep 17 00:00:00 2001 From: Scoppio Date: Fri, 15 Nov 2024 22:12:43 -0300 Subject: [PATCH 38/57] fix: fixr armor tech rating persistance --- .../i18n/megamek/client/messages.properties | 53 +++--- .../src/megamek/client/ui/swing/MapMenu.java | 42 +++-- .../gmCommands/GamemasterCommandPanel.java | 158 +++++++++++++----- .../commands/ChangeOwnershipCommand.java | 3 +- .../server/commands/ChangeWeatherCommand.java | 103 +++++------- .../server/commands/DisasterCommand.java | 8 +- .../server/commands/FirestarterCommand.java | 3 +- .../server/commands/FirestormCommand.java | 3 +- .../commands/GamemasterServerCommand.java | 16 +- .../megamek/server/commands/KillCommand.java | 3 +- .../commands/OrbitalBombardmentCommand.java | 3 +- .../server/commands/RemoveSmokeCommand.java | 3 +- .../server/commands/arguments/Argument.java | 2 +- .../commands/arguments/EnumArgument.java | 4 +- 14 files changed, 244 insertions(+), 160 deletions(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 7c316346a05..8fdaeab24d9 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -4634,12 +4634,14 @@ SBFTargetDialog.title=Targeting #Gamemaster Menu Text Gamemaster.Gamemaster=Gamemaster -Gamemaster.EditDamage=Edit Damage -Gamemaster.Configure=Configure +Gamemaster.EditDamage=Edit Damage (unstable) +Gamemaster.Configure=Configure (unstable) Gamemaster.Traitor=Traitor Unit +Gamemaster.dialog.confirm=Confirm Gamemaster.KillUnit=Kill Unit -Gamemaster.SpecialCommands=Special Commands - +Gamemaster.KillUnit.text=Kill Unit {0} +Gamemaster.KillUnit.confirmation=Are you sure you want to kill {0}? +Gamemaster.SpecialCommands=Special Actions #Gamemaster Chat Commands Gamemaster.cmd.missingUnit=Specified unit is not on the board. Gamemaster.cmd.error.integerparse=must be between the min and max values: @@ -4649,14 +4651,17 @@ Gamemaster.cmd.params.optional=Optional. Gamemaster.cmd.x=The x coordinate of the hex. Gamemaster.cmd.y=The y coordinate of the hex. # Remove Smoke cmd +Gamemaster.cmd.removesmoke.longName=Remove Smoke Gamemaster.cmd.removesmoke.help=Removes all smoke cloud hexes. Gamemaster.cmd.removesmoke.success=The air is cleaner and the smoke is gone. # Kill Unit cmd +Gamemaster.cmd.kill.longName=Kill Unit Gamemaster.cmd.kill.unitID=ID of the unit to kill. Gamemaster.cmd.kill.help=Kills a single unit. Gamemaster.cmd.kill.success=Is going to be destroyed at the end of this phase. Gamemaster.cmd.kill.reason=Killed by GM. # Change ownership cmd +Gamemaster.cmd.changeownership.longName=Change Unit Ownership (traitor) Gamemaster.cmd.changeownership.help=Changes the ownership of a unit from one player to another. Gamemaster.cmd.changeownership.unitID=ID of the unit to change ownership. Gamemaster.cmd.changeownership.playerID=ID of the player to receive the unit. @@ -4665,56 +4670,44 @@ Gamemaster.cmd.changeownership.playerNotFound=No such player. Gamemaster.cmd.changeownership.playerUnassigned=Player must be assigned a team. Gamemaster.cmd.changeownership.success=Ownership of unit {0} will be transferred to player {1} at the end of this round. # Change weather cmd +Gamemaster.cmd.changeweather.longName=Change Planetary Conditions Gamemaster.cmd.changeweather.help=Change any of the planetary conditions. Effects change at the next round. -Gamemaster.cmd.changeweather.fog=Fog: 0=none, 1=light, 2=heavy -Gamemaster.cmd.changeweather.light=Light: 0=daylight, 1=dusk, 2=full moon, 3=glare, 4=moonless night, 5=solar flare, 6=pitch black -Gamemaster.cmd.changeweather.wind=Wind: 0=calm, 1=light gale, 2=moderate gale, 3=strong gale, 4=storm, 5=tornado F1-F3, 6=tornado F4 -Gamemaster.cmd.changeweather.winddir=Wind direction: 0=south, 1=southwest, 2=northwest, 3=north, 4=northeast, 5=southeast, 6=random -Gamemaster.cmd.changeweather.atmo=Atmosphere: 0=vacuum, 1=trace, 2=thin, 3=standard, 4=high, 5=very high -Gamemaster.cmd.changeweather.blowsand=Blowing Sand: 0=no, 1=yes -Gamemaster.cmd.changeweather.emi=EMI: 0=no, 1=yes -Gamemaster.cmd.changeweather.weather=Weather: 0=clear, 1=light rain, 2=moderate rain, 3=heavy rain, 4=gusting rain, 5=downpour, 6=light snow, 7=moderate snow, 8=snow flurries, 9=heavy snow, 10=sleet, 11=ice storm, 12=light hail, 13=heavy hail, 14=lightning storm +Gamemaster.cmd.changeweather.fog=Fog +Gamemaster.cmd.changeweather.light=Light +Gamemaster.cmd.changeweather.wind=Wind +Gamemaster.cmd.changeweather.winddir=Wind Direction +Gamemaster.cmd.changeweather.atmo=Atmosphere +Gamemaster.cmd.changeweather.blowsand=Blowing Sand +Gamemaster.cmd.changeweather.emi=EMI +Gamemaster.cmd.changeweather.weather=Weather # Disaster cmd +Gamemaster.cmd.disaster.longName=Disaster Gamemaster.cmd.disaster.help=Causes a disaster on the board. Gamemaster.cmd.disaster.type=Type of disaster. Beware, some disasters are very destructive! Gamemaster.cmd.changeweather.fog.success=The fog has changed. -Gamemaster.cmd.changeweather.fog.error=Invalid fog value. Must be between 0 and {0} - Gamemaster.cmd.changeweather.wind.success=The wind strength has changed. -Gamemaster.cmd.changeweather.wind.error=Invalid wind value. Must be between 0 and {0} - Gamemaster.cmd.changeweather.winddir.success=The wind direction has changed. -Gamemaster.cmd.changeweather.winddir.error=Invalid wind direction value. Must be between 0 and {0} - Gamemaster.cmd.changeweather.light.success=The light has changed. -Gamemaster.cmd.changeweather.light.error=Invalid light value. Must be between 0 and {0} - Gamemaster.cmd.changeweather.atmo.success0=The air has vanished, put your vac suits! Gamemaster.cmd.changeweather.atmo.success=The air is changing. -Gamemaster.cmd.changeweather.atmo.error=Invalid atmosphere value. Must be between 0 and {0} - Gamemaster.cmd.changeweather.blowsand.success1=Sand started blowing. Gamemaster.cmd.changeweather.blowsand.success=The sand has settled. -Gamemaster.cmd.changeweather.blowsand.error=Invalid blowsand value. Must be between 0 and {0} - Gamemaster.cmd.changeweather.weather.success=The weather has changed. -Gamemaster.cmd.changeweather.weather.error=Invalid weather value. Must be between 0 and {0} - Gamemaster.cmd.changeweather.emi.success1=EMI is active. Gamemaster.cmd.changeweather.emi.success=EMI is inactive. -Gamemaster.cmd.changeweather.emi.error=Invalid EMI value. Must be between 0 and {0} # Firestarter cmd +Gamemaster.cmd.firestarter.longName=Start a Fire Gamemaster.cmd.fire.type=Type of fire. They are 1=Normal, 2=Inferno, 3=Inferno Bomb or 4=Inferno IV. Gamemaster.cmd.fire.help=Starts a fire on the board. - # Firestorm cmd +Gamemaster.cmd.firestorm.longName=Firestorm Gamemaster.cmd.firestorm.help=Starts fire in the entire board. Gamemaster.cmd.fire.failed=Failed to ignite fire. Gamemaster.cmd.fire.percent=Percentage of the board hexes to ignite. - # Orbital bombardment cmd +Gamemaster.cmd.orbitalbombardment.longName=Orbital Bombardment Gamemaster.cmd.orbitalbombardment.help=Calls an orbital bombardment on the board. It hits after the firing phase. -Gamemaster.cmd.orbitalbombardment.dmg=Damage of the bombardment at target hex. +Gamemaster.cmd.orbitalbombardment.dmg=Total damage at target hex. Gamemaster.cmd.orbitalbombardment.radius=Radius of the bombardment. Gamemaster.cmd.orbitalbombardment.error.outofbounds=Specified hex is not on the board. Gamemaster.cmd.orbitalbombardment.success=Orbital bombardment incoming! \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/swing/MapMenu.java b/megamek/src/megamek/client/ui/swing/MapMenu.java index 505e6fee4f9..02f40d37980 100644 --- a/megamek/src/megamek/client/ui/swing/MapMenu.java +++ b/megamek/src/megamek/client/ui/swing/MapMenu.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2005 - Ben Mazur (bmazur@sev.org) - * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2024 - The MegaMek Team. All Rights Reserved. * * This file is part of MegaMek. * @@ -46,7 +46,6 @@ import megamek.common.weapons.other.CLFireExtinguisher; import megamek.common.weapons.other.ISFireExtinguisher; import megamek.logging.MMLogger; -import megamek.server.Server; import megamek.server.commands.*; /** @@ -407,13 +406,14 @@ private JMenu createGamemasterMenu() { if (!client.getLocalPlayer().getGameMaster()) { return menu; } else { - JMenu dmgMenu = new JMenu(Messages.getString("Gamemaster.EditDamage")); JMenu cfgMenu = new JMenu(Messages.getString("Gamemaster.Configure")); JMenu traitorMenu = new JMenu(Messages.getString("Gamemaster.Traitor")); JMenu killMenu = new JMenu(Messages.getString("Gamemaster.KillUnit")); JMenu specialCommandsMenu = createGMSpecialCommandsMenu(); + var entities = client.getGame().getEntitiesVector(coords); + for (Entity entity : entities) { dmgMenu.add(createUnitEditorMenuItem(entity)); cfgMenu.add(createCustomMekMenuItem(entity)); @@ -425,30 +425,40 @@ private JMenu createGamemasterMenu() { } if (cfgMenu.getItemCount() != 0) { menu.add(cfgMenu); + menu.addSeparator(); } if (traitorMenu.getItemCount() != 0) { menu.add(traitorMenu); } if (killMenu.getItemCount() != 0) { menu.add(killMenu); + menu.addSeparator(); } menu.add(specialCommandsMenu); return menu; } } - private record Tuple(String name, GamemasterServerCommand command) {} - + /** + * Create a menu for special commands for the GM + * @return the menu + */ private JMenu createGMSpecialCommandsMenu() { JMenu menu = new JMenu(Messages.getString("Gamemaster.SpecialCommands")); - Server.getServerInstance().getAllCommands().stream() - .filter(cmd -> cmd instanceof GamemasterServerCommand) - .map(cmd -> (GamemasterServerCommand) cmd) - .forEach(cmd -> { - JMenuItem item = new JMenuItem(cmd.getName()); - item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd).setVisible(true)); - menu.add(item); - }); + List.of( + new KillCommand(null, null), + new OrbitalBombardmentCommand(null, null), + new ChangeOwnershipCommand(null, null), + new DisasterCommand(null, null), + new FirestarterCommand(null, null), + new FirestormCommand(null, null), + new RemoveSmokeCommand(null, null), + new ChangeWeatherCommand(null, null) + ).forEach(cmd -> { + JMenuItem item = new JMenuItem(cmd.getLongName()); + item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd).setVisible(true)); + menu.add(item); + }); return menu; } @@ -539,11 +549,11 @@ private JMenuItem createTraitorMenuItem(Entity en) { } private JMenuItem createKillMenuItem(Entity en) { - JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.KillUnit") + " " + en.getDisplayName()); + JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.KillUnit.text", en.getDisplayName())); item.addActionListener(evt -> { int confirm = JOptionPane.showConfirmDialog( - gui.getFrame(), - "Are you sure you want to kill " + en.getDisplayName() + "?", "Confirm", JOptionPane.YES_NO_OPTION); + gui.getFrame(), Messages.getString("Gamemaster.KillUnit.confirmation", en.getDisplayName()), + Messages.getString("Gamemaster.dialog.confirm"), JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { client.sendChat(String.format("/kill %d", en.getId())); } diff --git a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java index bd47005e518..be1f0df252a 100644 --- a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java +++ b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java @@ -5,6 +5,7 @@ import megamek.server.commands.arguments.Argument; import megamek.server.commands.arguments.EnumArgument; import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.commands.arguments.OptionalEnumArgument; import javax.swing.*; import java.awt.*; @@ -22,64 +23,122 @@ public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerC super(parent, command.getName(), true); this.command = command; this.client = client; + initializeUI(parent); + } + + private void initializeUI(JFrame parent) { setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); + addTitleAndDescription(); + Map argumentComponents = addArgumentComponents(); + addExecuteButton(argumentComponents); + pack(); + setLocationRelativeTo(parent); + } + + private void addTitleAndDescription() { + JPanel titlePanel = new JPanel(); + titlePanel.setLayout(new BoxLayout(titlePanel, BoxLayout.Y_AXIS)); + + JLabel titleLabel = new JLabel(command.getLongName()); + titleLabel.setFont(new Font("Arial", Font.BOLD, 16)); + titlePanel.add(titleLabel); JLabel helpLabel = new JLabel(command.getHelpHtml()); - add(helpLabel); + helpLabel.setFont(new Font("Arial", Font.PLAIN, 12)); + titlePanel.add(helpLabel); + + add(titlePanel); + } + private Map addArgumentComponents() { List> arguments = command.defineArguments(); Map argumentComponents = new HashMap<>(); for (Argument argument : arguments) { - JPanel argumentPanel = new JPanel(); - argumentPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); - - JLabel label = new JLabel(argument.getName() + ":"); - argumentPanel.add(label); - - if (argument instanceof IntegerArgument) { - IntegerArgument intArg = (IntegerArgument) argument; - JSpinner spinner = new JSpinner(new SpinnerNumberModel( - intArg.hasDefaultValue() ? intArg.getValue() : 0, - intArg.getMinValue(), - intArg.getMaxValue(), - 1)); - argumentPanel.add(spinner); - argumentComponents.put(argument.getName(), spinner); - } else if (argument instanceof EnumArgument) { - EnumArgument enumArg = (EnumArgument) argument; - JComboBox comboBox = new JComboBox<>(); - for (Enum constant : enumArg.getEnumType().getEnumConstants()) { - comboBox.addItem(constant.name()); - } - if (enumArg.getValue() != null) { - comboBox.setSelectedItem(enumArg.getValue().name()); - } - argumentPanel.add(comboBox); - argumentComponents.put(argument.getName(), comboBox); - } - + JPanel argumentPanel = createArgumentPanel(argument); add(argumentPanel); + argumentComponents.put(argument.getName(), getArgumentComponent(argument, argumentPanel)); } + return argumentComponents; + } - JButton executeButton = new JButton("Execute Command"); - executeButton.addActionListener(e -> executeCommand(argumentComponents)); - add(executeButton); + private JPanel createArgumentPanel(Argument argument) { + JPanel argumentPanel = new JPanel(); + argumentPanel.setLayout(new FlowLayout()); + JLabel label = new JLabel(argument.getName() + ":"); + argumentPanel.add(label); + return argumentPanel; + } - pack(); - setLocationRelativeTo(parent); + private JComponent getArgumentComponent(Argument argument, JPanel argumentPanel) { + if (argument instanceof IntegerArgument intArg) { + JSpinner spinner = createSpinner(intArg); + argumentPanel.add(spinner); + return spinner; + } else if (argument instanceof OptionalEnumArgument enumArg) { + JComboBox comboBox = createOptionalEnumComboBox(enumArg); + argumentPanel.add(comboBox); + return comboBox; + } else if (argument instanceof EnumArgument enumArg) { + JComboBox comboBox = createEnumComboBox(enumArg); + argumentPanel.add(comboBox); + return comboBox; + } + return null; } - private String wrapText(String text, int lineLength) { - StringBuilder wrappedText = new StringBuilder(""); - int currentIndex = 0; - while (currentIndex < text.length()) { - int endIndex = Math.min(currentIndex + lineLength, text.length()); - wrappedText.append(text, currentIndex, endIndex).append("
"); - currentIndex = endIndex; + private JSpinner createSpinner(IntegerArgument intArg) { + return new JSpinner(new SpinnerNumberModel( + intArg.hasDefaultValue() ? intArg.getValue() : 0, + intArg.getMinValue(), + intArg.getMaxValue(), + 1)); + } + + private JComboBox createOptionalEnumComboBox(OptionalEnumArgument enumArg) { + JComboBox comboBox = new JComboBox<>(); + if (enumArg.getValue() == null) { + comboBox.addItem("-"); + comboBox.setSelectedItem("-"); + } + for (var arg : enumArg.getEnumType().getEnumConstants()) { + comboBox.addItem(arg.ordinal() + ": " + arg.toString()); } - wrappedText.append(""); - return wrappedText.toString(); + if (enumArg.getValue() != null) { + comboBox.setSelectedItem(enumArg.getValue().ordinal() + ": " + enumArg.getValue().toString()); + } + return comboBox; + } + + private JComboBox createEnumComboBox(EnumArgument enumArg) { + JComboBox comboBox = new JComboBox<>(); + for (Enum constant : enumArg.getEnumType().getEnumConstants()) { + comboBox.addItem(constant.name()); + } + if (enumArg.getValue() != null) { + comboBox.setSelectedItem(enumArg.getValue().name()); + } + return comboBox; + } + + private void addExecuteButton(Map argumentComponents) { + add(getExecuteButton(argumentComponents)); + } + + private JButton getExecuteButton(Map argumentComponents) { + JButton executeButton = new JButton("Execute Command"); + executeButton.addActionListener(e -> { + int response = JOptionPane.showConfirmDialog( + this, + "Are you sure you want to execute this command?", + "Execute Command", + JOptionPane.YES_NO_OPTION + ); + if (response == JOptionPane.YES_OPTION) { + executeCommand(argumentComponents); + } + }); + return executeButton; } private void executeCommand(Map argumentComponents) { @@ -93,7 +152,18 @@ private void executeCommand(Map argumentComponents) { if (component instanceof JSpinner) { args[i] = argument.getName() + "=" + ((JSpinner) component).getValue().toString(); } else if (component instanceof JComboBox) { - args[i] = argument.getName() + "=" + Objects.requireNonNull(((JComboBox) component).getSelectedItem()); + if (argument instanceof OptionalEnumArgument) { + String selectedItem = (String) ((JComboBox) component).getSelectedItem(); + if (selectedItem == null || selectedItem.equals("-")) { + // If it is null we just set it to an empty string and move on + args[i] = ""; + continue; + } + var selectedItemValue = selectedItem.split(":")[0].trim(); + args[i] = argument.getName() + "=" + selectedItemValue; + } else { + args[i] = argument.getName() + "=" + Objects.requireNonNull(((JComboBox) component).getSelectedItem()); + } } } client.getClient().sendChat("/" + command.getName() + " " + String.join(" ", args)); diff --git a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java index d2860a04112..a8971ffc63e 100644 --- a/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java +++ b/megamek/src/megamek/server/commands/ChangeOwnershipCommand.java @@ -38,7 +38,8 @@ public ChangeOwnershipCommand(Server server, TWGameManager gameManager) { super(server, gameManager, "changeOwner", - Messages.getString("Gamemaster.cmd.changeownership.help")); + Messages.getString("Gamemaster.cmd.changeownership.help"), + Messages.getString("Gamemaster.cmd.changeownership.longName")); } @Override diff --git a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java index b28f24962ed..e47c936ab1a 100644 --- a/megamek/src/megamek/server/commands/ChangeWeatherCommand.java +++ b/megamek/src/megamek/server/commands/ChangeWeatherCommand.java @@ -17,11 +17,12 @@ import megamek.common.planetaryconditions.*; import megamek.server.Server; import megamek.server.commands.arguments.Argument; -import megamek.server.commands.arguments.OptionalIntegerArgument; +import megamek.server.commands.arguments.OptionalEnumArgument; import megamek.server.totalwarfare.TWGameManager; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; @@ -41,79 +42,67 @@ public class ChangeWeatherCommand extends GamemasterServerCommand { /** Creates new ChangeWeatherCommand */ public ChangeWeatherCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, WEATHER, Messages.getString("Gamemaster.cmd.changeweather.help")); + super(server, gameManager, WEATHER, Messages.getString("Gamemaster.cmd.changeweather.help"), + Messages.getString("Gamemaster.cmd.changeweather.longName")); } @Override public List> defineArguments() { - return List.of(new OptionalIntegerArgument(FOG, Messages.getString("Gamemaster.cmd.changeweather.fog"), 0, 2), - new OptionalIntegerArgument(LIGHT, Messages.getString("Gamemaster.cmd.changeweather.light"), 0, 6), - new OptionalIntegerArgument(WIND, Messages.getString("Gamemaster.cmd.changeweather.wind"), 0, 6), - new OptionalIntegerArgument(WIND_DIR, Messages.getString("Gamemaster.cmd.changeweather.winddir"), 0, 6), - new OptionalIntegerArgument(ATMO, Messages.getString("Gamemaster.cmd.changeweather.atmo"), 0, 5), - new OptionalIntegerArgument(BLOWSAND, Messages.getString("Gamemaster.cmd.changeweather.blowsand"), 0, 1), - new OptionalIntegerArgument(EMIS, Messages.getString("Gamemaster.cmd.changeweather.emi"), 0, 1), - new OptionalIntegerArgument(WEATHER, Messages.getString("Gamemaster.cmd.changeweather.weather"), 0, 14)); + return List.of(new OptionalEnumArgument<>(FOG, Messages.getString("Gamemaster.cmd.changeweather.fog"), Fog.class), + new OptionalEnumArgument<>(LIGHT, Messages.getString("Gamemaster.cmd.changeweather.light"), Light.class), + new OptionalEnumArgument<>(WIND, Messages.getString("Gamemaster.cmd.changeweather.wind"), Wind.class), + new OptionalEnumArgument<>(WIND_DIR, Messages.getString("Gamemaster.cmd.changeweather.winddir"), WindDirection.class), + new OptionalEnumArgument<>(ATMO, Messages.getString("Gamemaster.cmd.changeweather.atmo"), Atmosphere.class), + new OptionalEnumArgument<>(BLOWSAND, Messages.getString("Gamemaster.cmd.changeweather.blowsand"), BlowingSand.class), + new OptionalEnumArgument<>(EMIS, Messages.getString("Gamemaster.cmd.changeweather.emi"), EMI.class), + new OptionalEnumArgument<>(WEATHER, Messages.getString("Gamemaster.cmd.changeweather.weather"), Weather.class)); } - private void updatePlanetaryCondition(int value, int connId, int maxLength, Consumer setter, - Function successMessage, Function errorMessage) { - if (value >= 0 && value < maxLength) { - setter.accept(value); - server.sendServerChat(connId, successMessage.apply(value)); - } else { - server.sendServerChat(connId, errorMessage.apply(maxLength)); + private record Condition>(Consumer setter, Function successMessage) { + @SuppressWarnings("unchecked") + public void updatePlanetaryCondition(Enum value, int connId, Server server) { + setter.accept((E) value); + server.sendServerChat(connId, successMessage.apply((E) value)); } } - private record Condition(int maxLength, Consumer setter, Function successMessage, Function errorMessage) {} - /** * Run this command with the arguments supplied */ @Override public void runAsGM(int connId, Map> args) { var planetaryConditions = getGameManager().getGame().getPlanetaryConditions(); + var conditions = getStringConditionMap(planetaryConditions); + conditions.forEach(updatePlanetaryConditions(connId, args)); + getGameManager().getGame().setPlanetaryConditions(planetaryConditions); + } - Map conditions = Map.of( - FOG, new Condition(Fog.values().length, value -> planetaryConditions.setFog(Fog.values()[value]), - value -> Messages.getString("Gamemaster.cmd.changeweather.fog.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.fog.error", (maxLength - 1))), - WIND, new Condition(Wind.values().length, value -> planetaryConditions.setWind(Wind.values()[value]), - value -> Messages.getString("Gamemaster.cmd.changeweather.wind.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.wind.error", (maxLength - 1))), - WIND_DIR, new Condition(WindDirection.values().length, value -> planetaryConditions.setWindDirection(WindDirection.values()[value]), - value -> Messages.getString("Gamemaster.cmd.changeweather.winddir.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.winddir.error", (maxLength - 1))), - LIGHT, new Condition(Light.values().length, value -> planetaryConditions.setLight(Light.values()[value]), - value -> Messages.getString("Gamemaster.cmd.changeweather.light.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.light.error", (maxLength - 1))), - ATMO, new Condition(Atmosphere.values().length, value -> planetaryConditions.setAtmosphere(Atmosphere.values()[value]), - value -> value == 0 ? Messages.getString("Gamemaster.cmd.changeweather.atmo.success0") : Messages.getString("Gamemaster.cmd.changeweather.atmo.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.atmo.error", (maxLength - 1))), - BLOWSAND, new Condition(BlowingSand.values().length, value -> planetaryConditions.setBlowingSand(BlowingSand.values()[value]), - value -> value == 1 ? Messages.getString("Gamemaster.cmd.changeweather.blowsand.success1") : Messages.getString("Gamemaster.cmd.changeweather.blowsand.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.blowsand.error", (maxLength - 1))), - WEATHER, new Condition(Weather.values().length, value -> planetaryConditions.setWeather(Weather.values()[value]), - value -> Messages.getString("Gamemaster.cmd.changeweather.weather.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.weather.error", (maxLength - 1))), - EMIS, new Condition(EMI.values().length, value -> planetaryConditions.setEMI(EMI.values()[value]), - value -> value == 1 ? Messages.getString("Gamemaster.cmd.changeweather.emi.success1") : Messages.getString("Gamemaster.cmd.changeweather.emi.success"), - maxLength -> Messages.getString("Gamemaster.cmd.changeweather.emi.error", (maxLength - 1))) - ); - - conditions.forEach((prefix, condition) -> { - if (args.containsKey(prefix) && ((OptionalIntegerArgument) args.get(prefix)).getValue().isPresent()) { - updatePlanetaryCondition( - ((OptionalIntegerArgument) args.get(prefix)).getValue().get(), - connId, - condition.maxLength, - condition.setter, - condition.successMessage, - condition.errorMessage); + private BiConsumer> updatePlanetaryConditions(int connId, Map> args) { + return (prefix, condition) -> { + if (args.containsKey(prefix) && ((OptionalEnumArgument) args.get(prefix)).isPresent()) { + var value = ((OptionalEnumArgument) args.get(prefix)).getValue(); + condition.updatePlanetaryCondition(value, connId, server); } - }); + }; + } - getGameManager().getGame().setPlanetaryConditions(planetaryConditions); + private static Map> getStringConditionMap(PlanetaryConditions planetaryConditions) { + return Map.of( + FOG, new Condition<>(planetaryConditions::setFog, value -> Messages.getString("Gamemaster.cmd.changeweather.fog.success")), + WIND, new Condition<>(planetaryConditions::setWind, value -> Messages.getString("Gamemaster.cmd.changeweather.wind.success")), + WIND_DIR, new Condition<>(planetaryConditions::setWindDirection, value -> Messages.getString("Gamemaster.cmd.changeweather.winddir.success")), + LIGHT, new Condition<>(planetaryConditions::setLight, value -> Messages.getString("Gamemaster.cmd.changeweather.light.success")), + ATMO, new Condition<>(planetaryConditions::setAtmosphere, + value -> value.equals(Atmosphere.VACUUM) ? Messages.getString("Gamemaster.cmd.changeweather.atmo.success0") : + Messages.getString("Gamemaster.cmd.changeweather.atmo.success")), + BLOWSAND, new Condition<>(planetaryConditions::setBlowingSand, + value -> value.equals(BlowingSand.BLOWING_SAND) ? Messages.getString("Gamemaster.cmd.changeweather.blowsand.success1") : + Messages.getString("Gamemaster.cmd.changeweather.blowsand.success")), + WEATHER, new Condition<>(planetaryConditions::setWeather, + value -> Messages.getString("Gamemaster.cmd.changeweather.weather.success")), + EMIS, new Condition<>(planetaryConditions::setEMI, + value -> value.equals(EMI.EMI) ? Messages.getString("Gamemaster.cmd.changeweather.emi.success1") : + Messages.getString("Gamemaster.cmd.changeweather.emi.success")) + ); } } diff --git a/megamek/src/megamek/server/commands/DisasterCommand.java b/megamek/src/megamek/server/commands/DisasterCommand.java index 0c7d3dc4b2f..920cc1209f5 100644 --- a/megamek/src/megamek/server/commands/DisasterCommand.java +++ b/megamek/src/megamek/server/commands/DisasterCommand.java @@ -39,6 +39,7 @@ enum Disaster { ORBITAL_BOMBARDMENT_3, SANDSTORM, HAILSTORM, + ICESTORM, ECLIPSE, SOLAR_FLARE, SUPERNOVA, @@ -52,7 +53,8 @@ public static Disaster getRandomDisaster() { } public DisasterCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "disaster", Messages.getString("Gamemaster.cmd.disaster.help")); + super(server, gameManager, "disaster", Messages.getString("Gamemaster.cmd.disaster.help"), + Messages.getString("Gamemaster.cmd.disaster.longName")); } @Override @@ -100,6 +102,10 @@ private void runDisasterCommand(int connId, Disaster disaster) { new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "weather=13", "wind=4", "winddir=6"}); server.sendServerChat("A hailstorm is incoming!"); break; + case ICESTORM: + new ChangeWeatherCommand(server, gameManager).run(connId, new String[]{"weather", "fog=1", "weather=11", "wind=6", "winddir=6"}); + server.sendServerChat("A hailstorm is incoming!"); + break; case FIRESTORM: new FirestormCommand(server, gameManager).run(connId, new String[]{"firestorm", "2", "50"}); server.sendServerChat("A firestorm is consuming the battlefield!"); diff --git a/megamek/src/megamek/server/commands/FirestarterCommand.java b/megamek/src/megamek/server/commands/FirestarterCommand.java index 2af7f0d4913..281759a1ef9 100644 --- a/megamek/src/megamek/server/commands/FirestarterCommand.java +++ b/megamek/src/megamek/server/commands/FirestarterCommand.java @@ -41,7 +41,8 @@ public FirestarterCommand(Server server, TWGameManager gameManager) { super(server, gameManager, FIRESTARTER, - Messages.getString("Gamemaster.cmd.fire.help")); + Messages.getString("Gamemaster.cmd.fire.help"), + Messages.getString("Gamemaster.cmd.firestarter.longName")); } @Override diff --git a/megamek/src/megamek/server/commands/FirestormCommand.java b/megamek/src/megamek/server/commands/FirestormCommand.java index e349392718c..8f482489b46 100644 --- a/megamek/src/megamek/server/commands/FirestormCommand.java +++ b/megamek/src/megamek/server/commands/FirestormCommand.java @@ -40,7 +40,8 @@ public FirestormCommand(Server server, TWGameManager gameManager) { super(server, gameManager, FIRESTORM, - Messages.getString("Gamemaster.cmd.firestorm.help")); + Messages.getString("Gamemaster.cmd.firestorm.help"), + Messages.getString("Gamemaster.cmd.firestorm.longName")); } @Override diff --git a/megamek/src/megamek/server/commands/GamemasterServerCommand.java b/megamek/src/megamek/server/commands/GamemasterServerCommand.java index cd3674e09bf..d22dcc36f3d 100644 --- a/megamek/src/megamek/server/commands/GamemasterServerCommand.java +++ b/megamek/src/megamek/server/commands/GamemasterServerCommand.java @@ -34,6 +34,8 @@ public abstract class GamemasterServerCommand extends ServerCommand { protected final TWGameManager gameManager; protected final static MMLogger logger = MMLogger.create(GamemasterServerCommand.class); private final String errorMsg; + private final String longName; + /** * Creates new ServerCommand that can only be used by Game Masters * @@ -42,10 +44,11 @@ public abstract class GamemasterServerCommand extends ServerCommand { * @param name the name of the command * @param helpText the help text for the command */ - public GamemasterServerCommand(Server server, TWGameManager gameManager, String name, String helpText) { + public GamemasterServerCommand(Server server, TWGameManager gameManager, String name, String helpText, String longName) { super(server, name, helpText); this.gameManager = gameManager; this.errorMsg = "Error executing command: " + name; + this.longName = longName; } private boolean isGM(int connId) { @@ -145,7 +148,7 @@ public String getHelpHtml() { this.getHelp() .replaceAll("<", "<") .replaceAll(">", ">") - .replaceAll(" ", " ") + .replaceAll(" ", "| ") .replaceAll(NEWLINE, "
")+ ""; } @@ -157,6 +160,7 @@ public String getHelp() { .append(NEWLINE) .append(Messages.getString("Gamemaster.cmd.help")) .append(NEWLINE) + .append(NEWLINE) .append("/") .append(getName()); @@ -165,7 +169,9 @@ public String getHelp() { .append(arg.getRepr()); } - help.append(NEWLINE); + help.append(NEWLINE) + .append(NEWLINE); + for (var arg : defineArguments()) { help.append(LONG_WHITESPACE) .append(arg.getName()) @@ -177,6 +183,10 @@ public String getHelp() { return help.toString(); } + public String getLongName() { + return longName; + } + // The new method for game master commands that uses parsed arguments protected abstract void runAsGM(int connId, Map> args); } diff --git a/megamek/src/megamek/server/commands/KillCommand.java b/megamek/src/megamek/server/commands/KillCommand.java index d0d19a94970..bbbe191067c 100644 --- a/megamek/src/megamek/server/commands/KillCommand.java +++ b/megamek/src/megamek/server/commands/KillCommand.java @@ -31,7 +31,8 @@ public class KillCommand extends GamemasterServerCommand{ /** Creates new KillCommand */ public KillCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "kill", Messages.getString("Gamemaster.cmd.kill.help")); + super(server, gameManager, "kill", Messages.getString("Gamemaster.cmd.kill.help"), + Messages.getString("Gamemaster.cmd.kill.longName")); } @Override diff --git a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java index 7d9a08b65db..450338e312a 100644 --- a/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java +++ b/megamek/src/megamek/server/commands/OrbitalBombardmentCommand.java @@ -34,7 +34,8 @@ public class OrbitalBombardmentCommand extends GamemasterServerCommand { public static final String RADIUS = "radius"; public OrbitalBombardmentCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "ob", Messages.getString("Gamemaster.cmd.orbitalbombardment.help")); + super(server, gameManager, "ob", Messages.getString("Gamemaster.cmd.orbitalbombardment.help"), + Messages.getString("Gamemaster.cmd.orbitalbombardment.longName")); } @Override diff --git a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java index 7286cc99955..25e24540d0a 100644 --- a/megamek/src/megamek/server/commands/RemoveSmokeCommand.java +++ b/megamek/src/megamek/server/commands/RemoveSmokeCommand.java @@ -28,7 +28,8 @@ public class RemoveSmokeCommand extends GamemasterServerCommand { /** Creates new KillCommand */ public RemoveSmokeCommand(Server server, TWGameManager gameManager) { - super(server, gameManager, "nosmoke", Messages.getString("Gamemaster.cmd.removesmoke.help")); + super(server, gameManager, "nosmoke", Messages.getString("Gamemaster.cmd.removesmoke.help"), + Messages.getString("Gamemaster.cmd.removesmoke.longName")); } @Override diff --git a/megamek/src/megamek/server/commands/arguments/Argument.java b/megamek/src/megamek/server/commands/arguments/Argument.java index e04da44df35..5bcd84ef251 100644 --- a/megamek/src/megamek/server/commands/arguments/Argument.java +++ b/megamek/src/megamek/server/commands/arguments/Argument.java @@ -24,7 +24,7 @@ public String getDescription() { } public String getRepr() { - return "<" + getName() + ">"; + return "<" + getName() + "=#>"; } public abstract String getHelp(); diff --git a/megamek/src/megamek/server/commands/arguments/EnumArgument.java b/megamek/src/megamek/server/commands/arguments/EnumArgument.java index f317027432f..85747815c97 100644 --- a/megamek/src/megamek/server/commands/arguments/EnumArgument.java +++ b/megamek/src/megamek/server/commands/arguments/EnumArgument.java @@ -5,8 +5,8 @@ import java.util.Arrays; public class EnumArgument> extends Argument { - private final Class enumType; - private final E defaultValue; + protected final Class enumType; + protected final E defaultValue; public EnumArgument(String name, String description, Class enumType, E defaultValue) { super(name, description); From a4c6b6ac8b3afc0254958ce235143fe106a839c8 Mon Sep 17 00:00:00 2001 From: Scoppio Date: Fri, 15 Nov 2024 22:15:04 -0300 Subject: [PATCH 39/57] feat: server commands added --- .../gmCommands/GamemasterCommandPanel.java | 2 +- .../commands/GamemasterServerCommand.java | 2 +- .../arguments/OptionalEnumArgument.java | 52 +++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java diff --git a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java index be1f0df252a..bc6e7b9c6e5 100644 --- a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java +++ b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java @@ -102,7 +102,7 @@ private JComboBox createOptionalEnumComboBox(OptionalEnumArgument enu comboBox.setSelectedItem("-"); } for (var arg : enumArg.getEnumType().getEnumConstants()) { - comboBox.addItem(arg.ordinal() + ": " + arg.toString()); + comboBox.addItem(arg.ordinal() + ": " + arg); } if (enumArg.getValue() != null) { comboBox.setSelectedItem(enumArg.getValue().ordinal() + ": " + enumArg.getValue().toString()); diff --git a/megamek/src/megamek/server/commands/GamemasterServerCommand.java b/megamek/src/megamek/server/commands/GamemasterServerCommand.java index d22dcc36f3d..ef584614c06 100644 --- a/megamek/src/megamek/server/commands/GamemasterServerCommand.java +++ b/megamek/src/megamek/server/commands/GamemasterServerCommand.java @@ -148,7 +148,7 @@ public String getHelpHtml() { this.getHelp() .replaceAll("<", "<") .replaceAll(">", ">") - .replaceAll(" ", "| ") + .replaceAll(LONG_WHITESPACE, "| ") .replaceAll(NEWLINE, "
")+ ""; } diff --git a/megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java b/megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java new file mode 100644 index 00000000000..2c7ce40a1c4 --- /dev/null +++ b/megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java @@ -0,0 +1,52 @@ +package megamek.server.commands.arguments; + +import megamek.client.ui.Messages; + +import java.util.Arrays; + +public class OptionalEnumArgument> extends EnumArgument { + + public OptionalEnumArgument(String name, String description, Class enumType) { + super(name, description, enumType, null); + } + + @Override + public void parse(String input) throws IllegalArgumentException { + if (input == null) { + return; + } + try { + value = enumType.getEnumConstants()[Integer.parseInt(input)]; + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(getName() + " must be one of: " + getEnumConstantsString()); + } + } + + public boolean isPresent() { + return value != null; + } + + public boolean isEmpty() { + return value == null; + } + + private String getEnumConstantsString() { + var sb = new StringBuilder(); + for (int i = 0; i < enumType.getEnumConstants().length; i++) { + sb.append(i).append(": ").append(enumType.getEnumConstants()[i]); + if (i < enumType.getEnumConstants().length - 1) { + sb.append(", "); + } + } + return sb.toString(); + } + + @Override + public String getHelp() { + return getDescription() + + " [" + getEnumConstantsString() + "] " + + (defaultValue != null ? " [default: " + defaultValue + "]. " : ". ") + + Messages.getString("Gamemaster.cmd.params.optional"); + } + +} From 0dbd73b1f7cf8143090a0f6a57eded864ee24d59 Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Fri, 15 Nov 2024 20:25:08 -0500 Subject: [PATCH 40/57] check for duplicate boards and log any found --- .../src/megamek/utilities/BoardsTagger.java | 61 +++++++++++++++---- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/megamek/src/megamek/utilities/BoardsTagger.java b/megamek/src/megamek/utilities/BoardsTagger.java index cb381a87a33..9328a158fad 100644 --- a/megamek/src/megamek/utilities/BoardsTagger.java +++ b/megamek/src/megamek/utilities/BoardsTagger.java @@ -21,18 +21,11 @@ import static java.util.stream.Collectors.toSet; import static megamek.common.Terrains.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.io.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.*; +import java.util.stream.Collectors; import megamek.common.Board; import megamek.common.Building; @@ -141,6 +134,8 @@ public static void main(String... args) { * them. */ private static void scanForBoards(File file) throws IOException { + Map> boardCheckSum = new HashMap<>(); + if (file.isDirectory()) { String[] fileList = file.list(); for (String filename : fileList) { @@ -149,11 +144,20 @@ private static void scanForBoards(File file) throws IOException { scanForBoards(new File(file, filename)); } else { tagBoard(filepath); + checkSum(boardCheckSum, filepath); } } } else { tagBoard(file); + checkSum(boardCheckSum, file); } + + boardCheckSum.forEach((key, value) -> { + if (value.size() > 1) { + String message = key + " : " + value.stream().sorted().collect(Collectors.joining(", ")); + logger.info(message); + } + }); } /** @@ -347,4 +351,37 @@ private static void tagBoard(File boardFile) { } } } + + private static void checkSum(Map> boardCheckSum, File boardFile) { + MessageDigest md; + + try { + md = MessageDigest.getInstance("SHA-256"); + + String line; + List lines = new ArrayList<>(); + + // remove tag lines + try (BufferedReader br = new BufferedReader(new FileReader(boardFile));) { + while ((line = br.readLine()) != null) { + if (!line.startsWith("tag ")) { + lines.add(line); + } + } + } catch (Exception e) { + logger.error(e, "Error Calculating Hash"); + } + + String sortedLines = lines.stream().sorted().collect(Collectors.joining()); + + md.update(sortedLines.getBytes(), 0, sortedLines.length()); + HexFormat hexFormat = HexFormat.of(); + String cs = hexFormat.formatHex(md.digest()).toUpperCase(); + boardCheckSum.putIfAbsent(cs, new ArrayList<>()); + + boardCheckSum.get(cs).add(boardFile.getPath()); + } catch (NoSuchAlgorithmException e) { + logger.error(e, "SHA-256 Algorithm Can't be Found"); + } + } } From 34c8d20c232bc77bfa7398e346fd194b90c1e08b Mon Sep 17 00:00:00 2001 From: kuronekochomusuke Date: Fri, 15 Nov 2024 20:32:31 -0500 Subject: [PATCH 41/57] fix issue --- .../src/megamek/utilities/BoardsTagger.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/megamek/src/megamek/utilities/BoardsTagger.java b/megamek/src/megamek/utilities/BoardsTagger.java index 9328a158fad..8fd677a5c99 100644 --- a/megamek/src/megamek/utilities/BoardsTagger.java +++ b/megamek/src/megamek/utilities/BoardsTagger.java @@ -119,8 +119,17 @@ public static Tags parse(String tag) { public static void main(String... args) { try { + Map> boardCheckSum = new HashMap<>(); + File boardDir = Configuration.boardsDir(); - scanForBoards(boardDir); + scanForBoards(boardDir, boardCheckSum); + + boardCheckSum.forEach((key, value) -> { + if (value.size() > 1) { + String message = key + " : " + value.stream().sorted().collect(Collectors.joining(", ")); + logger.info(message); + } + }); } catch (Exception ex) { logger.error(ex, "Board tagger cannot scan boards"); System.exit(64); @@ -133,15 +142,13 @@ public static void main(String... args) { * Recursively scans the supplied file/directory for any boards and auto-tags * them. */ - private static void scanForBoards(File file) throws IOException { - Map> boardCheckSum = new HashMap<>(); - + private static void scanForBoards(File file, Map> boardCheckSum) throws IOException { if (file.isDirectory()) { String[] fileList = file.list(); for (String filename : fileList) { File filepath = new File(file, filename); if (filepath.isDirectory()) { - scanForBoards(new File(file, filename)); + scanForBoards(new File(file, filename), boardCheckSum); } else { tagBoard(filepath); checkSum(boardCheckSum, filepath); @@ -151,13 +158,6 @@ private static void scanForBoards(File file) throws IOException { tagBoard(file); checkSum(boardCheckSum, file); } - - boardCheckSum.forEach((key, value) -> { - if (value.size() > 1) { - String message = key + " : " + value.stream().sorted().collect(Collectors.joining(", ")); - logger.info(message); - } - }); } /** From 1bc2276fa611c99d5ae9a8eaae03d9e14bf0b3cf Mon Sep 17 00:00:00 2001 From: Scoppio Date: Fri, 15 Nov 2024 22:29:45 -0300 Subject: [PATCH 42/57] feat: fire fight arguments added --- .../i18n/megamek/client/messages.properties | 24 +++- .../src/megamek/client/ui/swing/MapMenu.java | 113 ++++++++++++------ .../client/ui/swing/boardview/BoardView.java | 8 +- .../gmCommands/GamemasterCommandPanel.java | 42 ++++++- megamek/src/megamek/common/Board.java | 20 ---- megamek/src/megamek/common/Entity.java | 3 + megamek/src/megamek/common/Game.java | 14 ++- .../common/weapons/AreaEffectHelper.java | 27 ++--- megamek/src/megamek/server/Server.java | 7 -- .../server/commands/FirefightCommand.java | 77 ++++++++++++ .../commands/GamemasterServerCommand.java | 10 +- .../server/commands/NoFiresCommand.java | 87 ++++++++++++++ .../server/commands/RescueCommand.java | 61 ++++++++++ .../server/commands/arguments/Argument.java | 14 ++- .../commands/arguments/EnumArgument.java | 5 + .../commands/arguments/IntegerArgument.java | 6 +- .../arguments/OptionalEnumArgument.java | 5 + .../arguments/OptionalIntegerArgument.java | 1 + .../server/totalwarfare/TWGameManager.java | 8 +- 19 files changed, 437 insertions(+), 95 deletions(-) create mode 100644 megamek/src/megamek/server/commands/FirefightCommand.java create mode 100644 megamek/src/megamek/server/commands/NoFiresCommand.java create mode 100644 megamek/src/megamek/server/commands/RescueCommand.java diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 8fdaeab24d9..87910252951 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -4636,7 +4636,14 @@ SBFTargetDialog.title=Targeting Gamemaster.Gamemaster=Gamemaster Gamemaster.EditDamage=Edit Damage (unstable) Gamemaster.Configure=Configure (unstable) +Gamemaster.Traitor.title=Traitor +Gamemaster.Traitor.confirm=Confirm Gamemaster.Traitor=Traitor Unit +Gamemaster.Traitor.text=Traitor Unit {0} +Gamemaster.Traitor.text.noplayers=No players available. Units cannot have their ownership passed to players that aren't assigned to a team. +Gamemaster.Traitor.text.selectplayer=Choose the player to gain ownership of this unit, {0}, when it turns traitor +Gamemaster.Traitor.confirmation={0} will switch to {1}'s side at the end of this turn. Are you sure? + Gamemaster.dialog.confirm=Confirm Gamemaster.KillUnit=Kill Unit Gamemaster.KillUnit.text=Kill Unit {0} @@ -4650,6 +4657,13 @@ Gamemaster.cmd.params.required=Required. Gamemaster.cmd.params.optional=Optional. Gamemaster.cmd.x=The x coordinate of the hex. Gamemaster.cmd.y=The y coordinate of the hex. +# Rescue cmd +Gamemaster.cmd.rescue.longName=Rescue Unit +Gamemaster.cmd.rescue.unitID=ID of the unit to rescue. +Gamemaster.cmd.rescue.help=Rescues a single unit. +Gamemaster.cmd.rescue.success=Will be rescued at the end of this phase. +Gamemaster.Rescue.text=Rescue Unit {0} +Gamemaster.Rescue.confirmation=Are you sure you want to rescue {0}? # Remove Smoke cmd Gamemaster.cmd.removesmoke.longName=Remove Smoke Gamemaster.cmd.removesmoke.help=Removes all smoke cloud hexes. @@ -4710,4 +4724,12 @@ Gamemaster.cmd.orbitalbombardment.help=Calls an orbital bombardment on the board Gamemaster.cmd.orbitalbombardment.dmg=Total damage at target hex. Gamemaster.cmd.orbitalbombardment.radius=Radius of the bombardment. Gamemaster.cmd.orbitalbombardment.error.outofbounds=Specified hex is not on the board. -Gamemaster.cmd.orbitalbombardment.success=Orbital bombardment incoming! \ No newline at end of file +Gamemaster.cmd.orbitalbombardment.success=Orbital bombardment incoming! +# Firefight +Gamemaster.cmd.firefight.longName=Firefight +Gamemaster.cmd.firefight.reason=Fire extinguished +Gamemaster.cmd.firefight.help=Extinguishes a fire on the board. +# No Fire +Gamemaster.cmd.nofire.longName=No Fires +Gamemaster.cmd.nofire.help=Extinguishes all fires on the board. + diff --git a/megamek/src/megamek/client/ui/swing/MapMenu.java b/megamek/src/megamek/client/ui/swing/MapMenu.java index 02f40d37980..fa22b1f3710 100644 --- a/megamek/src/megamek/client/ui/swing/MapMenu.java +++ b/megamek/src/megamek/client/ui/swing/MapMenu.java @@ -229,17 +229,7 @@ private JMenuItem TargetMenuItem(Targetable t) { JMenuItem item = new JMenuItem(Messages.getString("ClientGUI.targetMenuItem") + t.getDisplayName()); - String targetCode; - - if (t instanceof Entity) { - targetCode = "E|" + ((Entity) t).getId(); - } else if (t instanceof BuildingTarget) { - targetCode = "B|" + t.getPosition().getX() + "|" + t.getPosition().getY() + "|" + t.getTargetType(); - } else if (t instanceof MinefieldTarget) { - targetCode = "M|" + t.getPosition().getX() + "|" + t.getPosition().getY(); - } else { - targetCode = "H|" + t.getPosition().getX() + "|" + t.getPosition().getY() + "|" + t.getTargetType(); - } + String targetCode = getTargetCode(t); item.setActionCommand(targetCode); item.addActionListener(evt -> { @@ -255,6 +245,21 @@ private JMenuItem TargetMenuItem(Targetable t) { return item; } + private static String getTargetCode(Targetable t) { + String targetCode; + + if (t instanceof Entity) { + targetCode = "E|" + ((Entity) t).getId(); + } else if (t instanceof BuildingTarget) { + targetCode = "B|" + t.getPosition().getX() + "|" + t.getPosition().getY() + "|" + t.getTargetType(); + } else if (t instanceof MinefieldTarget) { + targetCode = "M|" + t.getPosition().getX() + "|" + t.getPosition().getY(); + } else { + targetCode = "H|" + t.getPosition().getX() + "|" + t.getPosition().getY() + "|" + t.getTargetType(); + } + return targetCode; + } + private @Nullable JMenuItem createChargeMenuItem() { if (!client.getGame().getEntities(coords).hasNext()) { return null; @@ -403,12 +408,11 @@ private JMenu createSpecialHexDisplayMenu() { */ private JMenu createGamemasterMenu() { JMenu menu = new JMenu(Messages.getString("Gamemaster.Gamemaster")); - if (!client.getLocalPlayer().getGameMaster()) { - return menu; - } else { + if (client.getLocalPlayer().getGameMaster()) { JMenu dmgMenu = new JMenu(Messages.getString("Gamemaster.EditDamage")); JMenu cfgMenu = new JMenu(Messages.getString("Gamemaster.Configure")); JMenu traitorMenu = new JMenu(Messages.getString("Gamemaster.Traitor")); + JMenu rescueMenu = new JMenu(Messages.getString("Gamemaster.Rescue")); JMenu killMenu = new JMenu(Messages.getString("Gamemaster.KillUnit")); JMenu specialCommandsMenu = createGMSpecialCommandsMenu(); @@ -418,6 +422,7 @@ private JMenu createGamemasterMenu() { dmgMenu.add(createUnitEditorMenuItem(entity)); cfgMenu.add(createCustomMekMenuItem(entity)); traitorMenu.add(createTraitorMenuItem(entity)); + rescueMenu.add(createRescueMenuItem(entity)); killMenu.add(createKillMenuItem(entity)); } if (dmgMenu.getItemCount() != 0) { @@ -435,8 +440,8 @@ private JMenu createGamemasterMenu() { menu.addSeparator(); } menu.add(specialCommandsMenu); - return menu; } + return menu; } /** @@ -446,17 +451,20 @@ private JMenu createGamemasterMenu() { private JMenu createGMSpecialCommandsMenu() { JMenu menu = new JMenu(Messages.getString("Gamemaster.SpecialCommands")); List.of( - new KillCommand(null, null), - new OrbitalBombardmentCommand(null, null), new ChangeOwnershipCommand(null, null), + new ChangeWeatherCommand(null, null), new DisasterCommand(null, null), + new KillCommand(null, null), + new FirefightCommand(null, null), new FirestarterCommand(null, null), new FirestormCommand(null, null), + new NoFiresCommand(null, null), + new OrbitalBombardmentCommand(null, null), new RemoveSmokeCommand(null, null), - new ChangeWeatherCommand(null, null) + new RescueCommand(null, null) ).forEach(cmd -> { JMenuItem item = new JMenuItem(cmd.getLongName()); - item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd).setVisible(true)); + item.addActionListener(evt -> new GamemasterCommandPanel(gui.getFrame(), gui, cmd, coords).setVisible(true)); menu.add(item); }); @@ -488,9 +496,14 @@ JMenuItem createUnitEditorMenuItem(Entity entity) { return item; } - private JMenuItem createTraitorMenuItem(Entity en) { + /** + * Create traitor menu for game master options + * @param entity the entity to create the traitor menu for + * @return JMenu the traitor menu + */ + private JMenuItem createTraitorMenuItem(Entity entity) { // Traitor Command - JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.Traitor") + " " + en.getDisplayName()); + JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.Traitor.text", entity.getDisplayName())); item.addActionListener(evt -> { gui.getBoardView().setShouldIgnoreKeys(false); var players = client.getGame().getPlayersList(); @@ -498,7 +511,7 @@ private JMenuItem createTraitorMenuItem(Entity en) { String[] playerNames = new String[players.size() - 1]; String[] options = new String[players.size() - 1]; - Player currentOwner = en.getOwner(); + Player currentOwner = entity.getOwner(); // Loop through the players vector and fill in the arrays int idx = 0; for (var player : players) { @@ -515,15 +528,14 @@ private JMenuItem createTraitorMenuItem(Entity en) { // No players available? if (idx == 0) { JOptionPane.showMessageDialog(gui.getFrame(), - "No players available. Units cannot be traitored to players " - + "that aren't assigned to a team."); + Messages.getString("Gamemaster.Traitor.text.noplayers")); return; } // Dialog for choosing which player to transfer to String option = (String) JOptionPane.showInputDialog(gui.getFrame(), - "Choose the player to gain ownership of this unit (" + en.getDisplayName() + ") when it turns traitor", - "Traitor", JOptionPane.QUESTION_MESSAGE, null, + Messages.getString("Gamemaster.Traitor.text.selectplayer", entity.getDisplayName()), + Messages.getString("Gamemaster.Traitor.title"), JOptionPane.QUESTION_MESSAGE, null, options, options[0]); // Verify that we have a valid option... @@ -535,12 +547,12 @@ private JMenuItem createTraitorMenuItem(Entity en) { // And now we perform the actual transfer int confirm = JOptionPane.showConfirmDialog( gui.getFrame(), - en.getDisplayName() + " will switch to " + name - + "'s side at the end of this turn. Are you sure?", - "Confirm", + Messages.getString("Gamemaster.Traitor.confirmation", entity.getDisplayName(), name), + Messages.getString("Gamemaster.Traitor.confirm"), JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION) { - client.sendChat(String.format("/changeOwner %d %d", en.getId(), id)); + client.sendChat(String.format("/changeOwner %d %d", entity.getId(), id)); } } }); @@ -548,14 +560,43 @@ private JMenuItem createTraitorMenuItem(Entity en) { return item; } - private JMenuItem createKillMenuItem(Entity en) { - JMenuItem item = new JMenuItem(Messages.getString("Gamemaster.KillUnit.text", en.getDisplayName())); + /** + * Create a menu for killing a specific entity + * + * @param entity the entity to create the kill menu for + * @return JMenuItem the kill menu item + */ + private JMenuItem createKillMenuItem(Entity entity) { + return createCommandMenuItem(entity, "Gamemaster.KillUnit.text", + "Gamemaster.KillUnit.confirmation", String.format("/kill %d", entity.getId())); + } + + /** + * Create a menu for rescuing a specific entity + * @param entity the entity to create the rescue menu for + * @return the rescue menu item + */ + private JMenuItem createRescueMenuItem(Entity entity) { + return createCommandMenuItem(entity, "Gamemaster.Rescue.text", + "Gamemaster.Rescue.confirmation", String.format("/rescue %d", entity.getId())); + } + + /** + * Create a menu for a specific GM command + * @param entity the entity to create the menu for + * @param messageKey the menu item message key for the menu item + * @param confirmationKey the confirmation message key + * @param command the command that will be sent to the server + * @return the menu item + */ + private JMenuItem createCommandMenuItem(Entity entity, String messageKey, String confirmationKey, String command) { + JMenuItem item = new JMenuItem(Messages.getString(messageKey, entity.getDisplayName())); item.addActionListener(evt -> { int confirm = JOptionPane.showConfirmDialog( - gui.getFrame(), Messages.getString("Gamemaster.KillUnit.confirmation", en.getDisplayName()), + gui.getFrame(), Messages.getString(confirmationKey, entity.getDisplayName()), Messages.getString("Gamemaster.dialog.confirm"), JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { - client.sendChat(String.format("/kill %d", en.getId())); + client.sendChat(command); } }); return item; @@ -1509,9 +1550,7 @@ private void selectTarget() { if (list.size() == 1) { myTarget = selectedEntity = list.firstElement(); - - if (currentPanel instanceof FiringDisplay) { - FiringDisplay panel = (FiringDisplay) currentPanel; + if (currentPanel instanceof FiringDisplay panel) { panel.target(myTarget); } else if (currentPanel instanceof PhysicalDisplay) { ((PhysicalDisplay) currentPanel).target(myTarget); diff --git a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java index 50c9e923c09..0fd359ebd52 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java +++ b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java @@ -1456,10 +1456,16 @@ private Mounted selectedWeapon() { return (clientgui != null) ? clientgui.getDisplayedWeapon().orElse(null) : null; } + /** + * Draw the orbital bombardment attacks on the board view + * + * @author Luana Coppio + * @param boardGraphics The graphics object to draw on + */ private void drawOrbitalBombardmentHexes(Graphics boardGraphics) { Image orbitalBombardmentImage = tileManager.getOrbitalBombardmentImage(); Rectangle view = boardGraphics.getClipBounds(); - boolean justDraw = false; + // Compute the origin of the viewing area int drawX = (view.x / (int) (HEX_WC * scale)) - 1; int drawY = (view.y / (int) (HEX_H * scale)) - 1; diff --git a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java index bc6e7b9c6e5..25d7b94acc5 100644 --- a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java +++ b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java @@ -1,6 +1,8 @@ package megamek.client.ui.swing.gmCommands; import megamek.client.ui.swing.ClientGUI; +import megamek.common.Coords; +import megamek.common.annotations.Nullable; import megamek.server.commands.GamemasterServerCommand; import megamek.server.commands.arguments.Argument; import megamek.server.commands.arguments.EnumArgument; @@ -14,15 +16,26 @@ import java.util.Map; import java.util.Objects; -// JPanel wrapper for game master commands +/** + * Dialog for executing a gamemaster command. + */ public class GamemasterCommandPanel extends JDialog { private final GamemasterServerCommand command; private final ClientGUI client; - - public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerCommand command) { + private final Coords coords; + + /** + * Constructor for the dialog for executing a gamemaster command. + * + * @param parent The parent frame. + * @param client The client GUI. + * @param command The command to render. + */ + public GamemasterCommandPanel(JFrame parent, ClientGUI client, GamemasterServerCommand command, @Nullable Coords coords) { super(parent, command.getName(), true); this.command = command; this.client = client; + this.coords = coords; initializeUI(parent); } @@ -87,9 +100,22 @@ private JComponent getArgumentComponent(Argument argument, JPanel argumentPan return null; } + private boolean isArgumentX(Argument argument) { + return argument.getName().equals("x"); + } + + private boolean isArgumentY(Argument argument) { + return argument.getName().equals("y"); + } + + private int getIntArgumentDefaultValue(IntegerArgument intArg) { + return intArg.hasDefaultValue() ? intArg.getValue() : isArgumentX(intArg) ? coords.getX() : + isArgumentY(intArg) ? coords.getY() : 0; + } + private JSpinner createSpinner(IntegerArgument intArg) { return new JSpinner(new SpinnerNumberModel( - intArg.hasDefaultValue() ? intArg.getValue() : 0, + getIntArgumentDefaultValue(intArg), intArg.getMinValue(), intArg.getMaxValue(), 1)); @@ -141,6 +167,13 @@ private JButton getExecuteButton(Map argumentComponents) { return executeButton; } + /** + * Execute the command with the given arguments. + * It runs the command using the client chat, this way the command is sent to the server. + * All arguments are loaded as named variables in the form of "argumentName=argumentValue". + * + * @param argumentComponents The components that hold the arguments selected. + */ private void executeCommand(Map argumentComponents) { List> arguments = command.defineArguments(); String[] args = new String[arguments.size()]; @@ -166,6 +199,7 @@ private void executeCommand(Map argumentComponents) { } } } + client.getClient().sendChat("/" + command.getName() + " " + String.join(" ", args)); } } diff --git a/megamek/src/megamek/common/Board.java b/megamek/src/megamek/common/Board.java index f3bdc36db1f..427cce25fd8 100644 --- a/megamek/src/megamek/common/Board.java +++ b/megamek/src/megamek/common/Board.java @@ -2084,24 +2084,4 @@ public static int encodeCustomDeploymentZoneID(int zoneID) { return zoneID + NUM_ZONES_X2; } - public void clearOrbitalBombardmentIcons() { - for (Coords coords : specialHexes.keySet()) { - removeOrbitalBombardmentIcons(coords); - } - } - - public void removeOrbitalBombardmentIcons(Coords coords) { - // Do nothing if the coords aren't on this board. - if (!this.contains(coords) || null == specialHexes.get(coords)) { - return; - } - - // Use iterator so we can remove while traversing - for (Iterator iterator = specialHexes.get(coords).iterator(); iterator.hasNext();) { - SpecialHexDisplay shd = iterator.next(); - if (ORBITAL_BOMBARDMENT.equals(shd.getType())) { - iterator.remove(); - } - } - } } diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java index d54020dc530..ec645b1c008 100644 --- a/megamek/src/megamek/common/Entity.java +++ b/megamek/src/megamek/common/Entity.java @@ -4790,6 +4790,9 @@ public List getCriticalSlots(int location) { return result; } + /** + * @return true if the entity has any critical slot that isn't damaged yet + */ public boolean hasUndamagedCriticalSlots() { return IntStream.range(0, locations()) .mapToLong(i -> getCriticalSlots(i) diff --git a/megamek/src/megamek/common/Game.java b/megamek/src/megamek/common/Game.java index 55f5ea13373..1d50e446998 100644 --- a/megamek/src/megamek/common/Game.java +++ b/megamek/src/megamek/common/Game.java @@ -2203,15 +2203,25 @@ public int removeSpecificEntityTurnsFor(Entity entity) { return turnsToRemove.size(); } - public void setOrbitalBombardmentVector(Vector v) { - orbitalBombardmentAttacks = v; + /** + * Set the new vector of orbital bombardments for this round. + * @param orbitalBombardments + */ + public void setOrbitalBombardmentVector(Vector orbitalBombardments) { + orbitalBombardmentAttacks = orbitalBombardments; processGameEvent(new GameBoardChangeEvent(this)); } + /** + * Resets the orbital bombardment attacks list. + */ public void resetOrbitalBombardmentAttacks() { orbitalBombardmentAttacks.removeAllElements(); } + /** + * @return an Enumeration of orbital bombardment attacks. + */ public Enumeration getOrbitalBombardmentAttacks() { return orbitalBombardmentAttacks.elements(); } diff --git a/megamek/src/megamek/common/weapons/AreaEffectHelper.java b/megamek/src/megamek/common/weapons/AreaEffectHelper.java index 32ea8900b05..8b035f8b6e9 100644 --- a/megamek/src/megamek/common/weapons/AreaEffectHelper.java +++ b/megamek/src/megamek/common/weapons/AreaEffectHelper.java @@ -14,15 +14,12 @@ package megamek.common.weapons; import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.IntStream; import megamek.common.*; import megamek.common.planetaryconditions.Atmosphere; import megamek.common.planetaryconditions.PlanetaryConditions; import megamek.logging.MMLogger; import megamek.server.totalwarfare.TWGameManager; -import org.apache.commons.lang3.IntegerRange; /** * Class containing functionality that helps out with area effect weapons. @@ -621,7 +618,7 @@ else if (ammo.getMunitionType().contains(AmmoType.Munitions.M_FLECHETTE)) { * arty * attack, -1 otherwise * @param mineClear Whether or not we're clearing a minefield - * @return + * @return A DamageFalloff object containing the damage and falloff values and if it is cluster or not */ public static DamageFalloff calculateDamageFallOff(AmmoType ammo, int attackingBA, boolean mineClear) { if (ammo == null) { @@ -694,21 +691,23 @@ public static DamageFalloff calculateDamageFallOff(AmmoType ammo, int attackingB clusterMunitionsFlag = true; } else if (ammo.getMunitionType().contains(AmmoType.Munitions.M_FLECHETTE)) { - switch (ammo.getAmmoType()) { + falloff = switch (ammo.getAmmoType()) { // for flechette, damage and falloff is number of d6, not absolute // damage - case AmmoType.T_LONG_TOM: + case AmmoType.T_LONG_TOM -> { damage = 4; - falloff = 2; - break; - case AmmoType.T_SNIPER: + yield 2; + } + case AmmoType.T_SNIPER -> { damage = 2; - falloff = 1; - break; - case AmmoType.T_THUMPER: + yield 1; + } + case AmmoType.T_THUMPER -> { damage = 1; - falloff = 1; - } + yield 1; + } + default -> falloff; + }; // if this was a mine clearance, then it only affects the hex hit } else if (mineClear) { falloff = damage; diff --git a/megamek/src/megamek/server/Server.java b/megamek/src/megamek/server/Server.java index ee832da035b..d62d8555e92 100644 --- a/megamek/src/megamek/server/Server.java +++ b/megamek/src/megamek/server/Server.java @@ -538,13 +538,6 @@ public Collection getAllCommandNames() { return commandsHash.keySet(); } - /** - * Returns the list of all server commands - */ - public List getAllCommands() { - return new ArrayList<>(commandsHash.values()); - } - /** * Sent when a client attempts to connect. */ diff --git a/megamek/src/megamek/server/commands/FirefightCommand.java b/megamek/src/megamek/server/commands/FirefightCommand.java new file mode 100644 index 00000000000..956f3508d1b --- /dev/null +++ b/megamek/src/megamek/server/commands/FirefightCommand.java @@ -0,0 +1,77 @@ +/* + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ +package megamek.server.commands; + +import megamek.client.ui.Messages; +import megamek.common.Coords; +import megamek.common.Hex; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * The Server Command "/firefight" that will put one hex on fire. + * + * @author Luana Coppio + */ +public class FirefightCommand extends GamemasterServerCommand { + + private static final String FIRESTARTER = "firefight"; + private static final String X = "x"; + private static final String Y = "y"; + private static final String TYPE = "type"; + + public FirefightCommand(Server server, TWGameManager gameManager) { + super(server, + gameManager, + FIRESTARTER, + Messages.getString("Gamemaster.cmd.firefight.help"), + Messages.getString("Gamemaster.cmd.firefight.longName")); + } + + @Override + public List> defineArguments() { + return List.of( + new IntegerArgument(X, Messages.getString("Gamemaster.cmd.x")), + new IntegerArgument(Y, Messages.getString("Gamemaster.cmd.y")) + ); + } + + /** + * Run this command with the arguments supplied + * + * @see ServerCommand#run(int, String[]) + */ + @Override + protected void runAsGM(int connId, Map> args) { + int xArg = (int) args.get(X).getValue() - 1; + int yArg = (int) args.get(Y).getValue() - 1; + firefight(new Coords(xArg, yArg)); + } + + private void firefight(Coords coords) { + try { + Hex hex = gameManager.getGame().getBoard().getHex(coords); + Objects.requireNonNull(hex, "Hex not found."); + gameManager.removeFire(coords, Messages.getString("Gamemaster.cmd.firefight.reason")); + } catch (Exception e) { + throw new IllegalArgumentException("Failed to ignite hex: " + e.getMessage()); + } + } +} diff --git a/megamek/src/megamek/server/commands/GamemasterServerCommand.java b/megamek/src/megamek/server/commands/GamemasterServerCommand.java index ef584614c06..dc346a6a147 100644 --- a/megamek/src/megamek/server/commands/GamemasterServerCommand.java +++ b/megamek/src/megamek/server/commands/GamemasterServerCommand.java @@ -22,7 +22,15 @@ import java.util.*; /** - * A ServerCommand that can only be used by Game Masters + * A ServerCommand that can only be used by Game Masters, + * This abstract class implements many features that are common to all Game Master commands, + * like the isGM check for users, it also uses the Argument class for building the command arguments + * and to abstract the parsing of the arguments, limit assertion and error handling, and for building + * a more dynamic "help" feature. + * It also has a more advanced parser and argument handling than the ServerCommand class, which allows for + * named arguments, positional arguments, optional arguments and default values. + * named arguments can be passed in any order, and positional arguments are parsed in order and MUST appear before named + * arguments. * * @author Luana Coppio */ diff --git a/megamek/src/megamek/server/commands/NoFiresCommand.java b/megamek/src/megamek/server/commands/NoFiresCommand.java new file mode 100644 index 00000000000..f097ff1fbb2 --- /dev/null +++ b/megamek/src/megamek/server/commands/NoFiresCommand.java @@ -0,0 +1,87 @@ +/* + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ +package megamek.server.commands; + +import megamek.client.ui.Messages; +import megamek.common.Coords; +import megamek.common.Hex; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +/** + * The Server Command "/nofires" removes all fires on the board. + * + * @author Luana Coppio + */ +public class NoFiresCommand extends GamemasterServerCommand { + + private final String reason; + + public NoFiresCommand(Server server, TWGameManager gameManager) { + super(server, + gameManager, + "nofires", + Messages.getString("Gamemaster.cmd.nofire.help"), + Messages.getString("Gamemaster.cmd.nofire.longName")); + this.reason = Messages.getString("Gamemaster.cmd.firefight.reason"); + } + + @Override + public List> defineArguments() { + return List.of(); + } + + /** + * Run this command with the arguments supplied + * + * @see ServerCommand#run(int, String[]) + */ + @Override + protected void runAsGM(int connId, Map> args) { + try { + getAllCoords().forEach(this::firefight); + } catch (Exception e) { + logger.error(Messages.getString("Gamemaster.cmd.fire.failed"), e); + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.fire.failed")); + } + } + + private HashSet getAllCoords() { + var boardHeight = gameManager.getGame().getBoard().getHeight(); + var boardWidth = gameManager.getGame().getBoard().getWidth(); + var coordsSet = new HashSet(); + for (int x = 0; x < boardWidth; x++) { + for (int y = 0; y < boardHeight; y++) { + coordsSet.add(new Coords(x, y)); + } + } + return coordsSet; + } + + private void firefight(Coords coords) { + Hex hex = gameManager.getGame().getBoard().getHex(coords); + if (null == hex) { + // Just ignore null hexes... + // they should not happen, but I don't want to crash the command + return; + } + gameManager.removeFire(coords, reason); + } +} diff --git a/megamek/src/megamek/server/commands/RescueCommand.java b/megamek/src/megamek/server/commands/RescueCommand.java new file mode 100644 index 00000000000..8fa20fa57e0 --- /dev/null +++ b/megamek/src/megamek/server/commands/RescueCommand.java @@ -0,0 +1,61 @@ +/* + * MegaMek - Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ +package megamek.server.commands; + +import megamek.client.ui.Messages; +import megamek.common.MovePath; +import megamek.server.Server; +import megamek.server.commands.arguments.Argument; +import megamek.server.commands.arguments.IntegerArgument; +import megamek.server.totalwarfare.TWGameManager; + +import java.util.List; +import java.util.Map; + +/** + * @author Luana Coppio + */ +public class RescueCommand extends GamemasterServerCommand{ + + public static final String UNIT_ID = "unitID"; + + /** Creates new Rescue Command, it "flees" a unit no matter where they are */ + public RescueCommand(Server server, TWGameManager gameManager) { + super(server, gameManager, "rescue", Messages.getString("Gamemaster.cmd.rescue.help"), + Messages.getString("Gamemaster.cmd.rescue.longName")); + } + + @Override + public List> defineArguments() { + return List.of(new IntegerArgument(UNIT_ID, Messages.getString("Gamemaster.cmd.rescue.unitID"))); + } + + /** + * Run this command with the arguments supplied + */ + @Override + protected void runAsGM(int connId, Map> args) { + int unitId = (int) args.get(UNIT_ID).getValue(); + // is the unit on the board? + var unit = gameManager.getGame().getEntity(unitId); + if (unit == null) { + server.sendServerChat(connId, Messages.getString("Gamemaster.cmd.missingUnit")); + return; + } + MovePath path = new MovePath(gameManager.getGame(), unit); + path.addStep(MovePath.MoveStepType.FLEE); + gameManager.addReport(gameManager.processLeaveMap(path, false, -1)); + server.sendServerChat(unit.getDisplayName() + Messages.getString("Gamemaster.cmd.rescue.success")); + } +} diff --git a/megamek/src/megamek/server/commands/arguments/Argument.java b/megamek/src/megamek/server/commands/arguments/Argument.java index 5bcd84ef251..3b77343129a 100644 --- a/megamek/src/megamek/server/commands/arguments/Argument.java +++ b/megamek/src/megamek/server/commands/arguments/Argument.java @@ -1,11 +1,20 @@ package megamek.server.commands.arguments; -// A generic Argument class that can be extended for different argument types +/** + * Generic Argument class, can be extended for different argument types for server commands + * @param + * @author Luana Coppio + */ public abstract class Argument { protected T value; private final String name; private final String description; + /** + * Constructor for Generic Argument + * @param name name of the argument + * @param description description of the argument + */ public Argument(String name, String description) { this.name = name; this.description = description; @@ -23,6 +32,9 @@ public String getDescription() { return description; } + /** + * @return the string representation of the argument + */ public String getRepr() { return "<" + getName() + "=#>"; } diff --git a/megamek/src/megamek/server/commands/arguments/EnumArgument.java b/megamek/src/megamek/server/commands/arguments/EnumArgument.java index 85747815c97..cdaae3e7b0d 100644 --- a/megamek/src/megamek/server/commands/arguments/EnumArgument.java +++ b/megamek/src/megamek/server/commands/arguments/EnumArgument.java @@ -4,6 +4,11 @@ import java.util.Arrays; +/** + * Argument for an Enum type. + * @param + * @author Luana Coppio + */ public class EnumArgument> extends Argument { protected final Class enumType; protected final E defaultValue; diff --git a/megamek/src/megamek/server/commands/arguments/IntegerArgument.java b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java index e3d7b27d962..2a942bf9e86 100644 --- a/megamek/src/megamek/server/commands/arguments/IntegerArgument.java +++ b/megamek/src/megamek/server/commands/arguments/IntegerArgument.java @@ -2,8 +2,10 @@ import megamek.client.ui.Messages; -import java.util.Arrays; - +/** + * Argument for an Integer type. + * @author Luana Coppio + */ public class IntegerArgument extends Argument { private final int minValue; private final int maxValue; diff --git a/megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java b/megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java index 2c7ce40a1c4..5e7fcd78630 100644 --- a/megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java +++ b/megamek/src/megamek/server/commands/arguments/OptionalEnumArgument.java @@ -4,6 +4,11 @@ import java.util.Arrays; +/** + * Nullable Argument for an Enum type. + * @param + * @author Luana Coppio + */ public class OptionalEnumArgument> extends EnumArgument { public OptionalEnumArgument(String name, String description, Class enumType) { diff --git a/megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java b/megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java index fc857b1148e..4bc3cd17139 100644 --- a/megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java +++ b/megamek/src/megamek/server/commands/arguments/OptionalIntegerArgument.java @@ -18,6 +18,7 @@ import java.util.Optional; /** + * Optional Argument for an Integer type. * @author Luana Coppio */ public class OptionalIntegerArgument extends Argument> { diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 2ac90e804de..500a29fb12c 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -194,6 +194,8 @@ public List getCommandList(Server server) { commands.add(new ChangeOwnershipCommand(server, this)); commands.add(new DisasterCommand(server, this)); commands.add(new FirestarterCommand(server, this)); + commands.add(new NoFiresCommand(server, this)); + commands.add(new FirefightCommand(server, this)); commands.add(new FirestormCommand(server, this)); commands.add(new RemoveSmokeCommand(server, this)); commands.add(new ChangeWeatherCommand(server, this)); @@ -5290,7 +5292,7 @@ Vector processCrash(Entity entity, int vel, Coords c) { * if it can't return) * @return Vector of turn reports. */ - Vector processLeaveMap(MovePath movePath, boolean flewOff, int returnable) { + public Vector processLeaveMap(MovePath movePath, boolean flewOff, int returnable) { Entity entity = movePath.getEntity(); Vector vReport = new Vector<>(); Report r; @@ -31696,10 +31698,6 @@ void clearBombIcons() { game.getBoard().clearBombIcons(); } - void clearOrbitalBombardmentIcons() { - game.getBoard().clearOrbitalBombardmentIcons(); - } - /** * Convenience function to send a ground object update. */ From a28fd13ca6274c0a3fdbedd4d25d9325c0848f5e Mon Sep 17 00:00:00 2001 From: Scoppio Date: Sat, 16 Nov 2024 01:27:13 -0300 Subject: [PATCH 43/57] feat: added rescue command --- megamek/i18n/megamek/client/messages.properties | 3 ++- megamek/src/megamek/client/ui/swing/MapMenu.java | 9 ++++++--- .../ui/swing/gmCommands/GamemasterCommandPanel.java | 4 ++-- megamek/src/megamek/server/commands/RescueCommand.java | 2 +- .../src/megamek/server/totalwarfare/TWGameManager.java | 1 + 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 87910252951..e9de0a4c7cc 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -4636,6 +4636,7 @@ SBFTargetDialog.title=Targeting Gamemaster.Gamemaster=Gamemaster Gamemaster.EditDamage=Edit Damage (unstable) Gamemaster.Configure=Configure (unstable) +Gamemaster.Rescue=Rescue Unit Gamemaster.Traitor.title=Traitor Gamemaster.Traitor.confirm=Confirm Gamemaster.Traitor=Traitor Unit @@ -4661,7 +4662,7 @@ Gamemaster.cmd.y=The y coordinate of the hex. Gamemaster.cmd.rescue.longName=Rescue Unit Gamemaster.cmd.rescue.unitID=ID of the unit to rescue. Gamemaster.cmd.rescue.help=Rescues a single unit. -Gamemaster.cmd.rescue.success=Will be rescued at the end of this phase. +Gamemaster.cmd.rescue.success={0} was rescued. Gamemaster.Rescue.text=Rescue Unit {0} Gamemaster.Rescue.confirmation=Are you sure you want to rescue {0}? # Remove Smoke cmd diff --git a/megamek/src/megamek/client/ui/swing/MapMenu.java b/megamek/src/megamek/client/ui/swing/MapMenu.java index fa22b1f3710..debd0d517f5 100644 --- a/megamek/src/megamek/client/ui/swing/MapMenu.java +++ b/megamek/src/megamek/client/ui/swing/MapMenu.java @@ -435,6 +435,9 @@ private JMenu createGamemasterMenu() { if (traitorMenu.getItemCount() != 0) { menu.add(traitorMenu); } + if (rescueMenu.getItemCount() != 0) { + menu.add(rescueMenu); + } if (killMenu.getItemCount() != 0) { menu.add(killMenu); menu.addSeparator(); @@ -567,7 +570,7 @@ private JMenuItem createTraitorMenuItem(Entity entity) { * @return JMenuItem the kill menu item */ private JMenuItem createKillMenuItem(Entity entity) { - return createCommandMenuItem(entity, "Gamemaster.KillUnit.text", + return createEntityCommandMenuItem(entity, "Gamemaster.KillUnit.text", "Gamemaster.KillUnit.confirmation", String.format("/kill %d", entity.getId())); } @@ -577,7 +580,7 @@ private JMenuItem createKillMenuItem(Entity entity) { * @return the rescue menu item */ private JMenuItem createRescueMenuItem(Entity entity) { - return createCommandMenuItem(entity, "Gamemaster.Rescue.text", + return createEntityCommandMenuItem(entity, "Gamemaster.Rescue.text", "Gamemaster.Rescue.confirmation", String.format("/rescue %d", entity.getId())); } @@ -589,7 +592,7 @@ private JMenuItem createRescueMenuItem(Entity entity) { * @param command the command that will be sent to the server * @return the menu item */ - private JMenuItem createCommandMenuItem(Entity entity, String messageKey, String confirmationKey, String command) { + private JMenuItem createEntityCommandMenuItem(Entity entity, String messageKey, String confirmationKey, String command) { JMenuItem item = new JMenuItem(Messages.getString(messageKey, entity.getDisplayName())); item.addActionListener(evt -> { int confirm = JOptionPane.showConfirmDialog( diff --git a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java index 25d7b94acc5..d2e4d7fa70a 100644 --- a/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java +++ b/megamek/src/megamek/client/ui/swing/gmCommands/GamemasterCommandPanel.java @@ -109,8 +109,8 @@ private boolean isArgumentY(Argument argument) { } private int getIntArgumentDefaultValue(IntegerArgument intArg) { - return intArg.hasDefaultValue() ? intArg.getValue() : isArgumentX(intArg) ? coords.getX() : - isArgumentY(intArg) ? coords.getY() : 0; + return intArg.hasDefaultValue() ? intArg.getValue() : isArgumentX(intArg) ? coords.getX()+1 : + isArgumentY(intArg) ? coords.getY()+1 : 0; } private JSpinner createSpinner(IntegerArgument intArg) { diff --git a/megamek/src/megamek/server/commands/RescueCommand.java b/megamek/src/megamek/server/commands/RescueCommand.java index 8fa20fa57e0..62c9df1c491 100644 --- a/megamek/src/megamek/server/commands/RescueCommand.java +++ b/megamek/src/megamek/server/commands/RescueCommand.java @@ -56,6 +56,6 @@ protected void runAsGM(int connId, Map> args) { MovePath path = new MovePath(gameManager.getGame(), unit); path.addStep(MovePath.MoveStepType.FLEE); gameManager.addReport(gameManager.processLeaveMap(path, false, -1)); - server.sendServerChat(unit.getDisplayName() + Messages.getString("Gamemaster.cmd.rescue.success")); + server.sendServerChat(Messages.getString("Gamemaster.cmd.rescue.success", unit.getDisplayName())); } } diff --git a/megamek/src/megamek/server/totalwarfare/TWGameManager.java b/megamek/src/megamek/server/totalwarfare/TWGameManager.java index 500a29fb12c..7d0f1607d41 100644 --- a/megamek/src/megamek/server/totalwarfare/TWGameManager.java +++ b/megamek/src/megamek/server/totalwarfare/TWGameManager.java @@ -198,6 +198,7 @@ public List getCommandList(Server server) { commands.add(new FirefightCommand(server, this)); commands.add(new FirestormCommand(server, this)); commands.add(new RemoveSmokeCommand(server, this)); + commands.add(new RescueCommand(server, this)); commands.add(new ChangeWeatherCommand(server, this)); commands.add(new TraitorCommand(server, this)); commands.add(new ListEntitiesCommand(server, this)); From b4b004ae93a2997085037149b6456ff80ee4bc32 Mon Sep 17 00:00:00 2001 From: Scoppio Date: Sun, 17 Nov 2024 01:59:09 -0300 Subject: [PATCH 44/57] feat: added nuke graphics --- .../images/hexes/nuke/hit/col_0_row_0.png | Bin 0 -> 13958 bytes .../images/hexes/nuke/hit/col_0_row_0_odd.png | Bin 0 -> 13476 bytes .../images/hexes/nuke/hit/col_0_row_1.png | Bin 0 -> 9350 bytes .../images/hexes/nuke/hit/col_0_row_1_odd.png | Bin 0 -> 11931 bytes .../images/hexes/nuke/hit/col_0_row_2.png | Bin 0 -> 11874 bytes .../images/hexes/nuke/hit/col_0_row_2_odd.png | Bin 0 -> 10110 bytes .../images/hexes/nuke/hit/col_0_row_3.png | Bin 0 -> 11246 bytes .../images/hexes/nuke/hit/col_0_row_3_odd.png | Bin 0 -> 11429 bytes .../images/hexes/nuke/hit/col_0_row_4.png | Bin 0 -> 11060 bytes .../images/hexes/nuke/hit/col_0_row_4_odd.png | Bin 0 -> 11215 bytes .../images/hexes/nuke/hit/col_0_row_5.png | Bin 0 -> 12184 bytes .../images/hexes/nuke/hit/col_0_row_5_odd.png | Bin 0 -> 11296 bytes .../images/hexes/nuke/hit/col_0_row_6.png | Bin 0 -> 11144 bytes .../images/hexes/nuke/hit/col_0_row_6_odd.png | Bin 0 -> 12409 bytes .../images/hexes/nuke/hit/col_0_row_7.png | Bin 0 -> 10496 bytes .../images/hexes/nuke/hit/col_0_row_7_odd.png | Bin 0 -> 9238 bytes .../images/hexes/nuke/hit/col_0_row_8.png | Bin 0 -> 5985 bytes .../images/hexes/nuke/hit/col_0_row_8_odd.png | Bin 0 -> 12188 bytes .../images/hexes/nuke/hit/col_1_row_0.png | Bin 0 -> 12694 bytes .../images/hexes/nuke/hit/col_1_row_0_odd.png | Bin 0 -> 11520 bytes .../images/hexes/nuke/hit/col_1_row_1.png | Bin 0 -> 11172 bytes .../images/hexes/nuke/hit/col_1_row_1_odd.png | Bin 0 -> 12382 bytes .../images/hexes/nuke/hit/col_1_row_2.png | Bin 0 -> 11980 bytes .../images/hexes/nuke/hit/col_1_row_2_odd.png | Bin 0 -> 11806 bytes .../images/hexes/nuke/hit/col_1_row_3.png | Bin 0 -> 12670 bytes .../images/hexes/nuke/hit/col_1_row_3_odd.png | Bin 0 -> 12621 bytes .../images/hexes/nuke/hit/col_1_row_4.png | Bin 0 -> 12660 bytes .../images/hexes/nuke/hit/col_1_row_4_odd.png | Bin 0 -> 13138 bytes .../images/hexes/nuke/hit/col_1_row_5.png | Bin 0 -> 13296 bytes .../images/hexes/nuke/hit/col_1_row_5_odd.png | Bin 0 -> 13194 bytes .../images/hexes/nuke/hit/col_1_row_6.png | Bin 0 -> 12655 bytes .../images/hexes/nuke/hit/col_1_row_6_odd.png | Bin 0 -> 12073 bytes .../images/hexes/nuke/hit/col_1_row_7.png | Bin 0 -> 12529 bytes .../images/hexes/nuke/hit/col_1_row_7_odd.png | Bin 0 -> 12013 bytes .../images/hexes/nuke/hit/col_1_row_8.png | Bin 0 -> 9280 bytes .../images/hexes/nuke/hit/col_1_row_8_odd.png | Bin 0 -> 4022 bytes .../images/hexes/nuke/hit/col_2_row_0.png | Bin 0 -> 13129 bytes .../images/hexes/nuke/hit/col_2_row_0_odd.png | Bin 0 -> 13250 bytes .../images/hexes/nuke/hit/col_2_row_1.png | Bin 0 -> 11938 bytes .../images/hexes/nuke/hit/col_2_row_1_odd.png | Bin 0 -> 10874 bytes .../images/hexes/nuke/hit/col_2_row_2.png | Bin 0 -> 10191 bytes .../images/hexes/nuke/hit/col_2_row_2_odd.png | Bin 0 -> 11494 bytes .../images/hexes/nuke/hit/col_2_row_3.png | Bin 0 -> 12760 bytes .../images/hexes/nuke/hit/col_2_row_3_odd.png | Bin 0 -> 11579 bytes .../images/hexes/nuke/hit/col_2_row_4.png | Bin 0 -> 10659 bytes .../images/hexes/nuke/hit/col_2_row_4_odd.png | Bin 0 -> 12224 bytes .../images/hexes/nuke/hit/col_2_row_5.png | Bin 0 -> 11995 bytes .../images/hexes/nuke/hit/col_2_row_5_odd.png | Bin 0 -> 9919 bytes .../images/hexes/nuke/hit/col_2_row_6.png | Bin 0 -> 13644 bytes .../images/hexes/nuke/hit/col_2_row_6_odd.png | Bin 0 -> 13712 bytes .../images/hexes/nuke/hit/col_2_row_7.png | Bin 0 -> 11448 bytes .../images/hexes/nuke/hit/col_2_row_7_odd.png | Bin 0 -> 12981 bytes .../images/hexes/nuke/hit/col_2_row_8.png | Bin 0 -> 6336 bytes .../images/hexes/nuke/hit/col_2_row_8_odd.png | Bin 0 -> 10982 bytes .../images/hexes/nuke/hit/col_3_row_0.png | Bin 0 -> 10230 bytes .../images/hexes/nuke/hit/col_3_row_0_odd.png | Bin 0 -> 11534 bytes .../images/hexes/nuke/hit/col_3_row_1.png | Bin 0 -> 12399 bytes .../images/hexes/nuke/hit/col_3_row_1_odd.png | Bin 0 -> 11895 bytes .../images/hexes/nuke/hit/col_3_row_2.png | Bin 0 -> 12786 bytes .../images/hexes/nuke/hit/col_3_row_2_odd.png | Bin 0 -> 14204 bytes .../images/hexes/nuke/hit/col_3_row_3.png | Bin 0 -> 14130 bytes .../images/hexes/nuke/hit/col_3_row_3_odd.png | Bin 0 -> 13912 bytes .../images/hexes/nuke/hit/col_3_row_4.png | Bin 0 -> 13621 bytes .../images/hexes/nuke/hit/col_3_row_4_odd.png | Bin 0 -> 13611 bytes .../images/hexes/nuke/hit/col_3_row_5.png | Bin 0 -> 12747 bytes .../images/hexes/nuke/hit/col_3_row_5_odd.png | Bin 0 -> 10880 bytes .../images/hexes/nuke/hit/col_3_row_6.png | Bin 0 -> 11014 bytes .../images/hexes/nuke/hit/col_3_row_6_odd.png | Bin 0 -> 12680 bytes .../images/hexes/nuke/hit/col_3_row_7.png | Bin 0 -> 13328 bytes .../images/hexes/nuke/hit/col_3_row_7_odd.png | Bin 0 -> 12187 bytes .../images/hexes/nuke/hit/col_3_row_8.png | Bin 0 -> 10662 bytes .../images/hexes/nuke/hit/col_3_row_8_odd.png | Bin 0 -> 5582 bytes .../images/hexes/nuke/hit/col_4_row_0.png | Bin 0 -> 12293 bytes .../images/hexes/nuke/hit/col_4_row_0_odd.png | Bin 0 -> 12614 bytes .../images/hexes/nuke/hit/col_4_row_1.png | Bin 0 -> 12313 bytes .../images/hexes/nuke/hit/col_4_row_1_odd.png | Bin 0 -> 11987 bytes .../images/hexes/nuke/hit/col_4_row_2.png | Bin 0 -> 14145 bytes .../images/hexes/nuke/hit/col_4_row_2_odd.png | Bin 0 -> 14301 bytes .../images/hexes/nuke/hit/col_4_row_3.png | Bin 0 -> 14043 bytes .../images/hexes/nuke/hit/col_4_row_3_odd.png | Bin 0 -> 14016 bytes .../images/hexes/nuke/hit/col_4_row_4.png | Bin 0 -> 12402 bytes .../images/hexes/nuke/hit/col_4_row_4_odd.png | Bin 0 -> 13170 bytes .../images/hexes/nuke/hit/col_4_row_5.png | Bin 0 -> 12549 bytes .../images/hexes/nuke/hit/col_4_row_5_odd.png | Bin 0 -> 11805 bytes .../images/hexes/nuke/hit/col_4_row_6.png | Bin 0 -> 11524 bytes .../images/hexes/nuke/hit/col_4_row_6_odd.png | Bin 0 -> 11649 bytes .../images/hexes/nuke/hit/col_4_row_7.png | Bin 0 -> 12117 bytes .../images/hexes/nuke/hit/col_4_row_7_odd.png | Bin 0 -> 13182 bytes .../images/hexes/nuke/hit/col_4_row_8.png | Bin 0 -> 4390 bytes .../images/hexes/nuke/hit/col_4_row_8_odd.png | Bin 0 -> 10247 bytes .../images/hexes/nuke/hit/col_5_row_0.png | Bin 0 -> 11702 bytes .../images/hexes/nuke/hit/col_5_row_0_odd.png | Bin 0 -> 12380 bytes .../images/hexes/nuke/hit/col_5_row_1.png | Bin 0 -> 12994 bytes .../images/hexes/nuke/hit/col_5_row_1_odd.png | Bin 0 -> 12700 bytes .../images/hexes/nuke/hit/col_5_row_2.png | Bin 0 -> 13837 bytes .../images/hexes/nuke/hit/col_5_row_2_odd.png | Bin 0 -> 13849 bytes .../images/hexes/nuke/hit/col_5_row_3.png | Bin 0 -> 12789 bytes .../images/hexes/nuke/hit/col_5_row_3_odd.png | Bin 0 -> 11242 bytes .../images/hexes/nuke/hit/col_5_row_4.png | Bin 0 -> 10938 bytes .../images/hexes/nuke/hit/col_5_row_4_odd.png | Bin 0 -> 11823 bytes .../images/hexes/nuke/hit/col_5_row_5.png | Bin 0 -> 12176 bytes .../images/hexes/nuke/hit/col_5_row_5_odd.png | Bin 0 -> 10031 bytes .../images/hexes/nuke/hit/col_5_row_6.png | Bin 0 -> 8947 bytes .../images/hexes/nuke/hit/col_5_row_6_odd.png | Bin 0 -> 11886 bytes .../images/hexes/nuke/hit/col_5_row_7.png | Bin 0 -> 13185 bytes .../images/hexes/nuke/hit/col_5_row_7_odd.png | Bin 0 -> 11578 bytes .../images/hexes/nuke/hit/col_5_row_8.png | Bin 0 -> 9709 bytes .../images/hexes/nuke/hit/col_5_row_8_odd.png | Bin 0 -> 4276 bytes .../images/hexes/nuke/hit/col_6_row_0.png | Bin 0 -> 12886 bytes .../images/hexes/nuke/hit/col_6_row_0_odd.png | Bin 0 -> 12207 bytes .../images/hexes/nuke/hit/col_6_row_1.png | Bin 0 -> 13408 bytes .../images/hexes/nuke/hit/col_6_row_1_odd.png | Bin 0 -> 13567 bytes .../images/hexes/nuke/hit/col_6_row_2.png | Bin 0 -> 12093 bytes .../images/hexes/nuke/hit/col_6_row_2_odd.png | Bin 0 -> 13041 bytes .../images/hexes/nuke/hit/col_6_row_3.png | Bin 0 -> 10410 bytes .../images/hexes/nuke/hit/col_6_row_3_odd.png | Bin 0 -> 10909 bytes .../images/hexes/nuke/hit/col_6_row_4.png | Bin 0 -> 11706 bytes .../images/hexes/nuke/hit/col_6_row_4_odd.png | Bin 0 -> 11394 bytes .../images/hexes/nuke/hit/col_6_row_5.png | Bin 0 -> 5680 bytes .../images/hexes/nuke/hit/col_6_row_5_odd.png | Bin 0 -> 9525 bytes .../images/hexes/nuke/hit/col_6_row_6.png | Bin 0 -> 10680 bytes .../images/hexes/nuke/hit/col_6_row_6_odd.png | Bin 0 -> 6762 bytes .../images/hexes/nuke/hit/col_6_row_7.png | Bin 0 -> 10800 bytes .../images/hexes/nuke/hit/col_6_row_7_odd.png | Bin 0 -> 11878 bytes .../images/hexes/nuke/hit/col_6_row_8.png | Bin 0 -> 6306 bytes .../images/hexes/nuke/hit/col_6_row_8_odd.png | Bin 0 -> 11724 bytes .../images/hexes/nuke/hit/col_7_row_0.png | Bin 0 -> 13095 bytes .../images/hexes/nuke/hit/col_7_row_0_odd.png | Bin 0 -> 12423 bytes .../images/hexes/nuke/hit/col_7_row_1.png | Bin 0 -> 13043 bytes .../images/hexes/nuke/hit/col_7_row_1_odd.png | Bin 0 -> 12569 bytes .../images/hexes/nuke/hit/col_7_row_2.png | Bin 0 -> 13945 bytes .../images/hexes/nuke/hit/col_7_row_2_odd.png | Bin 0 -> 14032 bytes .../images/hexes/nuke/hit/col_7_row_3.png | Bin 0 -> 12589 bytes .../images/hexes/nuke/hit/col_7_row_3_odd.png | Bin 0 -> 11767 bytes .../images/hexes/nuke/hit/col_7_row_4.png | Bin 0 -> 10953 bytes .../images/hexes/nuke/hit/col_7_row_4_odd.png | Bin 0 -> 11359 bytes .../images/hexes/nuke/hit/col_7_row_5.png | Bin 0 -> 11400 bytes .../images/hexes/nuke/hit/col_7_row_5_odd.png | Bin 0 -> 10033 bytes .../images/hexes/nuke/hit/col_7_row_6.png | Bin 0 -> 9932 bytes .../images/hexes/nuke/hit/col_7_row_6_odd.png | Bin 0 -> 8854 bytes .../images/hexes/nuke/hit/col_7_row_7.png | Bin 0 -> 6893 bytes .../images/hexes/nuke/hit/col_7_row_7_odd.png | Bin 0 -> 7747 bytes .../images/hexes/nuke/hit/col_7_row_8.png | Bin 0 -> 8789 bytes .../images/hexes/nuke/hit/col_7_row_8_odd.png | Bin 0 -> 4060 bytes .../images/hexes/nuke/hit/col_8_row_0.png | Bin 0 -> 11917 bytes .../images/hexes/nuke/hit/col_8_row_0_odd.png | Bin 0 -> 11471 bytes .../images/hexes/nuke/hit/col_8_row_1.png | Bin 0 -> 10916 bytes .../images/hexes/nuke/hit/col_8_row_1_odd.png | Bin 0 -> 10714 bytes .../images/hexes/nuke/hit/col_8_row_2.png | Bin 0 -> 11274 bytes .../images/hexes/nuke/hit/col_8_row_2_odd.png | Bin 0 -> 11919 bytes .../images/hexes/nuke/hit/col_8_row_3.png | Bin 0 -> 11642 bytes .../images/hexes/nuke/hit/col_8_row_3_odd.png | Bin 0 -> 11520 bytes .../images/hexes/nuke/hit/col_8_row_4.png | Bin 0 -> 11404 bytes .../images/hexes/nuke/hit/col_8_row_4_odd.png | Bin 0 -> 11979 bytes .../images/hexes/nuke/hit/col_8_row_5.png | Bin 0 -> 9131 bytes .../images/hexes/nuke/hit/col_8_row_5_odd.png | Bin 0 -> 11125 bytes .../images/hexes/nuke/hit/col_8_row_6.png | Bin 0 -> 5224 bytes .../images/hexes/nuke/hit/col_8_row_6_odd.png | Bin 0 -> 6471 bytes .../images/hexes/nuke/hit/col_8_row_7.png | Bin 0 -> 4839 bytes .../images/hexes/nuke/hit/col_8_row_7_odd.png | Bin 0 -> 4060 bytes .../images/hexes/nuke/hit/col_8_row_8.png | Bin 0 -> 4495 bytes .../images/hexes/nuke/hit/col_8_row_8_odd.png | Bin 0 -> 7341 bytes .../images/hexes/{obinc.gif => nukeinc.gif} | Bin .../orbital_bombardment/hit/col_0_row_0.png | Bin 0 -> 119 bytes .../hit/col_0_row_0_odd.png | Bin 0 -> 115 bytes .../orbital_bombardment/hit/col_0_row_1.png | Bin 0 -> 103 bytes .../hit/col_0_row_1_odd.png | Bin 0 -> 103 bytes .../orbital_bombardment/hit/col_0_row_2.png | Bin 0 -> 109 bytes .../hit/col_0_row_2_odd.png | Bin 0 -> 441 bytes .../orbital_bombardment/hit/col_0_row_3.png | Bin 0 -> 1061 bytes .../hit/col_0_row_3_odd.png | Bin 0 -> 1717 bytes .../orbital_bombardment/hit/col_0_row_4.png | Bin 0 -> 2783 bytes .../hit/col_0_row_4_odd.png | Bin 0 -> 2708 bytes .../orbital_bombardment/hit/col_0_row_5.png | Bin 0 -> 5620 bytes .../hit/col_0_row_5_odd.png | Bin 0 -> 4004 bytes .../orbital_bombardment/hit/col_0_row_6.png | Bin 0 -> 3044 bytes .../hit/col_0_row_6_odd.png | Bin 0 -> 1754 bytes .../orbital_bombardment/hit/col_0_row_7.png | Bin 0 -> 2656 bytes .../hit/col_0_row_7_odd.png | Bin 0 -> 1749 bytes .../orbital_bombardment/hit/col_0_row_8.png | Bin 0 -> 296 bytes .../hit/col_0_row_8_odd.png | Bin 0 -> 103 bytes .../orbital_bombardment/hit/col_1_row_0.png | Bin 0 -> 6686 bytes .../hit/col_1_row_0_odd.png | Bin 0 -> 1876 bytes .../orbital_bombardment/hit/col_1_row_1.png | Bin 0 -> 2316 bytes .../hit/col_1_row_1_odd.png | Bin 0 -> 6618 bytes .../orbital_bombardment/hit/col_1_row_2.png | Bin 0 -> 7735 bytes .../hit/col_1_row_2_odd.png | Bin 0 -> 1676 bytes .../orbital_bombardment/hit/col_1_row_3.png | Bin 0 -> 10470 bytes .../hit/col_1_row_3_odd.png | Bin 0 -> 11489 bytes .../orbital_bombardment/hit/col_1_row_4.png | Bin 0 -> 10138 bytes .../hit/col_1_row_4_odd.png | Bin 0 -> 9976 bytes .../orbital_bombardment/hit/col_1_row_5.png | Bin 0 -> 11385 bytes .../hit/col_1_row_5_odd.png | Bin 0 -> 12064 bytes .../orbital_bombardment/hit/col_1_row_6.png | Bin 0 -> 6426 bytes .../hit/col_1_row_6_odd.png | Bin 0 -> 9154 bytes .../orbital_bombardment/hit/col_1_row_7.png | Bin 0 -> 2978 bytes .../hit/col_1_row_7_odd.png | Bin 0 -> 7419 bytes .../orbital_bombardment/hit/col_1_row_8.png | Bin 0 -> 103 bytes .../hit/col_1_row_8_odd.png | Bin 0 -> 132 bytes .../orbital_bombardment/hit/col_2_row_0.png | Bin 0 -> 222 bytes .../hit/col_2_row_0_odd.png | Bin 0 -> 3507 bytes .../orbital_bombardment/hit/col_2_row_1.png | Bin 0 -> 10168 bytes .../hit/col_2_row_1_odd.png | Bin 0 -> 12908 bytes .../orbital_bombardment/hit/col_2_row_2.png | Bin 0 -> 13616 bytes .../hit/col_2_row_2_odd.png | Bin 0 -> 13116 bytes .../orbital_bombardment/hit/col_2_row_3.png | Bin 0 -> 12675 bytes .../hit/col_2_row_3_odd.png | Bin 0 -> 12531 bytes .../orbital_bombardment/hit/col_2_row_4.png | Bin 0 -> 12562 bytes .../hit/col_2_row_4_odd.png | Bin 0 -> 12661 bytes .../orbital_bombardment/hit/col_2_row_5.png | Bin 0 -> 11957 bytes .../hit/col_2_row_5_odd.png | Bin 0 -> 11714 bytes .../orbital_bombardment/hit/col_2_row_6.png | Bin 0 -> 11506 bytes .../hit/col_2_row_6_odd.png | Bin 0 -> 11157 bytes .../orbital_bombardment/hit/col_2_row_7.png | Bin 0 -> 11151 bytes .../hit/col_2_row_7_odd.png | Bin 0 -> 7311 bytes .../orbital_bombardment/hit/col_2_row_8.png | Bin 0 -> 2145 bytes .../hit/col_2_row_8_odd.png | Bin 0 -> 211 bytes .../orbital_bombardment/hit/col_3_row_0.png | Bin 0 -> 4091 bytes .../hit/col_3_row_0_odd.png | Bin 0 -> 1212 bytes .../orbital_bombardment/hit/col_3_row_1.png | Bin 0 -> 11679 bytes .../hit/col_3_row_1_odd.png | Bin 0 -> 10764 bytes .../orbital_bombardment/hit/col_3_row_2.png | Bin 0 -> 11349 bytes .../hit/col_3_row_2_odd.png | Bin 0 -> 10611 bytes .../orbital_bombardment/hit/col_3_row_3.png | Bin 0 -> 9941 bytes .../hit/col_3_row_3_odd.png | Bin 0 -> 11295 bytes .../orbital_bombardment/hit/col_3_row_4.png | Bin 0 -> 12642 bytes .../hit/col_3_row_4_odd.png | Bin 0 -> 10558 bytes .../orbital_bombardment/hit/col_3_row_5.png | Bin 0 -> 13108 bytes .../hit/col_3_row_5_odd.png | Bin 0 -> 13316 bytes .../orbital_bombardment/hit/col_3_row_6.png | Bin 0 -> 11036 bytes .../hit/col_3_row_6_odd.png | Bin 0 -> 11932 bytes .../orbital_bombardment/hit/col_3_row_7.png | Bin 0 -> 7538 bytes .../hit/col_3_row_7_odd.png | Bin 0 -> 11591 bytes .../orbital_bombardment/hit/col_3_row_8.png | Bin 0 -> 1401 bytes .../hit/col_3_row_8_odd.png | Bin 0 -> 3409 bytes .../orbital_bombardment/hit/col_4_row_0.png | Bin 0 -> 5868 bytes .../hit/col_4_row_0_odd.png | Bin 0 -> 10884 bytes .../orbital_bombardment/hit/col_4_row_1.png | Bin 0 -> 12408 bytes .../hit/col_4_row_1_odd.png | Bin 0 -> 10951 bytes .../orbital_bombardment/hit/col_4_row_2.png | Bin 0 -> 10453 bytes .../hit/col_4_row_2_odd.png | Bin 0 -> 9768 bytes .../orbital_bombardment/hit/col_4_row_3.png | Bin 0 -> 9451 bytes .../hit/col_4_row_3_odd.png | Bin 0 -> 8362 bytes .../orbital_bombardment/hit/col_4_row_4.png | Bin 0 -> 7835 bytes .../hit/col_4_row_4_odd.png | Bin 0 -> 10209 bytes .../orbital_bombardment/hit/col_4_row_5.png | Bin 0 -> 12354 bytes .../hit/col_4_row_5_odd.png | Bin 0 -> 12644 bytes .../orbital_bombardment/hit/col_4_row_6.png | Bin 0 -> 11233 bytes .../hit/col_4_row_6_odd.png | Bin 0 -> 8733 bytes .../orbital_bombardment/hit/col_4_row_7.png | Bin 0 -> 8932 bytes .../hit/col_4_row_7_odd.png | Bin 0 -> 7083 bytes .../orbital_bombardment/hit/col_4_row_8.png | Bin 0 -> 1867 bytes .../hit/col_4_row_8_odd.png | Bin 0 -> 103 bytes .../orbital_bombardment/hit/col_5_row_0.png | Bin 0 -> 7338 bytes .../hit/col_5_row_0_odd.png | Bin 0 -> 1384 bytes .../orbital_bombardment/hit/col_5_row_1.png | Bin 0 -> 12495 bytes .../hit/col_5_row_1_odd.png | Bin 0 -> 13124 bytes .../orbital_bombardment/hit/col_5_row_2.png | Bin 0 -> 10567 bytes .../hit/col_5_row_2_odd.png | Bin 0 -> 11410 bytes .../orbital_bombardment/hit/col_5_row_3.png | Bin 0 -> 9176 bytes .../hit/col_5_row_3_odd.png | Bin 0 -> 9521 bytes .../orbital_bombardment/hit/col_5_row_4.png | Bin 0 -> 10577 bytes .../hit/col_5_row_4_odd.png | Bin 0 -> 8926 bytes .../orbital_bombardment/hit/col_5_row_5.png | Bin 0 -> 12470 bytes .../hit/col_5_row_5_odd.png | Bin 0 -> 12310 bytes .../orbital_bombardment/hit/col_5_row_6.png | Bin 0 -> 9769 bytes .../hit/col_5_row_6_odd.png | Bin 0 -> 12141 bytes .../orbital_bombardment/hit/col_5_row_7.png | Bin 0 -> 6256 bytes .../hit/col_5_row_7_odd.png | Bin 0 -> 8654 bytes .../orbital_bombardment/hit/col_5_row_8.png | Bin 0 -> 103 bytes .../hit/col_5_row_8_odd.png | Bin 0 -> 1012 bytes .../orbital_bombardment/hit/col_6_row_0.png | Bin 0 -> 1230 bytes .../hit/col_6_row_0_odd.png | Bin 0 -> 6567 bytes .../orbital_bombardment/hit/col_6_row_1.png | Bin 0 -> 12048 bytes .../hit/col_6_row_1_odd.png | Bin 0 -> 11264 bytes .../orbital_bombardment/hit/col_6_row_2.png | Bin 0 -> 11927 bytes .../hit/col_6_row_2_odd.png | Bin 0 -> 12750 bytes .../orbital_bombardment/hit/col_6_row_3.png | Bin 0 -> 12136 bytes .../hit/col_6_row_3_odd.png | Bin 0 -> 12001 bytes .../orbital_bombardment/hit/col_6_row_4.png | Bin 0 -> 12364 bytes .../hit/col_6_row_4_odd.png | Bin 0 -> 12720 bytes .../orbital_bombardment/hit/col_6_row_5.png | Bin 0 -> 12623 bytes .../hit/col_6_row_5_odd.png | Bin 0 -> 12391 bytes .../orbital_bombardment/hit/col_6_row_6.png | Bin 0 -> 10836 bytes .../hit/col_6_row_6_odd.png | Bin 0 -> 8314 bytes .../orbital_bombardment/hit/col_6_row_7.png | Bin 0 -> 7281 bytes .../hit/col_6_row_7_odd.png | Bin 0 -> 6707 bytes .../orbital_bombardment/hit/col_6_row_8.png | Bin 0 -> 4500 bytes .../hit/col_6_row_8_odd.png | Bin 0 -> 684 bytes .../orbital_bombardment/hit/col_7_row_0.png | Bin 0 -> 2791 bytes .../hit/col_7_row_0_odd.png | Bin 0 -> 3268 bytes .../orbital_bombardment/hit/col_7_row_1.png | Bin 0 -> 11619 bytes .../hit/col_7_row_1_odd.png | Bin 0 -> 5351 bytes .../orbital_bombardment/hit/col_7_row_2.png | Bin 0 -> 11812 bytes .../hit/col_7_row_2_odd.png | Bin 0 -> 12593 bytes .../orbital_bombardment/hit/col_7_row_3.png | Bin 0 -> 11956 bytes .../hit/col_7_row_3_odd.png | Bin 0 -> 11333 bytes .../orbital_bombardment/hit/col_7_row_4.png | Bin 0 -> 9177 bytes .../hit/col_7_row_4_odd.png | Bin 0 -> 9686 bytes .../orbital_bombardment/hit/col_7_row_5.png | Bin 0 -> 11011 bytes .../hit/col_7_row_5_odd.png | Bin 0 -> 10288 bytes .../orbital_bombardment/hit/col_7_row_6.png | Bin 0 -> 9720 bytes .../hit/col_7_row_6_odd.png | Bin 0 -> 10643 bytes .../orbital_bombardment/hit/col_7_row_7.png | Bin 0 -> 3864 bytes .../hit/col_7_row_7_odd.png | Bin 0 -> 7514 bytes .../orbital_bombardment/hit/col_7_row_8.png | Bin 0 -> 672 bytes .../hit/col_7_row_8_odd.png | Bin 0 -> 2947 bytes .../orbital_bombardment/hit/col_8_row_0.png | Bin 0 -> 103 bytes .../hit/col_8_row_0_odd.png | Bin 0 -> 114 bytes .../orbital_bombardment/hit/col_8_row_1.png | Bin 0 -> 110 bytes .../hit/col_8_row_1_odd.png | Bin 0 -> 263 bytes .../orbital_bombardment/hit/col_8_row_2.png | Bin 0 -> 4073 bytes .../hit/col_8_row_2_odd.png | Bin 0 -> 8203 bytes .../orbital_bombardment/hit/col_8_row_3.png | Bin 0 -> 7979 bytes .../hit/col_8_row_3_odd.png | Bin 0 -> 9244 bytes .../orbital_bombardment/hit/col_8_row_4.png | Bin 0 -> 8758 bytes .../hit/col_8_row_4_odd.png | Bin 0 -> 7765 bytes .../orbital_bombardment/hit/col_8_row_5.png | Bin 0 -> 7063 bytes .../hit/col_8_row_5_odd.png | Bin 0 -> 6252 bytes .../orbital_bombardment/hit/col_8_row_6.png | Bin 0 -> 2685 bytes .../hit/col_8_row_6_odd.png | Bin 0 -> 2135 bytes .../orbital_bombardment/hit/col_8_row_7.png | Bin 0 -> 3197 bytes .../hit/col_8_row_7_odd.png | Bin 0 -> 2507 bytes .../orbital_bombardment/hit/col_8_row_8.png | Bin 0 -> 200 bytes .../hit/col_8_row_8_odd.png | Bin 0 -> 103 bytes .../i18n/megamek/client/messages.properties | 23 ++ .../client/ui/swing/CollapseWarning.java | 2 +- .../client/ui/swing/DeploymentDisplay.java | 1 + .../src/megamek/client/ui/swing/MapMenu.java | 217 ++++++++++++++++++ .../client/ui/swing/boardview/BoardView.java | 8 +- .../ui/swing/tileset/TilesetManager.java | 5 +- megamek/src/megamek/common/Configuration.java | 18 ++ megamek/src/megamek/common/Coords.java | 86 +++---- megamek/src/megamek/common/Mek.java | 3 + megamek/src/megamek/common/MoveStep.java | 4 +- .../src/megamek/common/SpecialHexDisplay.java | 112 ++++++--- .../megamek/common/hexarea/CircleHexArea.java | 3 +- .../src/megamek/common/util/ImageUtil.java | 19 ++ .../common/util/fileUtils/MegaMekFile.java | 8 + megamek/src/megamek/server/ServerHelper.java | 11 +- .../server/props/OrbitalBombardment.java | 23 ++ .../server/totalwarfare/TWGameManager.java | 120 ++++++++-- .../unittests/megamek/common/CoordsTest.java | 14 ++ 343 files changed, 587 insertions(+), 90 deletions(-) create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_0_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_1_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_2_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_3_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_4_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_5_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_6_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_7_row_8_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_0.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_0_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_1.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_1_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_2.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_2_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_3.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_3_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_4.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_4_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_5.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_5_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_6.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_6_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_7.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_7_odd.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_8.png create mode 100644 megamek/data/images/hexes/nuke/hit/col_8_row_8_odd.png rename megamek/data/images/hexes/{obinc.gif => nukeinc.gif} (100%) create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_0_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_1_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_2_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_3_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_4_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_5_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_6_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_7_row_8_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_0.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_0_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_1.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_1_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_2.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_2_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_3.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_3_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_4.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_4_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_5.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_5_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_6.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_6_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_7.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_7_odd.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_8.png create mode 100644 megamek/data/images/hexes/orbital_bombardment/hit/col_8_row_8_odd.png diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_0.png b/megamek/data/images/hexes/nuke/hit/col_0_row_0.png new file mode 100644 index 0000000000000000000000000000000000000000..092101704363228e74febecb6c8790df68f3b63f GIT binary patch literal 13958 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 TL_)y*G87pJMe%YmekQhBux*G(gq~7QK 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 Ik+F>aA88yZ^Z)<= literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_1.png b/megamek/data/images/hexes/nuke/hit/col_0_row_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e252dc1865f853caa33d394e85571cb2edb57b91 GIT binary patch literal 9350 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_1_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_1_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..bb37b0672def412128bcddfd63ec4788c4486151 GIT binary patch literal 11931 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_2.png b/megamek/data/images/hexes/nuke/hit/col_0_row_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8af905b9a8fa347241b94af7d2cb2fe0b19b104c GIT binary patch literal 11874 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_2_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_2_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..59626752ef9ddcb3db3c3e6568a150df978dfa16 GIT binary patch literal 10110 zcmV-^CxO_BP)I29_pP~9*1iCReQ7lIUfe6m7R4qlwI!1@ZCMVsNIE3h!=Yu*LdjBu{Rd1; zOxO{Q@FI(LI3$N>!Wxl7wq(lgb6cQl?T4|(|XbqW)aa|ABbpS|{ zgfvZ2TA;KB4N568m7%o;r4d4OKSu}rA>6?Khq?|wrwm+ zq7i7VO%!Iz0FXzO2DAo&Ha`UjDL_jgeb(nOaq$QUF6ga(uWT$%S8z&ejD7jPS(KsP#tFkjr( z_jcd2<$0|&SI@rvP_THY5gLXOuIGY=EKN~p9M?fB1qhT<-3u|11QKNePs(k_(wZEZ z?Lde-0Gj`@`6B84!y5e&##whbI5K;9w3IuWXGpN|@} zmPjeg!n6IQ_l-M6Y4`nGBRBtfD7Si6qOi?#XWjOa>cz2!aIK>mP5>p{jtInu5Jhc$rf`rTDlO0)8& zNoqir0yIcz=#vzJtq=&qf%5-#=6imE!YoLFd_~VkrgaxkeFs3duJUGq+ybalXfV-^ z$=^yVu3tF&kudqlfQ}z{L}yus6cWd=aU6$yjYeh4@KCuqt+%eeoxCZ9$*;h+DQa!W ztG831&I-LXCx6&bO3|SXI!nzus1!+(;W##yZILO(^$X`77?+Pc<+Cg^k!R&pC5q=(MEl=DV$&Qs$J2{C!);-E!fB45bvdWudjAr?;0~VLOk8}hssE89w3{zAWSK%J zmFF*srRBDq2VEv~$Li%ySMWXta4+Mw1t*DPa}2FfNO~$2T*o2|0xZj7d3l*qxx~om zD9u(Ir5=1HJaB~W*n24dRKq7bIZfsO+qTI`mb7vLZz5Dm*?rFkjja(TJN0<}*j5q2 zw%pr2m;5=MlUbc>0zyb!+eS!1sZ^v`ERd!tK|3IdBcu={S%y-Ag70zmC$HT%J`V)w z&I6BV+qRKXk|{+J$D31A3Z%61GSlQEDKx?|&&v*_k}@wR?`;@Bwu8Bqj;Yi{p>5lw zX-bx5q)CdfBvRO*!ICy<9HGe=8XRP8eGS`n5JIwZ=T4TFmq=5E(_5^{?a9`UAqRr;lqbHb^0;>-M{_!3=H&R+4sLd-Ft}SK1y`|xxev2%8}NZEX&xtXAhq1(QdbaEh$9WLd zQwd-C@)!B)SN{RKckklr)hk@PdX-8~50g`q^!D~~^vDrje)(k_$6;e*g9DGAxUYnI z-w~>ECC9c5XA^+ux*!Z$cWnC(Vug91hAt=lsH1Z{r8S=GaO1`ef-t1gQz6NcE`>Av z*Z~0_`}oH=uzw$|u*uEIo2;+b@e2i{G++Lix6W|sz4v(L>1R1{;skHL`6fx4-S>Ij z^Eh()2@Qfcj?tLN@I9YWsYH^ds4VN|&Fy0gwb?3m++z;Cod#{CN=cgHc^>=s>}GOm zl4i4sZ5!Te{!CNp?WJC?^XtF*_j&Hwr?DN0lrAgFRetY3euKB)ejD2|v892a9Z>1* zMG8rlr8ut3^?RgI_Z6X05RhgH+j9{}JkP~;Y=STZt-C97hlFoNs?nnT&x)v zfgnvY!Z09;VnE|KF1F*))6>JLr=Gv3i@GO34<0?K>$N(L?c!{qLmh%{TbALN;&!$2 zuMS+1=j_gBmWm~I@7_(RRH9m~;rj+eOA5a5`Oop_qmK|p5k2J!X_E5VU;ZWM&tD`- zQqY=AWn@`uG}?SYQ!2%=ZTkEB(P$2weBwhd=AQDx(bG@pW~+^3J192EwPo8lIUn76 zp?A9Y+h5ztE8*_Izwekih(ZXmEW`6WJlDpyY{DSGwk(Rp0-!l{>J%@$@Cp9n2jAz| z@smVJ!kcfr!RxQTNgOAXOGPp;Ju5&6i%e-8$3`nfu~Z_76QVRlIxaWPp1CV#9~z8I$uLS{Qk{|N4C&ac)v8R- z%%HN2v+ur(29_3=c;~IRxp?s+mgC?SJ)$fnQ)&13X_`PgaO4ufhdZo)@rP;S3zhFA3VtD@CfJ5onyUL#dT+xo|~Z^#iXe+rnPzBkh|%F;rlxK&K0Z#n-6G2rp0sfM0-3t|0(I92-F@g$9Yrx&mXWEHEK5m~ z1cCSfdbA0^2Sun-YFlsVUdLuxYjT`z*$AOY;+Vnyer(%9NGKEw6iWqm@7~Q5k3Ye| z!v{EWST0fSDdV~> z`}XYvA-Hz!8cJnUD!oijPEjhA@O_`&-d-dck!3hSaO&xg-|=ETaLVu5vzJ=EMyu5# zPE$Z(2@9-_IH9pR3(|dnc6-EjIi=QjpZ2h&trAn|DKk*%MQO#{+%&yCJ@~$l(3;PG z_7{2n>8H5--esDN7C(OVRTdT&+1O}fSvILk86FzKc5Tu$LRKow&dm`;AuoLV1zgAB z(xpo@n@#rb-%q_>CypY@r2<1kyIEXZq*kll@jUMc=-$J}bfeKgWr}vIg|r-m5@>1q zFbK0KsLV{=yUB5PQ`$dFh3{yX=69LT42|dc?Af)OrG<2g8uHezqu_6?ubH?DOT3j zSzKNrL*N$+*q(!u7zz=DxkP4iYL;zklK0cD*t#HXTg8RI5&{XP7PnopEGCU3eAlDo z`=nXI((*Eki*x+a7ycGQ{r&778|CD&<4oR|VCL2gg<_HU`2`%uMOYS58c`_vjEoF3 zH+zfm9b&9&>-2!a5m z6vvJod*3y^576-gM|F}UXelUFdMNkwBBX@^GPLWd=C!|TjXa4$UkWw%@JVLo#=JJ&*4D|Q2wrY+q zrNHxirf*F%Jw1&;<2o)g)6<|0#ron`es$Xgy>H5AX-bl$=pbZtY?L%fiQ|YQHSJ)P zYJ9&yrKf_lBykjxq_Jt#X~9;vkjUjbmG^YEg0<3a(3ErNT2$KSi3Q^!4{qtJk=A@jWhIzDA}pmKWENwxrz-DHIAQ0p)U;APCSJ z78Vw0x7+OBzmMmhe~#B)dyQ9Kd4-L}2Dheep_HOrF5!7DVHi-a*BKlfB8g*a^%}3g z@dg|9`ZoNw&Hvp8k7*$U<=zUJRy3QhcQQY@8ly#no^MY&w0R4Nn4CJ07GMtSzx zrzsSQOifMky+8XNzV8FDbLTkaQV&!nCDJ6t^IUx2XKrqZo=TZt|Mg#EXt)oJ;>DkRky6p8zES7R zH-5r9@4Q8$(csA^pW@L+k5H{|u(-HDlqiI-iPH?nu?T~ZIEv}1RA@Gv1VIaFS-kez zYn;Duo>H+$7=`rp_R(rKxO(LpVHDC+E+d5?2*NyAOgr3m9Bd&u{p8d7+&gDP7tlhf zLZUL3XBUa0kYce&rBtTq6-cuT(D<&4=eR(IN>j2V25Ev^34sL&HchUn5(pGht8S^7 zcC<_(u#k9;sl=-5Ys}8fQ7RSLy=y1`_&2`BqsJcM+_`gHxNw1&e*Pt%efBAoR;;eB zvbMfNtLf2bHb~Qu{d;$_XU{(N?K?=JP-55Kz4Z1E@U3sZLao-olY%%&@O+OfNsz4& zOWL%9h;wJpb8C8rVxf$b7Uh!5*w{D=3-c5TK91v%BnetejJ7Mt6ge+XP?puLzy-kA zz9V{UY?LU9SXx?UaBu)A1?^Vbw1X|n^j9=kInmd-Nwza}rL>IQ<_^OW+j**##-9|2 z0co0$#tDy~KEWf053*;^Zk~STDJ%;P9y*YBOC@QVk;Ew*8+9&Uxk9;A#+DML6u#$E zU0WrLVl2yJYHFG*SFfUlO?{)ux^dHk`*IDYgf-}~NoQ7YzF zUjDm`kMCk(VV>`N_dCqaKFaRhd+>c@;&ojgX;}>P4Kgt?!P3GKDpM4S9zhr~GCE4D zvB>!g7g<_aWo4~Oz23xfT>3qaojb=-O0&_}AP!>s`}^@-k0_2A9v)_7WQ0bef$KUn zn@!?4!uNd&1)nI2SY2J&c8#6IG>#&&EW@!J#K@jQ+Oll2EHmHG@DR0Xl^}|cmPNt$ zbFDBlW-TeOrIlN{C6;B(3_@--d)*~MG0vyvMx8Hx@r!)=Q=epMd5-_*zx)^CFyuFX z^XnWvc7!NNc=xC8a_Pc*96Nf9I5k3cU*90p)6>k)&(mnNX|~#wN(IJ7M|teA)4cP} zS>AZ#48nGpn3!aBb)CMx0iKJ}-osicMUuqKOi!EXYvohjvT$9O zOl94EccwcEy@@s{ba$1%lX|4K;4BeH0p)Um7hn7Y`}XbSzyHOLNE5~1{@Z_t9XobV z?y2BJ0Xj_>8y&$fxafAq#miT?IeCk6PlX_esMQ-N;QEa!d-l{=SX^dhb&bK{VP@wS zQA*QO=>=)d>+a^#-?QW@)wCL~(@Hn*M|sn<3LgOGMRAPfS+piPoQXr+jwhaY*PT*XlEev@-hF$MHgz@;fa!G$Z6Zo#8A>S}$3a@svzL$O?!IF3ovw98~vmXT&E zHx`?Su`C<%7D^Y;g8+RV?^lmw9V8us=P`w5DIIH6GY{eLT8_m&J3WkTf-}| zG@;#Sql-SD|K(ri7k}X;#>YlT(*z;l_19l#Wn~4+c2T;;<;zz&e*8G^p1VNM4%o3{ zl!FHk^ZWn#|3(O#;n5ugL5S-(=E6OXG>vf_7t0cCY-}(xI!bS)m-pU#52XxK%V0IQ<%eK+N7>qlqRBOfMv+r)NlmM0{uZo?A zO!;Yq39%V*d7Ztj2Jd)6g-HOQ(fP~9wV_d2ijaz@pL&uVW1|cY4YD{tOMhPp&vgmH z0D-`EUF!7)N(q#d^bZd4?z?B1pPxsg86F;{x4)mo#TBL|Cm9(TCI};D=4bQz-zErK zq>1TXdaj4(d3j&m=o60PQ0gg}#V1YhJQvHdXti6YEH90v=yL6@#=xeEB!tAuTUwpc z^YXcOyP&*Z56yw=_}rD=+RoTKeD^szpex8QC$`j^!0Il;wF|&(fvK^!E>8 zSsp9ZRo2(n>1*D)`ZScJh(D{kWV#k4_S__TP9k2w5+?m_~EO&q? ztq@9dt0aNU$)?D`&A4^z7Fn9Iw6wzP>>{=G%dD+ddFuJ6u`P$b-aeYmHqSl#9R0(? zOij+=6iQ6qnx$MRGB`X+5Y2J*+JvDjmT`5|>vc35+ctSpN@=uDAB%r01PHy^rnaQjjl?ud^QzG{%}J$r{fFP%M!xUd0?{22PLpLC zX-T@)22IWc@~tgeqclimK$Q801=n?n8|BKTnPw?oGBYf(`PqDbLz=`9> z_~Z*e!w;ar0gmI4rir0&#*GU=rn2t)x5|kf4{K+#c70R=Y};7K(=MgGy(zKUP+xivdY zrBEVl2NXRUOTd{kZz4RGXP)~QfA~k=V)EvU5jH%JG)q}rm?sFL?uObh2#BJHD2hpy zaervF>8a`n#A%ukhS3(?!R(*fjGvC2*lA6>Irq*W@9+xCT(9eS*p@{c$6R>pjrZaA zp+<*J@>QAI)Brp3+--8Ko)9$h5}yi|pJnPG6-L$FUh49wG_@zWHDOkl*^9 z-{FtG^-bFCHc`}OaG*lL(d-x-4B`mgf29AN?W4Vv(h# zWo}MPlEevpeZ73@6VI`@w8$qv`2v>Cs1ytA*|nQ9Z~c^dqeZ=0r{H@O3I%#96_!_) z30gs}$%t;$ZQW5Kg+!;B*)K(2WGJKEg21sY;xt9&yi(_Y3zZ=FEVhG=qHutgI~aAHMM)`Q*>M!13dc@}2Lz z!kIH?IDYH|JI2SEnq9!M9URN1(cHk2FgiNM*yt#66cfjJ(=f^MR*m7ILKv+SrBOPA zoc^ISnM%>QcH#IQ%F>W!IF3hePanSP(rUNa*k}$B62e~@7yNNYQnKpstSlG6U?fCqs|MZ{PvwMUWKK^l*mX~pT zo71O{@{6B+iNi+@@$GNFg6|cWpI_qN{+n;mJJ83@U1QvsxXFd{mrb`)WmvYr5*E#k z20;)|DwP-*9Hg($bUWk7l*OLop-{N4OBjZvan@a|lz9JsQaakE(nL`}bv>cBzS?at z8omi>YT7^_Htq?~`5PCzxzy;MbP0Z^TWMOriej;d>v{x18{aF^Xf*idAAJ{;$Cb

YM!WAAgUD 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 V-<@x|r?7LpI6%$USU$0h{vXUTI*kAT literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_3_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_3_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..9974a8b1ed3b7ae44cdb7c6f2c7f13c3192c6394 GIT binary patch literal 11429 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_4_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_4_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..6868e887a72ab867d820f76fb1109fc3350cdd5b GIT binary patch literal 11215 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_5_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_5_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..8575ceb8df84eb49552cc807d5697c4db18ba30b GIT binary patch literal 11296 zcmWk!S3H|-8>dE9?J9~YirTengxYG?2trVs+Iv%@_Fh#ZMvS7U*n3ly7%wqO>`+xB z_WYjjAjv@vlHdJY_kUio@3mA&iRp=PaBxUf-zn+>pZdV-9T6e$ZXY_$f`h|@QB{=F z_seVSfF#&Jd|>DMoyeenpuz0auc=?bkWABYrum3>Rb1{Vio{fxWxe4xp9Jt9N9}On z(-ZE{zMVgef8q3#Lc@fd>VqtK2&>IZp~ixA%pVs-mGR$yl{Gb$d91=#E$$mym=)oF z`_aMcwg$dnU(((Dch<_*o2{7d^=HQSSE%l$)%)ni;C+IZr4LBJrS7J*=yRg}6lGx! zq9CYYQB@i%(w*@k+S~1Uv`hDJA-Wv(Z*t%JP`bc7Ed}$8xndFu)!>Xz6XBU0qKIa> zb%{Rm(|}~MsfO2(Br3=Il=rT!fzN9HZiuG|kQ{?+(px54Qbfy0M_wgsb9YHjqN^&w_+3_(OCh8Q%>Y)2w@)#B9Xr5$(d30(6BL z{U_^rmD~FXL0?Hws8G@Tc!bCh;=?eM__*$j)AmYG>3KU5`XXqo?8YP7VRzu^ zs&I83V!KbEPDgpt`T}1y4nZ%_=allyrGzB%YLOZEW{NsA)c&fK9%);|ENtV-itV#( zajYe2B7HP4j2<;X6++fglOk%sU89t=em7ykE6Rg0K@cPvpg}nlpi*0Fsj&BQ_53B;o3mzjH}%l!}O_G zte;b2wO@C^Arg_r?zW zoClI%aSJxC7K0slxC^o)g~-Ti+%~qoC6_tI4I+5e-Ax}_sd*VtC{ZSD=z^d6!?2$V zuD6n%lQG*xHG35JxR5MdvEEJpu)Q`qH4<$!jN0cqT28iodFVWN0y!~)eQL}ALR-}t zt@_K{nnf?~I~R+WaS{Vhfe0kIjK?^tJ^_7(v%V^AcQM1`41bFavc6JwC$$~g#TFS&+iR07T4)TfX zF&3_}<;%*gX}gmk9xOkN%`+uDg6G=lz)6_yWcPGYTzR#P-`Eicic(S=dG+=d`(lja z#Zuvtp}9Z}W@g_fTZ3cMKMB*yxy6i6trV+Um{?ZHy%$!a-o9KmYrlRilT`K5>XJl7 z;i{AAwihR&h+B;Y`)q70ZNHjwS&Ly^8Kp(7}Y12{@ok3N~SVC=I%@r4Zze*c&`f_Q@%Js6CH)cJizu)m4m*4TG z;D?`B5-SoIrnrjAnZ!O~j}tn~jub}x8uWhpK$TAEgz))Q1SP!p(`mrq(FoTAh1Ki7 z|NaT>oEovKr?IglDHL<|VL=(XytI#)-58TMUTMFpPw=U#zibvDPSq9q3ZNDv+Iy0| zgj!t7LGXtl(a}-i+N=hW;~@ zNpqITicV5C`TNgBn2~e@+efcMG>TB<`n=JSEvam(j70EqjZvYzE4YDER@Bj`pItxM z%$}JME*7v9p+jg1^Ye2IB*ti!tADj|N+di9kWQ$x@AKw^0Z>;G$$U6+`~YurgbL~V z7wOpV6`;j9NJ5BL%vsD!oMs)XAKr7`gB2jS=(#iG z*5YVbbnYmuS*|DHVh_VagjH4w(D9N`F!!80RTq>w;!ip?iZc|X@=^t%Rk)NW@S)v4 z`PJ3W4XQ+8r~xn;_A+l)Qcg9@1pb)osXP&*3MGEg>58~KahNXu2G-LSD^aZ+`6ALw zvO4F-(P8il)G39$&ZY$V9vfm9ahCD&q=7%CD#IcuIJe$!62K1DqFL0qy=*2k zN{+Fd+=2up>*QO}V0U@9|^FU>RiXZ7Q zEz%gp%j4FA1<|{k(imh8rp?oR%P5}No&4DNXP)Ql>+L*Pp00s}1s!v#Li57r;iyc$ zR($m`UkNp*%Jj!3F@bR$+8K$Bqh}5|I#~p|oH_e6NxHyj)4SuD(r{YYH_?+21_Rul zF6#{m!_n(UAcKxxhklR>wkLOPl=@{W%p@bZu6_R(`K>bU^yBA^3!0ygV=0WX9^p-Q ziE=S(>Qz=2Pt%9>faAQ|IFc;W*owH-L1?>t4z@9N8%R;bPedMbij%YJ#ue`J3WbXQ zCuP-<%^>--GCHfbzOB$S+Gq0bpeXpP3(Jq$B|p&i=4M7n)nKM{yn4TYERh^I6F6c{ zB^X95EaWHg9|ixNyEXM8EHrB*&$@L0>+}`n;_GHwAi`%aMz2w>H#%y2T>Nv&o}#c( z4#%Al?)@3gm^02{L1CF7ClQC>{E9613rof^PUILDFPn9EqC_draMPp06?Pz@501@9 zLm+q!>ZeMU9G|ENrjOv4viY021q8_Flu;}7+KaF2)pqnHI--c=$+-yRvq=ra7T;&m z&%YOYnY2f|bke8eE7oYNRzo4)^zZRG}of0pt=d^cR%7d3q zkN)@*n}Y4FC`RSDl)whOU(~~y3%{!&MEbo=32$X;HmH;+Ehthj5-KXm0>)1waUnVD zf&38`1^xYd7qE!5xME(e__WgiC2A#W$Y_5w`PbLBMEGx9yLzf~-|Tp|L#fuj+*FGZ zva=_>XU3P8g;4XRZ{jWO;4yezuM+5G5rDx)+E2nOryIg2m-vy?N z-{(3!Evuw>0DZ-bL|kp}_d7c~Qw~!O=`-WcEM%x8KZ*OT>({j>ls|6Yocs6hziB5? zzrFqDDR7uzRCP6<%Zm5_7P@k^CItco3|NZUNfzKz3_JVy`0V&DvQ@D|YAE{tk+HL9 z3TA-oVoz;!-aCvN-d&h~eSN!beqUjB6-LtLd)ven|DcpnAPfE9;(O|+d)`AqUEg1n z$))icu|G8WALWJ=HEyp(yrhYz4jUk61({F9Fo;hNy;BLN zsM&gwA-fl+W_45ncgyUZ6HtT<9O@c zD;At|GT4nBmEn~BFi&^)FhTm1Ts2k42;Dh7%EF8RPre0{EOyLBB(FAZ#9phSg?&YP zN8!|oeIvbi&Dg>&SNsBj5@fLpY)biv#c#h6MHHSQKvYqgCl?w|Yt|tbI%#9)n`>6C zDNGg{M9u;XHLlN?)Cz}0tmMeY>Jh|E`Qo2)`Ua^sOGd-BRwmW74+%9~l7V@nh`q>K=5idUm2Yf%MueC7wt8Qjz9&xV?Plj=yM0L9D9+y zQ(`!2(jM~<0(ls1)`%}#`?Zt^Jf?$FfbMr&bb}G^dm9oB_iY{~JH)*}K0460fXCE_&mF|yo{!lge#jBx+wSPr`uxpw65F|E4 zw`7Gp_EPXw<#NoK07O4Rr21Os>DVBZl}M5mZgdt&*Q0pPBQ;2kD#0EDYu`QJcc`7OWzH6R{UFU^j+4C;-su<#^Q+IVQ`sJ&FNWUCFD=>06tLpI<5Eq-FQryf9Yy^1qKptI z2h;O?+(0cr-!UlkGY_~kHq5oan%Bfk#tDlK*4p@Oz=FA2T%+MV8}7BMBgxk=9_g78+IRq13Hkp13_vJ}ID4p~AbyeYcId4|JWDyNQ6xz&+!im_~sz>q>k5D=*HTuRi@CvDRD<3!I3 z@>!jwKT2o}*Bvzk%n7q6dF-48w5aKBE|iJZ8P_^vk#y8#oo2b6x4}@A>0L1gQF=~x zxg!oRzMT)7sC5&}4*=;O(q5*%o$Guq1 zk>t^mt(9%2@u)AwtX!pip=_q^Tk+D~M`*+duN2`Rjp+p8R zDd)0!uC4=w=psiPUL~SWhl>5V#`1f8wT)|BC5P5&0TR`;$OWfS$?>n_UqB%@*$5#; zcMY?hf`3KrhOW7TmLqQe*-7S4e-w4k7&|(8Qj#X>Pco{L75ZJ30^<52P$#TL0gou9 zxXYrkBBmt6+bA{n;Ihk=z{cIFvw_p7+E6@6;iU@&Axo!Lfxt1~LeYl5+x&mtt?*+P z2<+^vfK((RY|By(KE*~RpECJzs6oovxSGQT%$zV-U;{>&m5c5|bu$Rsgy`@fS%RG{ zA7lzPE@iM=IdGNaY%NTlxrXXYf_47!Y$(=M%;!dseE(EAVfe|!FyclQTm3O!3s?GuoA8(~&ZJr!fnZu(|- z!X5hgAw%(1mp`F5zbFk)>`>%92Jza7Jv&c9Q1be>Qte|bm1i#-n4hr zUdu(75>3@<9PgNF)*}n*$ruLxMS*;?_tXRqZLCB=0^wVr-gj=GFPD~bOe7!%7oVT;c}Eu+BBnD= zLkY?+`wGM6+&lv05yopR{3AkZ58npm#>Y#jB3O~my2jN88A`F0TVIp*3V9MKo9YWA zt%GE?(IK~0mK#MiRYtXj1Ef`>M!YnqG-bB^`wFkWJSM9#vk+iB?!H^Om(Q|M)MJxoszRP zCPt1$^R=SIKT;3~j(i;Xn9uqZz_iIW);QjZb$|Xv`?)=8F8oAs%PtLZ$$+1i7kP+= zSRtek5c&}-oVom)ig9k|FfHe$d7Kh{>Cx*K6jv0`w$;95qCA>by-!I?tCtYPOyuO+ z9$-vb3Q>dEfr2hRMMUr@x<~4VS8~f5)rO!OSseFIOEP}uFuOw^qOntD96mgn;LOd> z>_#{x2&0CX-A@&=j);!J=_nfn>+8S$=KntRkiSo|^bqXzeh%1qISO4cdot7W87HyW z4GtYfpJW0>{es4EVIy3iz{iasGU*T+W2-aSTW%L?cHgbBo%4(6VcN z~tU$$Wkb zYF(PAYN}e=+U_4oZ6R5T7VlDNzZ*Q#p#}mhcSg?;ncky3-@%{f!rw%>nVqG{oeF6| ziPgD>%q9B=>S0vG;PX`lv;t8KYjS=yOaD~Ll>NJxF+Z!q1&DSU7R8gsg2V>Tt2gU- ziKlsi^i&9@kv(q9`{j|Yv7|>Ulm#DO?p^yVFrGh*tAQ^>=mlZ5F&ioU45*{dw%fn0 zS?J)PgXnd;knQyCf1QCO(TxvEcrQ0!y&dU?M>D>7fg4g>|Ln2mUvs=C?e*+e4F4X4gr}E=aG(nF4Ru zTSdL7zStB5(T5NaaTV0<&YZ>I1ffdNFMib5_n+B+>K$6rYSv^NCc<;4o^%q!eU~l@ zwu#Mw!-qx7d5rjJe_=cu<`^EOVp>H^1e;x!H#4C%#d z%kK`k`e#-oc{2WeQU{>IrG4qneTLV;(~%ZE0r^6?nyvp;@Tg3=Gy=}2>6cFFo1$Zc zvtxs8qZu3;EkGn2llbp=x)90Fl1ZS8uP&?14u;U;I)1M%|%SupH{Mm=NDm4&Vd}U9V^(5vJtD`LJ>lhnLm^z&cDI@yvsX;7H zmTs@K>HQC{0*~k6lU7~Xo<2Tt1CuXK7FHJJ?G?Ua@R!MIyuNDM=H=(tO%U7GOFYez zISB@)DES-ZMk~J!gescyjqC3LY|ymz=M)x1(yTmZ5ZX?J5s^KSoiOZW%*VL9DuL@h zUr5<3-c9EUbFFWxVa!1^JRh0mE?RI(we#n@(q*7OK(zX_g85%JxDVvK?t~hHMDu?C z5-<%p(X$v}x3T~8ovmcvuX_AAjgzc8sP5+@XmpFkuv-Ja^PDt@&2(YzNK*Z%lLCFt zImW2Mb=66x^mXcE<1@1824g;Yca5qA%S^Tsh%&|JNQ+N<0gdmBgmbn0-R^OlUD0LB zE>BdZqMn2VdGv)|_};^P4b{F>wKuwMV&A$@l?5MNuj{>%LCL{+JFCWT1OlhesNdFA&EM7uR*~!Q3&qV05{pHSq{jA zjvD0~dPOcr4wNhA(T5ivu`@J@P zZ7nT{0_ddE5Fq$o08c@3 zrav~%FD|eoS<%F^ZyZS^dAzI7u&!HO=?vVdEUDy%qP7a|koSMfpZvPt55=Md^EJgb zA`@HWvX*kBiSULt>f3%{Q>W)vhu$SL@ogixM-X`~%?cFw02ej%<{;@G@wNO~Ur$>U zrkU4M;2Xo6U+H95g#wW(U91S9VSrO|lN(-vqhalo%MxF5m_Ur1TenbolRh4}BPEQFR)ArJ|6ob;!eIzkHpy zXVR;t-)Bqx=DbaFsyV=rR9hPEM{qu-(TY4OxSewi zKIB+t58U);s$WPjs2a2u!o`Cf=+F!fwew5AeodS(_YP_M7c}ndLX|ewT3XPMASn85 zye#~I0>pq0k2d{rVvHh?ZajD_FiE2zDrN7R#+`Y#jd}@Z$lQv){!kZlZYEjB__e z_-3H%ro8(QYujk-?%`oPW4{$O9assia^f){n)E4qVzuMdt`8mr`nYfO&38nXy#Dk& zuU&_XIvNDI>7b}Mx^ICyf$f1}OEp=bkmGEimBndW<_E|w@Zk5>!?%7BKIKZyGh2s; zDf|1*^ocPYKP*?*>=oN*w%093k4Byh*_AhCm{q%H^kJdl%zfUVB_TP1uh7DbK2OGw zgY%Gs{?o13DD{FXh^OG!6dMU+L(bBaX-lPQ9@)7FBSJlJOOkr2XreOUp)Z5T((F30 z73Fu|MZsZ_Qs4?%J@My(x7F?g3qv>*e%J=HkDhTi7mz08zXwXoqj9o;t!ReX<=YRM$q+US! zG&h&>j5%E0XOGI&_}Tj-{>;(Ys)vde1Gf*)-JjF401>wUy|X*^P_o(}9nc40Fwn*j zIY^PYQ>T}4ZD6qhGP5s9g2-yk2eBPF4m@9>8bTK`e(A{09|#iWsa-x1vI8U3YhI54d$X@&{Y7&)0 zZ3ga$=4O>NHpUkP^KytB&zKE5E|TF_!+#IoZlPF*lIIii3UJVQ=+mlF;O)3-fE0Kbx~ot9OlGt^ZA+Y!OF76Ua5mx zEn0zLd}BB{Rc&(5+nw>t(PcLCacuD?W)g~_A71NI>_`RCF#77WV{%jB5h~83Z=vBvPSP1@T~%ddT*?Rj_5MY%Xz| zdNA;@5gJ+e#inMC9_e`mN;as{teRa1Aj*5o_9M7q_;IrfT0LAc4kKJ?ED-!?1$t`tK$47CeHl){DA+$5BW5wy`~S=4w{$vHC9s6nrGYvHFo^g z-9f@-@a$Zqg9sN4E@T`Wdt<&mG@hFfr7(oCN@$v$tg7uA4d^Ue+F$f6GA1<(xfBaK zV2!j05iFWbN;AD?2zIa_F*x)d>6xlKxqk{cmQVUV zX)coafOmfcPwBz7dboX(6Q)1g^^p?Sb#q3;_@gR}s)ZPVsFYX4Q6$$IGGyY~IqoI7 zF`CIkgnxhW;(j6;F{MHes~)X{jWh(`3|iI|U4RbKwwk`)9y<=}T!i3*p6f)8MbxkG zUHbb-KfY@e({KB2pNwxg^I~y%S&7Rg*^x)xz;TTA^dVkf&nvPZ1nVovmNf)0zr|BO z?EC4QXuUeirtE)o`w~E^5O4opy<;M7s%WmSA747?=;u~F1aagK$D zG;8Zv1GnMzN=O*spW4i(T*MaW$sQ?44I<2Jc(Xh~$nu%p`L)Myzs-g`x?g>9(@*YP zkQ{{5yHtB0$Wkg$Wv$eW9>xaIJRV!Og8-4-yAfsYw6fiH(BxUlpQfm(j8ak-dE&^r z(8UFIDLL9R1*vGAWbnTd(dU2vC?)9Bb3Er8SFFA7Y)Q4{9n<@fE)3n~o5XPt!T$i$_j z`#-byPLH@s|`Z$1e0kOvKI2-7DL0zw&*RcFLc#46S2w>!HVpwx^S ztkRx?@NR1iS;c|uLPL=-KJfW~ZT++I^77x^p|!UE$y{CibX{LKO%A#C1y-nnZXL}r z7Z-HH-T(^Gj0hERs>AZ~=37fE3`C1w^I? zHQmnnb;&OAu($ny;NE}ojoy|ldVqp!vlO zt>57x?$~Tj{0IR8maLtn9%v+6B}c8K!GURv>4PuW7ek|Y#~sA>Q|W;u_|>K|01qA# zD(~bNl}^uz(*_g%KT5wl1HS;{W%u?P0%$?nnMV)kl9W%{p8rF4Bd0c0c8WjP1x9O? zk2BPEPY6MdhVQS;L!AOa&HecGyco}dYev`ZTQVKGRE)&=0s7Ur?n)3gvF(pQOHw>0 zFjD8!L11H>5h^p2)kQ2DX$v&gmV*7~)w~_3J;8h}Ag(D|c3BT#TI?D0Qij<85ratm z_q)40ncD6w;9}<_a-hgv4~H0BJv=-T#NKZcsHmub{Es8kXM{tXL{?wc0PABo z_ge>dsO|I6`*R4JI#~^L?aypg&;|p#u-Gy%aOtBeJli$&S`?`J)!Gx&*?O@cA79`9 zcfw-1Gkd3#Lxojwrvc;Yua|)?pUl?fC%pF?CjBl zf(0kS`TBP`} z4oWar^D;2>;9xyK#{BO1OY8L<`NHBd`ypNsnk*_m4>lL6m}pKQKFUIbH-UU5MrfGx zs$RWvf@~YuI_kLGCKm^FXtgiff@I(`yFh1)1JIBSNBZMq&_?2$mDRt06N)(6V&SxI&jvH9EBRNLVH@SD(+LArF?*sWSeO#>~06KYA0aPN1%IUKnBW?n+5_wz}62RK(yi#5*ugxw3CZMH|CccZv$L>{Qi|kzLk(!Lx&!; zUs$|rUtUYT+qvH+zgs2G9;XG&G^**UK_v9yWe(lakOsj?yOwx<`^@&`OD zqBrH0c9Mh0`qh801HIluvh3jtD+>$11W8q1hV0UYes*ad_6m@zT3&rp(9(Z25^K|M sE8Hir3H%FZR|g>rp;o^dV!Z literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_6.png b/megamek/data/images/hexes/nuke/hit/col_0_row_6.png new file mode 100644 index 0000000000000000000000000000000000000000..55548267c8745929fd9550e3508d941f15693a1b GIT binary patch literal 11144 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 NX*}0fsexET{tq~#G-v<- literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_6_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_6_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..db700a6f8899ba909ce31d361effdcf85ca3b0e9 GIT binary patch literal 12409 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_7_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_7_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..857551cd2e33b7a8f8d4fe632360c380d742d5ed GIT binary patch literal 9238 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 V$ZF|?4gB8+Lsd~rp;pc^?0=>=`#Jys literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_8.png b/megamek/data/images/hexes/nuke/hit/col_0_row_8.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fdc496420bf781bcd6ab02187c11dadc56242d GIT binary patch literal 5985 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_0_row_8_odd.png b/megamek/data/images/hexes/nuke/hit/col_0_row_8_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..625aa8294aa804764ca04823c9be05bb10d038ca GIT binary patch literal 12188 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_0_odd.png b/megamek/data/images/hexes/nuke/hit/col_1_row_0_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..f357422af8c676e2936f28d50f718f809e9852c7 GIT binary patch literal 11520 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 XHPLzdHVF9N01;G8?|GGqb@=}PP}69e literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_2.png b/megamek/data/images/hexes/nuke/hit/col_1_row_2.png new file mode 100644 index 0000000000000000000000000000000000000000..aef4c9c03b50a62092a718a3e5e98995bfcaaf4c GIT binary patch literal 11980 zcmWlfWn7bQAI0fzCm-8 z9MbXJ&x?C|w|%zjx_;-J@44b%>Z#LGu~88a5YTFBsK9`CL*UV%AOl{V!zZ{22!zr# zRTK>ab4S0L)fR6CEuIEvdF+3?boFuUfw2CdiHM-4h~lDrxg-GP*_5OG`nELKdCO54WN2O2B8Y@UYvS%N5T|?hopX`VF9G*JdlG&n|D5_VGElc#m34 zYu_DxnXWRqf8hL(BTbIrzoKNP?N6 zcX1qF71|&C)U+q6qU=fGPljqmV)#q=hne6sZ~mP^Mr)^-1}Ob-wn<&)37AY7Y|wF@ z{^B#~Kf(W$0t%9nXm9!#uX1EAk^>GJ@B=m*+mjVnD>k<~SLX${QXWA&4`q&* zqMh~e{R)Q(ZK zS|9wbt`YCTwv8@zVPnIMi_x09yat;Iu~2*-Oi1i|s>)?5l*I~n#>~zm3fjtQPUvrT zZijCwghS)!q?^yi$>ntzNGw~uNh6Fa`rcj&9~@tXC+6ize?1x&^p$=Pc3W`E(H=}* znWPr7a!0<;N&Zs!{I8SzNGpC*%F8~%piFOK%NN`L;v?0y^4d7oB#Y+I5;WhX>nMYo zr_RYo( z^~u$_Psou|cr5n%=jI3OX2=q;z5$5zv3`E9`H1(&!^xVk43iq`J{%i@G&s23)!mgb zma*YHMlzXyBzIu(pWex-zw>r%!P%htf$XTD@VD=42N4aYdE8sRl-&df+A7}9xUIBJ zDcn|~m~MO_1>%XHfkDPy3T-n~#3unnX@eAu|Fr==q4SvYzdIK54JqLl%A8GpR`|O2 z;fder&n~7rx_ap4H7X`o&JOR)cZB8$npAt^H{7h-Z`c~n6YVzmuUkj?o5O-&oZ2@hj*DIc{Tciw7Uzy( zO^RI$8uAodd&`nv=ECOwU&|0e!n$Z-FRho-!Ds?$z7{n0Y4I@)v5<9G#Ad-Qb7aj~ z-KlKfOoLO4&nC0tpF45fd3x0PnlYp}u^%{8oA{Y^1dOTVE)?`R1D}pYGkC7`;rmd= z6{@Uiz&WW+`}QrgKQ2y1vpY`iIQ}-A_4vvAZ#cR)vj3fr1$cXUe!t9r!`XScr4QHX z8QT*Y=_A6Pw%%Sz9ew@e@_K4|dZx9ZCvUEO{%cTlSf_H$^!ohyv*Tc32;8y{=(EEm z*=jAvC}runNuYloM)C-Mp$)W-FdTbGN>ol_Wc2VYZ=zCV-Pms}Xiii;f2tNY)X+#d z)8X$vr-)5)uU9v@{8gQVL%M|9xXrnGr{nF}jMGQGN0muaA4VNDmIYkOaGxRC+x5kB zF8ICEj)X4TL5a?D-J9dqO;ZaS<-(S*)#n^RXWWHcD;A44WFEnn4|65!bfFuT9lr5l z?Mb4vBMwMdntQW0D_I00v>0WI5bckOsQ<#C#6%*OzsVibYo9ui<^XQkiW1Wm?GL>w zbk%6c&0CN~m#%nRC*7{8H;v?seO|npYG&n3{HRyPzQ;Mf=bHj!8W1%yYA}UJ23@i4 zzgh80=9KUEeOfZTbI=={zhvuC&{iIFbte7i-y01<7mRt}EF6JIs2p@gXSY=!%IqR( zGD}4x6a?S?qNmd)5l|mNb9s%ThyqbcF2wjFV{;Jd|+oTe-;4cAvt@4*JJL7$Q zaVGBXry*=`{tD#!Qzy9v)nG!+3SFz`zAvo&{ZBsb{e?cKwO+a%6hBXuJsvs@ALJo1 z%j71Jx%eY}wlUqQnATfaRdZ*6(BY$(q|~e69oB*7_jRqU{q}N20@@eRa&{nC24Bze zyYbVyq>}3UWIY^86f!o?@^n%t%&VB0sTG#U13TiLKkuKNjANhx8$a9(phzx&*O@9)Gu{mbEpx;~BxsBhPyiOGRLb0S5neB z!oW_~DSIYl{Z#{MD2CzI^^vK%_kO^#-Ty8YuX&X+`jf5M<8Q6brmJh^PnTv&8CpAq zHSNa7hdhf$2p7r_PB^U{E5msQHG(?@W}nzKONONv?YCu9&K4@)&Tc~!M56X?slcg9 zEm3@=!}vcZ!KUS{VY_Uq*7j9A?|2wuXMB}#hPg69QHwW=x8>Js*ehv|!7uV@iXMxt z%1{(5e9OPR*Q+-{xZ}Gry{t+*ZiU+BOs0P-SJEr@+!dLL?BiKqvMuPURd1eqNCl56 zr&uN7v-$#Zhy-=N6^P77%#iq=Wg`dy@sN2Jf-R#h#$V6^+ijm+ATX-NlY>Zi&aN$fd{0YvFYrc3}qRzz5~FWqM=xpcgh&T8=NBS&F| zy$?KQD*JK4#lcSfTJY^yv_L8a>d0#UKZ@bD!XH{X4p6O1 zhGLqOF#}mnEDINJLtoVOHDKlV64s-55Q7um>sw@%wvA2wv$GMBN54()kGl*wSEUq| z4pKWdkZLk@y5Ili9xZp2d}^LpB0vSntV+_2iI}zy&cOU+c=E(+&FAEYW}yfV74g+S z!r42$c5D58{M}Q0ODRWav`9ZgEH~Geoos$2#ntyDle$F3`$F25l-VJRQ$t8!l9bK zjDZ(Q@+K>vw)u^6-gNEHa0XvIl>en|lXc%F@PP5YDz}!)FuFS(={y-o?Q$>a4GlRl zZ|yhC(9{N*B16h1Y0)x4xg}v8bBO+(SVBdHPZ%{s(q@n|-yx>|G__D4DNFstFKIF{wUDj0BAAnpu~A_|fJqEa#gLedwG8=kibW z#eQnxuPW@ZfA{`+{~NBLfVYNh@!U@JWVId*kML^#xNz=umi$zWC{3r7@R;{R#Z2*P zMtxUD#BT-(-Ks8AT@yYbO>(Kl;0N3LGhy~@%4V6S@D!ye1|hMMPXgNL;n5v)1T*el z5Y)DckAkQ1__thGlwR||kU<$>w!}5(yHB6Hv?;tJ)U|qecQ4@tlwSrIhge1>ezhXT zX7`1g&rKJf$*y~_;WO63yHww-b9m`y=4MvMMsq-|BN>mInx&drhd#|c6oxf2zjD#a zep0?e1bz;SVqnHjSJu=NVbmzb&3Q6Z5TyMax=Q&cDN1eSCGO77B2zDoGKz$<$-pE6 z6vps95-^C%N_v_VS-&=m+4=kTZ()WysE;NNVT!m%t1f74xO$E(96prMH8T0-rwSrH z>xhG~A=ud9fLk>*>SK|+75*DsaJ58#Ji+;T{C4&B$}LI(zqFq4!|_?zX27k-tY%#E z*K0Ql2)6S;MpJO*S9y9&9oAReF(go<{cc?yCel!D%Uh8(mga&uO_IlQbl6 z&=`ia`Y)73@tl&sbX;^9E@BjWZ^n$IXIu6!vroupFMkejHp8fHif+$5ylR`VEb_Oi z9oJWQ6(|tu0FyqJ*Z%$+kmWXI_m>~Mmqm)w#c1G2nN-Vg+?w`)uhZjkg==&ZEaF(_ zxOfB2SIOn_PZ+zCQu|pa#7ZFAr^~Nb{BjJ+uuCrQAtNa;pUaa6dIj?v z^R3SsEuJtZ+`CLy-oQ&m?-9Uh8a`47lz=pIZ4(_{G$0O1b+F3d51$viu|6f+%QJp>`mkTB*zuNM_9{!Q$ zSf41-c7E~^`&fgtp)Y3HRz?1vNS+>pV3T4n2aG~y{XcDn7{H^s(D+$FbM`%&_Yvc_ z8z$j>9mgy9v)Rq?tAC51AcA9g(g|)f0x7Ppu0V(}6=IgTzA0-x_)hBB0RI0ZKMee_ zvBA6$Mot(5)i99WE3FpDF62Un#8`6g4W~J3qtRVr%;g~S(1A}4Gl_?15i%oyC*?=- zkEDrNeTor$1qIpZ4*7-*-gL4gK<4ddP1p~%3_D%>M~~kaY8JKdb5;U zlWA&N;*T%WfEnQwTkXrtYK{L|ywU?YH`^oA_YcR_|GV*@+o3xfDmatGUR5|bH)~Z} zb@sn{0e5qYNlP0Fe4k#X|1u}G=K6g4rTJ5KI*}=0#Kf(NCafp&BR^pIb^siMEvkO4 zlVLD<*T@K3EvDg>`$fx%Henxa&i8LVUrTpho%Yg;IkWazw)uV(4nMzF{q^Xn(^&rM*@^hB ze?nfK6%eEY7cc)Cn7tT}Y{|(XiBz|m{y(|_1x22Kax8Kxto1xM$K0l-)O=^%T%Ulc zwm?2mm5Rwierh!O^Ox7iLN2RfAT>WN(68(NR2;|1jP==W<)Rp@_kNxg{fiAt&C2-+Qyl_3H9WTyp}5(Qj_r|DIayUF?{`jjj10&;vY)VCG zZ+GO+ZCVosy^IN3TH1&((-1ku}edLGRX2UtR-0tI+iMNrIG-(H#;w zGvl<DU|+{)O-uP{^rn|5B;;VWo(VGtu5c(CxdE2hqq_qV~91vgIN7VP(qZLYdF zJuf$C!>%53E(5VBWPL_{1KW8++utC%Yn^i{_fJk~QJG5Fz~t-kQ9^`+k54+euyoK0 zFrD%@p_zQr&HLk8_Jz(FXDrk**d9EQV*&`yZ0PrPimiAR#b(gZ-Z^k{Lm064x84*o zSWkpwEtKrSgZvC$bh#QCyt?P-_Hx!DsV>%7x^T|BN0s$0Ne8bmtZji=OUcSugYeq= zy`S*f}?mqvUPg~Hs-9OqQz@LHXO61jLuQ*ojGGl*j zoSY*pLH76JX59csk7F^{z=QqS!wo2! z2rwla0dz$Srir$GU%bFWqm<~vpp@dkhuiw~*1L_DN;xLwEKG$#C2_#OegE&XJYnz= zQbzcvmR*&qOW#Iax~sbzLo8#n$HMZGt&&m3k4=2WcOG7v&_?E5S)bve;c;n^UW}_^4k6tDyBQ?6n1;svj0mnKk#oJiQV^4 zi|c=9E(a%~W?YA-J8%59+w8@2e(nQd?M< z8r>`Y zaJ{Vvdo2bNX)gN7Aus*zTew212DeMVoNs%mF#$7KkNxuajf}QSKwHR8j_}ih61|jE zA;N_H%fI{k_!(?i=KHYYqL3>%X8_}AW;F3Mr(zdbr~^8Zue zgOg_Y;ltGdtMI_U!R0fC_KWZ>@1f{wrQ0>%D#b z(qbSDATVi`u+2u5N2p-XGAjk)LDN7%ZI$tT`0H#m&q(g0g)Ucj_WAi)1#OL}lxL@T zg}CIQ1a@xOBZyB#wWm_`=%`-azMTvE=G^8d@KxO7|qh>)1>N1aD>J;%hgnPMX^hrvhP zB3$us9(i6p``KMOD5(9EmlQ^Q^wn0bfH9WNB^#S*+3BAieXU&DK-w_FR6^4K>qn+R zleolLdBF|1ZDEY@e#O3ct%DW!lSYdN=2dhKMo;r}%F$8$d#gblk^6O+)}fO_w~GaF zFZLo#DFm=P=HLaAuqDO;N&rKj5dwIZA+UqK$xe>bAoIDBPDZ8709cD+J<;& zh@uA7x%iPpa5fq2J>02mN72$tR$Pmjq)q*YCm*mZKbXNm%jhqSMEaz>Rm{emiO+Z6AwE})@VW>5}|A^)y?{3$lWMuYKwg~b7<^NZ~ z<;!-qLv~?f;q*?OrI6K&hRpS+4&nt*3(5c{EW`1P^(1g^Zn2-3g;POGQu2d{g^r}p z#Y(_zY2JdgYn8{RVqO~MG+t}X3O;jf^{tJ2s@CKC7&DG8}<{?r$4o%DaL%-__^7^rc-w@q96xF1r2ufHM2;CXKYo_ zHQIBk1X(ZdgyygR?DnL6ka3(rtXMpFnCLSJR`%3sQ5yX1`Y>Q_-M-6Ntay4WRVb^m z%}TF8PO~h1e216jP3VhVR=fKf_ zV;{i130oxC)8tGN=8+QITP+WxpTsc?f{}>T7Ed_C6d)lLJi62yc#z$***v=YJHXJb z#_cp7$Z87GQ4|qy^JRnoxNNCHwrC8~{$RB>Xz{B+@;(XZK7Km7RVJo+swBdifE zcqH=>>z&D2WQ(C6?C?;g(--X}*QUasBFrsu*mb)){aLW|I_>+Y~6+SVG7yzXYPZ>a#O? zpMSNH=d~*P`zA9B&Y!G1OJDU8j3(b%a5_8-nq%DFU4cg;5?9JYwg|cxiWM3ek3br za?s8BW@`|h45$ljFMCDx@?XTSwU@kDgpY^cNZ)3i_1RqT&2jq9m|8rf3UM`9MnsnJ zX_=?##iTG2salz3_Y;vdz+RcI`bY0=fUu`8wVG1!Xv9RUO{FY<)av5TSbj{ z5%<9_zXhn_{xhwr6!veT1FhVRWY zW@N_@8d*Kf)1%NTc!Xs1QUH+)j>Kuldq{+cYb%N(bcha^V64A0h*!}OlY?}NdJC&s% zlo6nD#h=7!9n7R&RY2lR2#%iW&dki%g?J8bY&>ESvb1g0Ilq|h{6E)wcM^KD9Dcso z5timI$zI>lv_XP__D)SbQv3uSVdtK22CF2cB^x5xLdC4W>;A%3UUue_m^%|xk&|f} zV1R~05+-ezx*J3}v;-hrZ>c4~3s@_xv&l$(EX0E2=a_10dTG)fWDr{wan?vE=WdV+ zRE0G*a8}t=yFu%L>R#>CmampsCV){Vo@hG17c{Z9li|1%D|&qs!Rx}P%9tf=uZ=#Z$%!9uYCY(HG39U+>ys%GiIo<_HG8z@_g0!s0w6 z9Q)>2N$7$h$nKzgPZ(>-FReyf(f;vYV><~lWumd@$`50uzx<-Db)5)c5fdC8`?DAk zn&c0JRe52Cl#13ML%&hiCfkqgTKhrSc$U4gIiLu?x7wo&aL)Vpa~jQ`q!q9K61I*o z=76btBxZG9UUfNzPoKQ83bAQ@@VSjg--jVq#Mi?R{1!&{d))jpicGL>%C?eJ(3Y=3 zv@|lq*!nxv?say*%jWyU-<5^|Wbr%CN9uWmz3avJMxLRK+)rfbTZt+ch&~X1k_F1> zs3JcVeT3_R$j8yagjuj&M4QkcJ`v|M=4l^%A5NnrfC8y+4en0gue{qhi;!;vl|iTh zybm!Eguo{B%mX`=G~-h){#c|A-!nkaPHDO(iY{Vw9I8qNefD59bRm?+bDps>!e5XR zn5Tkn=^{ksYg!n~nm2kT3(;I$=5@uoR_#~(CVXSRi*6dK5vTYvnJsnO`PEw^(rUqah*PVE$#T_uAyG*+ zm|fN7b$jbmijXp$uEGo=Zgz%3+3g8GF5QJ%od>f<7UWDdRY@YHpX=P~Am(1WOM_q0 z-ZpC+Q>R%=^P$!SOa2)}=-KCotkHKF<2}j7jiZ_MGWq$w2OR!Z(n$1jducWOp`Spn z#!!OR)wqmj8_Fa2>bhx2h zRpS?_F@DdkE-u)htcAv$#)whd-$m2A<2wQGuHMx{=IfO*pIX|$L*c~no=G>`0VUpy zO_s$dBV9o+ot}mKCUe@yN(vy_{p$&(>=G3_l|Prgc7K)3KTPJjr7DfHJ`PXy#~eCB z%;e;mX4(wDza|i=KBGvmOsX8FPN52^>BbY)x<9z|40$I?2On%eN+z=&1I3MkX-s3F zIqvmiR3(8&m6X>C$u~t#c~3-&u9bnr-O|*+mXl$yYVYg#LN1yG$;x8Oq_%Cpxj(e` zj>}K4Th6*S!xy!dk=pF)fgRS%>3Vp$Nncr|z;L0Z8@a`+g_qNlRNVCx>x{ir42Pw5Y?ZP(+uP=!tIx40+I4Fy}1+aCZ1{GAg0dQgRB^K88!&?deb=N#Ytw@}Lk zv15gSNO40b_p+Vh^d#;P@9kNJK1MJ0&zOEw?bhLuj>Yo|i>vL%Ip?jtAg*3$K4Z9I zmYE^zT;(f?j&@P+BNB%_2BH zSZ6|zY6Ta&Y%p+^4^qb^JDK(GS~OGkMErDK(zBvy##W<|kkQ-^5=cdb;F1atBvlMA z2hgV|rx`~PHhN1R1VO#<{ZFpGZ%&%j;C?;d#1_EaLZc<=Op=0o);#;0JI-~H=#?V* z^P$d*^_hA|o$4|H#cuJupBsM#8)ClLz(lIw(A2_?%_O8A@_0n>X!1*|rQ_fCkHs)O zFDgpAPsO0QTp6X6Y>o+uhpu{7CLd-QDw{Mft{Kbp@*dHIvf&uix%2mrd@J%k$a$lgnslH3Qukx?8Qsb0jQoeR4XON1uG%c?)?wcc6|OG`a!-KV7sDFO zDFKt%<}z5%=a4V;bPWHeQ5rBgG8Ptq=!hyV-FcjR2bu272k|lZ*u_Lf=&(%EpvX|) z+?-ICY27^FDJiLRiJ1U7^mU!3P_uBn={X59c>L7*>cpf94jTRW&MC3WG}?G}os%$V z2{_l1t0uC?*Ja?`c1S4VgE{_dqZ=rQAV{9P~>)$3HD7ttJ0kciap0fRJS zX}i$SBA&-zS*#1&l6wl$EoaAV2skm z16#K$dy)C8+Z&bsn~ph2WAle^eRKS}b+ybs+DD3b3Wnty$JnW$8lkh?hH>d&C2;Hx z!cfiA)AJ9nNKpJliFB4|o|njfk10Z$rqltxn|e8xZ$G~C(~vg&XtG8m??+Gzo~sDM z9k%q~-cWVhd-s|hk$6a1M&m6}>^66?snHE^ud8adWP0(@b!UM@sN)}8CtklQjS3qe z>CAAJ+-&CcFUhN+$%Vwv0L~|dF?g~6fE_r-E{P7|w-Jb%4mBJr@@vE-3rLO8&j2RD zS7cY9%`$fQXKqocY;tAE_6Jb?xViNL7sM!5DZn(amg`b9L=&GYiL6t4n)hQ6msp&^ z9#m%-g{}m^NdT&~Ov-2DsI&E%GH~vVs#C}6bNjmUu6~9ElDy)YWL(*EHZvUq;xF|C zM477V;>(EV_{s(5e&RsftMZ&=Uum8_Uy9JAw9IqY;jS@`8T&EM#{O0xCk>#?pdLc9 z;|x_g-cJzeBZ#n0AJ=1`I+?BQfmQx-_iGlun<~$HpOq>X&y(g!;OEmv?6KEFo35Gb zK)|#z203V2w>`3^(u7V6j(4RvtpCK+Tpw}+Ym(lhoJFpm*UL8YRCmko66MhMU!YD( z4A9T9>x0$4aTF=iSFW#Z;q*?+d6#17rr4ss_lU=?PmEpyF_Oef=Tj)%0Q@i7#b%L} zv5y-+liOzxG{nF?&&Ri;*39jfA?FDNbyL;J`Wbv?&}sz+=Lnfm$y}Y^3k#2R4S<4S za&Lv4FnY05gKr?LrpfwDtUh+1d5{U?dSY$%5X%6MKxk|A{}Cx*2Eaa8EUp zQI%UmvLiInzij7M-*6s>7VeyiAa*7s88g1`_aMx?t%pn%Dk_`Xa{Wdy+4*C=uhVn) z`If#dgR;P-2~wKOq$I!Ww&kw4|Ge}I|K;b?jMXQKBx;&-3~41|EFHfDX&D*n(9sVi z5Mk*x(qf*K?JH9~eq;J0ORv!FNxEumt6$tsvxi-hotv1g+d|cPOa~U&`>mE-Z|%1( zd8+KD~6%|*XLa~A=28A zF`otC%sD{m)hTb=VaZj@HA0miv~jOE=CoroKKSDNmUEXcC}q9t{UUHnoj_AnPo-MP GHtK)XD3HJa literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_2_odd.png b/megamek/data/images/hexes/nuke/hit/col_1_row_2_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..85d2c723a68d6bc5f9f94fc4c9f16c433b9dbbfc GIT binary patch literal 11806 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

*;wU{rA53o_rvLTZq&T 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 XzpCw;lP|#kRou{o>8X{eSO@+O$%wkU literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_3_odd.png b/megamek/data/images/hexes/nuke/hit/col_1_row_3_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..b917e9ec085863640f50bb5f97776c8d75ac15bb GIT binary patch literal 12621 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_4.png b/megamek/data/images/hexes/nuke/hit/col_1_row_4.png new file mode 100644 index 0000000000000000000000000000000000000000..28751013823f866f472d04552efc1fc338158608 GIT binary patch literal 12660 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_4_odd.png b/megamek/data/images/hexes/nuke/hit/col_1_row_4_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..bfeeaaebbc2a549d3d67e2fd87a7538dd681584e GIT binary patch literal 13138 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_5.png b/megamek/data/images/hexes/nuke/hit/col_1_row_5.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a519266e65e23ef717ea2adb4e6074e4934e54 GIT binary patch literal 13296 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 z z*)KF&A1!9@?3}1qrQJEpO&A1Nfq*iC8j8)ak;E{`c*cg@eIXO+^+56_Yc`Sd!NL-4 zsui0hUNC9kDk+wlZ*BEI0~`@4uM;swMkh%9Cm|*?K#exEwT){iT%+agFR6e*;@@P* ztK52C%~n45_qD9RoYs@Ya|9$M%$6M-_GyH-F_C=3KNI)NEXk%?GaU?AVXE9mfn?}Y zp~u`6?nLbBJllKJ*J&xirl15hhNOmX$GR};IEZ%ahgc!4*!8z|aWDW#ava!OColaD zX_GYZS1#NvLU4m4?PWiqKCN~JL5(`(8uS1xzqvpKNx722v7Fut?|31AV*5KI3k82)kNl~$sWO|RNLCpsTq|$z!-w3dc0ldd&IylW!K}5lhJOASmI}u=3n&3uP8&(^orY`(k z>PI~D-k%TSsO4>pEOP|r_`uY>$3M$@Wmt%~>$Ff|aH{9<&e_%VV zI7Y@QvnQmgv58{Z9@y<>Dv5dC3P(T|Q3g{@vy)R`)gw_+fq{&SOU>%SJ^_Y4-fX!M zf0?8I-}3vAhm#bw&PDYsyHUIhfB9`P4+WUaj3*cX0pP`&btgO0an=V&&UWdLP5!Iqy(fLsI@i;1XEMU1J?P$;@ExA4ZWEPn5)9eDdJ$U^8ftd zf|G{U)qS;J4N&Zc8H@T)a`z-%(;WDsUEQxnja{EXrhon+k0P>Nw{0tm+4CEp1P($P z=TaLYqPe-igP8=s+)>8goGP5H%oJivqhpR4Q+jFaJjNZ*X=JR9N&43I=Yu1|z$!UA zpQeFjZeArPbYm9OhgP_^78VzWcAJ&G&MSxG+Za8Bg2&!=#KC!A)8R*>a5m73Ehk96 z#G{B%-sF>Ym+dDVE}g!p7kLhJ(a_FiZm2R#@TE0yPw4R$dH`jp`MQ;2RzFXzMi8W? z`u)A4T`*lNv#jU*D&o=P;hdkh#rd#l>+I}eP-oP3ijqyEjspBJYdZJc88r!s){o+U z=2a4;bcK=tVx5#+U&uHtM+=92%zT$|^$Rw#pD1R9|18zV~($mw>!QBQMeKvh&j@C-gIXim-d8z=bFdza_ z6cch~a@;Q;FLB{Wm_W9N;>y2~#fmpY!OF1^#;X8>M|Mzkj5rXX2@}%>-eJY}lN-aP zwJUDbK<#*oEf6rY66Q3`N-}S1X$vHSb#>2XAe+B{=;1NGBZFbBajJdX&=8k^MTaIx zBQZrXcSTye+Gy=xu4s;WShl5qE^sL|b22^KYXr~d-r+%!(r&-mHnpOFEY0K7duN+G z?k3qc3k|liv!WTM$SC_K-^2?`4=B}yJE}9{NuI@}fug{=C#0byaHONyJLg3S-8#$d zku+O~fPnkoCAdtXw`Dape#EoXJ_u;qi`m%F@5H0{y0fKv_Q2*Nu_HrTB@uAj0JF}^ zQ#Q08p=?y$K#RtuaVa4kaAC>?;Bo*{%0JfVA@NL+V{82)drtYLDg;FIPScxzvYr;m zd4>CbNZ$7U&+J*5l%lbCKd-t?CgnGszugbd&0aCroZ(Gc`DW!mZY7k8_;|n- zo_f1|-?~x?eeV8exy>)ap$W=V0n80IH@A>(Ms6-WiLpjGUxfi*s}fRM3N^OyrueFJ z_`dM)R(SW}_TYhSJY26yTCc*qRQN}USzU?aRUtk48?R1k3~?DRdmLpK8yk!GZnvdi z)i3kndpFJakt`Kx$qqx54Hi5-_CsX8WDljgAR`7JLK9Cw}@HRO`nC{$k#k6AXXPJ4m(654$6=o4S zGq9shX=cW1O(h!`XXP~2I7+=+DSh+g>uVugzV|C-yh=#wKW7Z5r>8lUafki@4P29Q zc>ClSyErBAlB@?|fPJ}Xb>+3I{o=MRCnu*wpSPq&+BnNT986D73_cl_981wCAObLI zcDJ#)S*<|zAAw3E#Z6`n_AMuW5mhQiy13pY!<2Y6Nc2Tcdx!o*M zDu(QTm`Ly;<8vyZ#CGnJP8?x-9c?IJ*p*@8WkTazf5m#KEZ#iY0KA($Dz0X@@!C4&eHiux?wG2DDv4B~H z(72hW44W2;L17@Gfob8#YArvXfph`qm{Xgw)B9lcww4yycLvoYnz4}gP9`t20cYx8 zfC`|8ztnD9ZSF6;eCy(+55hxx`CaOgo%R8ChTp>-L|~Z%Dx!zW2gR-Pc72CKuRxjx z0=BMe4D0BoNGU5tLZ%edjfv6NIIhe$Gj4QI1sY#H_a~<^47F>-VBgZxVrpr5g@1d` zQqpaZ;Jf#q=?=oit|d2MFxku$U3hy6au~uAv%SX^^QYD$MB8ow%i*l8FYU? zWzXU4o>`_Ab!8=p32lo($#>mU-AfzJ8bY249`83z%^r{-mVv}eFSC*mI(&u`&dWwk z56xqX1f&#k6o)nW%-;F5S46`WT_a?@L!hJb!!D36i^|KZG)b$|;R6tY@RBMwuREIY zu)2%6n(orof>Co37y(ZpQb_Okj(p4=P`qORUw@@)9sB6roCwtf0;D$F;xb&xV8kzO zj;@%coR46K7p!QA&Mxk@++4bjoXk+JQ&BO=dKYZXOF`4wHI*n;VdG~2Up+~9fmj<1 zT0(3ybEZL52rtL0ST)kYW_2_ZU%4e|X&2`IxUJ4<|M!Y{G>bp^AQU&*W!+Z*k@tEB z=m1a~n?U>NjA3uTJLN=wJqHkBmW>eG9HTaCtfQiVw05$6ve-ftlu{`B2HH#Hy<%|I z<-N(3mc$UaczzU4jzN5eJVtvFX{6V#ZzTqHKaVbDG;L8U)h{uq<-k=%DAzBeTcY3Q zg&!=8A1r;HY?sE5z{;yU-jY;M{_qVBHj0Xa7el?txcrJg)4sUX-JNY zMC~ngwfBj>2#FG-27T%W8(9tYnYtWjMKvBL1c5?$hGD~t(TRTCT%2L2% zY=|A!jl+=q!jr;9r$FPw4st2RgI3W_DClRjoV{rk0Z9fT5j<-Nr0*}CrkmGL; zC+HpjxS>sI*JpwpNgNwgR6q_<1<1F)Qy|DUXb&wL{)M_>Vdyjk<`<)Bm}E?}(xdac-OKI~<|Po43uLcPLZ z6?30$b%Tt$bUEK(?TzGU3O$cR3DW6Ln9FEUaB!kq+H@%|?}$wFbO- zfG<)1FtTRTK!Yx7M5|~BLi5;8`SlZKb4=;-pVV@qA>}wQwVh)> zz)tt)g(trM!;K18s$G5q*l$^z#we>!y$=h&ae6PY__O$x%RklCd93#1$xW>f(OPYs zY-)EMug3U3-2BpLHzL4wME>@ZXvyeYE8{ISsb0Sk1}YnYo4ap(|5OW#N=pv~gq&OH z*UeqdYbeCSgoKIP7l70f$d+_L+qT|$cAx6sb7)E-rsTzj|LiX}<#%`b*e>Ek|9FIH z_FErF2|n~5)~iyXyK4Oq){#cVrECX?vpwGtgPvyVKpV(P*Kf1&i37XC9t$1aj50c*OF8e&-opQFAAvP6E%R0rt@Q3;9R{e1{fwrTpchUbC0Pd^D*{QlurY`7NS$U}FEygNM zoXD@SIH>-Uart%hJ3=S%#qpo0mu}1{fXJHO^P(rc0VDpoG+ZY$k3a17-W02qnkuK` zIypW4{>PYGh^1sXkE zX?>QxaE*<>HYQF?=!)su`uoeg_Za7ZGGxTzvV(utNg(YTY`qBz_3{BHJy|GGZUj!ih1-2rb{h43 zj|)M4fdWv%k*a!8ymohZlU<(@LH|4C=AxG`Xd@-~g>MmhvQV~tZ=?{w&a!I2hkpIU z#l+-go7Wz9O_|&NC9LvIr4UJy<@;E1CL6efa{9D*7W1Ny8<2FB?J~gVHnDTdO7>*1 z!)j`9(~3Qk%0d5@6zt)o#dqWD(uQ-chGJtmK(^<+CiA@KP*kEtjr{tbKMsCN()K3J zkb2#hqN{H6_Ta22#>a1KChzZVq`cRp2*~!==T5h;fIi@O^(>FH`-YyS^aFoX+1I7X z!WD{~dLsQ$n|9^s*Ea4n=u@eS6Te2C*H7g9kTKA1_;8qYm3HdFQ35R;bS-9RIJ@INDPQRr zzb^IP&u7F@*m*S~(&ApS5+0j>yoxT@Xf@X|zw{|%bnKw(KY_A^Px`-`pp9?XID(^f zs_~!F!Ncm!*72kwvEi1ze}01S=f) zy-y>iDha>|cYU^0w!(N)RD9naa(e_J1nPWu_o;PBq{&n>hZk}Eu_jIl!M!ToW;W=3 zZwH@o>m0uslo78DoTdWsIzI#lMEwLxQ8#4!K;)JJ>*(rI^6*6|TW?g2?wt7-$Oa@24N=b+ z3DN!hhfh7hFW&ULsK*>2Hc$gPdWlUyd@`%=bRiz^5A+(@A)Rq3RTG?#=U$9WJz`QWGFD6;{zjqw`GiF zePQR3bG}sELUTY-Lj(5!Pyn3huFOLUnn5!n^{NJ%oiIX41svLVZ#yP|K9z71$HcG{ zrhcVtnX!ac$E=QY;7h2poybTeTOvm~n4V&~9SZcD0gX|mSGabkaB(`{GEkTQ*yx@3 z40uTB$qz}1&}XS!V7053Z@D32iXkUFzc}yC-#&@Upo45+1prNs`-|g)OeqyB^TRMh3Bu}$5hZi8F`bJCJW9kK;?6n*OdEf`xou> z&BgN)-mgio;paZjE7d=Iu}ule<0%d-xY1+cp%N)t-z=#8WZlVv$V{&w4>7b}@8vA% zy{_%$zFQ1ARbr2t> zlDsCnkD3qZV=!JJI~w;pWP_$3lw3B1b!S1#)4N_bKn9E*jze(au`?YElqEj=AOxDY zaa8?64)%Uo!1Ms&O#hjaB%K*eixX8Oku~Up6MoXM@Vg|L9@d8TcJZGp8;LdYDoUfT zK2liKCYye`BRF^8M|I9OxWw<~@(EbBDK;3a^Q_!W<>u$!S2ZhuUfVQ6e+PW37vzk5 z?d)8@8*gd>x3vw*_*%`^s58Cm8M`j@5;7Zzf5B9oG$DaO{Zb?(db1(uWkIk)CY+!K zG6pn?AuHp+MUYvYN$_EZfYn7KwjCv*bgOkuUUcbRIed7o7L(Qp8Y~3*pD~;o$tQ0@ z?ycH=uTJ)&zw8n3$gW&Xm9IQRtbjTyMSnOO@KVRxe)&EwLA*K2JI4rUR@AoWPQ5Ms z|Fu%q~s* zkj>|#ad8N-xxUA8V#|uN?pN%D95r(cK1&FmEUnzCB7b6{xYn+N37x5NxBE4`78z#b z%OA(;i`0#fY|mLRJ>Dw~c5z%vN|CFwIUOyH+Gk3V#J-k&*+sXMvxXT=vi=)hcef9$ ZQW`F;!c5O`fdAxq1Xa^hMJc}y{~rqv%f$cy literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_5_odd.png b/megamek/data/images/hexes/nuke/hit/col_1_row_5_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7700e1de6b1acae9a611585e7df7a0cb995818 GIT binary patch literal 13194 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

8ZJ4>Z0tXybiy<A2mv3U>g< zaN9_;{>YIT9$$i8F2=+<)T>j5Y4Xy*MmPsQC>CdF?JwMuBRuH17a+w$s8BH}6&rgD z*kV8OgQJ`qA3m>tc6E0X6ZbE?=+!5qEif`(pN zst178$`r4nJXtV+7u4qq`<|zL7;n9CZC09d z^aXc^$#=S!|I9DgyMO$6*7CZ=GwZ(}c{2S=;}68d#2%qa)w)&F&^(ziLFWUx*OE+l z_jPHLun&4E2t(g()``qiR1iZx_$3sTU9`ngh5*(aKqz*#Bi&2lDz<-D4_m`{2w|kf z1vEhU03vYipGWtTQC)C_+DS|AU*GcRBVy`l_{t_Le{Rarjz6rg50?TRR>Ne7kh+;t%$yy-^82kd zDSI>>BZKzuO?j0Yy{UVx1!PL(YbQBlU=f{E6YxdmF*35GZoKz8fL}Fj$2q8%q~UQ8 zdT;)iF~0YMeb2xEBsNxK=!wvH*(5QO%>uiyuqON{E;UuW(WQO*IN?7USil}BkiP|j za-d(4-G@IY{nRlfz+KJ4MqcX4r_o^miK@maa?DjJZ?)UeR2N7}E9%lUG(MwvGh*qM z2DrKwOw6^lrhsXms!pagQM3EFQ$8O^+T5#{6e!inU;F*}>7QL*YDmJHWj|+5WpOfh zh&s

-R-gQ>L$<-3(LI>8T+r)CwQ0{rr7tJ;M6n7}_bX3~kWc_R-hmk%~RZkCC*6 z{NenTHrU^e(rk&-f95z7EP=dL3>O$opT34bWR=c1Suw5^KDPX3C(+^EGc+>7UJW)Y zm~dv_dpb;5j20mz-Ys($Id!}YrDAyU_B=R%1o5=K<`mAwH$rk_o45XsLrV_>M1qi|4%fK%=iCO3I@} pn8`CGWD~YMj(^4boZQ^8%h$Dp2eL|r0ngangDYz*RV!G8{12C~jn@DG literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_6.png b/megamek/data/images/hexes/nuke/hit/col_1_row_6.png new file mode 100644 index 0000000000000000000000000000000000000000..b11947de99379ae5b87833332935b837580da64a GIT binary patch literal 12655 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 I>g&+|1I5JRIRF3v literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_6_odd.png b/megamek/data/images/hexes/nuke/hit/col_1_row_6_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe8b1548da4381e159d38dde3be9b2d79f80077 GIT binary patch literal 12073 zcmWlfcQo5?8^){E8buYgM{Oz;4MmNbwW4U17)6bWy<(3RjoKQ1Mr9AGRjVm# zH3&jcyD4hde!uS@NzQSObG~`<-1mK5pX*LAHF?BH&rN^n(j`U%eI0Y)^C|Gsr@aQe zyG8#HymU$CuYr!{(~$hZ*3fD+EbQlg_|M3bgXKS~W0jcam=^rYUVfU;PGo_z^E(MG zhsDWf`ONt}5<>D+bm#O)(T74>2|};+&uO(p93(ku-}d$}-+d@w$T@8M*r%az|H0hx zCS~_8;beTBOZDEY8d0vb#=HolViZXV);J89Bf)2z=8L*^*C_VSx<=ek2wb(Pp}BK@S`TJq9 zCF_|MDGx_KAleG-f)0bZm`?VNBTaATaZinv!M;W`uB^Bk@b-RRG2+)yTdciExzLY5 z)}FDRxnA08+ZP=NGis4wsB7hH78W;kZ|Xu#Zz+TpKFJiVpGqEd)wZzMJHCP@+QpdA z41g0Bb0|{`q=qSS(GSXjL_exGqVvV)vO7|VxKgY~S!R!4oC|cOEj&BkNA>pKD`ii? zIHAW+kRqbP{;nh`*LvmMWtO{ZFRa-wChX7etIP2wKmN_r7P6ySQOV=Zh7ucz(<@vB zPQzIgV32yx7~f|Xx20pZna#%i_pn%O&Tuwui5$0yRc-fU zhS}&DQ;S<6GL10DDKR&0DD;&%IHe3E^-z#U7l{T#VjVe^8dF@LIgJM6V_=9j z?=mR+I(w3G=<`wvccYhZxpO_;J4nh1gWe)v*sMCDGDC#RfQ1NVG(diw@>Eh+ej(3Q zKUJNRsz+NA5arkDU-zQHx}Ki36zo(_2lY}sU7S0f>v*ZEUPs&D#nUbO(erwykO50S zT2J!LLsQZ%6#CujRTT4NVLS}lG-{oB6_$l8m-NeICCI_0shG7K)~+F(=J7JAMD(@U zkHAlYei!FBiDsfU%PG#hJ);BSFgiYy(S5#i`X@gr$q0iHOJrH0q%VhQ6D8vQIT!!a z5!!2t-X&$4vJl-a%wQ}TmbX$VuVQc@$;5m-*3UD$(=86WE+OfsmR2fZjCC16M7k%3h;srtTPs71-TSHB!2<6^nvVtk7(V~cCV{w)0B&2M;1b72bBL&s77 zJ-4d(?L?t|+(VL0vGhO}+)j14R~AA&0>;%m-c8ms{EZh&lz&zQoYO+M*O60>SerLT z=8MnISu5x+`Q?9P5=JVCGQ4l3XD&^7Cb+iWatXN9NaPC}n%aq~gW=4sk6tk*!QnCf zQM&@C)4?eNhrFv`PGB~!;t%T58PZJmWMnW%Z; z|AZ2p`b&YSPQz?Oem)&xj@I@Dd_b;mDw%2v@J=ki@b{i%SC^MxR*@huuPVrn=FR?syQD%Wv~X_a`3i~~uUnwyQ^@?(24j>Kam z`jI#Z2@JASBHs$L_DSv(|C^v;nThk{9Se6ojGzX|UgGh}Wyl zz#Ec9@(Vb{ORm;zNjIFX?;26|!yXF4;ummFIQ2!GtebPJ3+j@7`A8t+08XMmQFZu3 z6$0=55yT@(Z9%+Uu0sSPl?0QuKm$Dic5L&Z{B6(EaNi`&tk5ZoDzp&hzz1^*Vsr4g z^PP@E%dzDtuGgzO{R4Lwj+hFHV^>3;!fnn&uNR|-BPW>5VfUXX z6pCEta^%E8A61iho>eIz9Ov=;2=Ckfm3|BOAtXM0{Wt#F?PS)7+E|xdXPBO(sEe6d z)>X*N9+PS zJAEi1>yB$jO9%im@%;x=rjh%e4)FN zRY((plM=TniLr1M*VOb_l&4hIv7RoWGzX~gA0pa@25fIa3cD8;sLsw`bsPy?q@=wW z4Tdju%Q{C#r$u!THUqU#XdN>hX6nht6p9ki)`;LW{E+`=kyIyMLJ5eT`LZ2pbia|W zIx&CWRhP5(o8GT5b%Z0!KlS!4Ry3U-uQ2#E+G7u|2G$ntlaCWiPZ3Fc0V0-RrOG@x zQ?KoX*@4Jqm^-Im&^&>1#u*{E0{lWXIeT>+zq_|-JrW+2|BXjuJu;E{k{XJN0z4zp zCv!*l$2&Wz7PoVJS#egf*+iofIxMYuqfQm+`AJ(D(CQesNU zTnfEbI@p1wI6@Vn)~2KlUA9LzwP=g4)?@FiBwfu@(lSW6%+T%7VEqCmc7wk)k%9*% zLLlSUaMnP(PoJCLfwHB#1`!ZWoNcv3-WCz0E15ueMy51Y7%@D%=oHw=I3uMQ}(NP*so?8 zv={Lkx_ptFs&wNd1FXx+U0@P_*2ZLj+&&<642jX#*~McpbzXUREEm%wuhcPz_8cda z3QhdU8eY$ADbru zz?NJz%`%su1{PVgH5&_W(67xw?AP0O#%s6t*6%TBzf|Iuo1H3W{b!>$P*!~hDbl$c z$xB8{7>2b0Q+IcWyd|GE`_Z=6;0FU()2>Mz=uVeA9#t&vP7OyO7JR?Cft`b2#`igw zouAj9lLRCUHQ0+W-XpI}2;D)RKR_$Le)a3k%vDVLKPvSrs%7>(-SFKUQIKuqo&T1fI_2GaanSZ+)zUW87+VQYzgKe z@RerfHxW{oj$^4(H|A;hXT8((x?a?|s@t27Dk93^Zj&F&Dct9ULgP1ps$( z9vo<8PlAvM**kN^MCc8f))iF{R(=x)oMevqfNuSc+2W08mfi;VnRC z@v>103J2{95pW<+a?dV#?WuVQj2k|i-oq7&0{#)>J*gw-IKw}_( ze%Ks-$j@QPkzb%Dp31^YDkp6%Oe$h2^4uvO`Qk+qpr9<(=!0Z5%vUW9Jk;Eb7m=b5 zwCf&$dlKh|3Z5{fF>R|ARSifb;+Hm>=0pux)Gv;PcS+~JqyLqJM2bATn7MmiI?a_f z5;wV`(NM!>V^=|37oz^B`K9w`6q$QMG*(l9_~`?NWzJ_nVmO%Y@(saKtP2GMa8hp!9>$rb2eRbx99a1GFK5d0tIxSWM~XRS*-APIP+F;JsefZH zO@XUPf@WjqKfo!Ai^BYBQQxPgxQdDE)VxLc^Pid8S4Y+dC27gtZS1+ETB z7Owh-hW5@K=UuD^_xus&J6iUCvcV!&zjn0;Fq z6-?djEMExY=j(`txq~5$^gqDmll{WdUK~&U^CIW2DyJa#P9jSsTqcQ0!G(YbO%N4@rwaW~Zb z(o)Xi147^fs@E?wD(LV(@8oA^19zsYV3GAW){*>3s&8{hMsuXZjL}dLj01*FKSt|P zs2OlsP(S*1GbIe(vGn7`l7)VVEUvAkmr5KB&YgPwQhEXA_VbPCdH*P_8QE#7$XC>*d1!w@;^9DR!U9Cc&n7ixlagb z*EU;fs;JUft8b}KTE(A!A3i^A>fO*54jd5>1Q%2rbKSV6l$tc5@2Oq!Jpf!{#xCl| zvWQm?-pnsG1+m{>LufV;sRRv>>7{qf;5L7Z%4Op;q3j}N^jb8tWgkj3o$9QR%gSd_ z+1;_)J3^}k!E=HMta|V1G?{%vLkEv`uQSgdu@`uAkb*uqLqt8EUajwCgg@E+%H#7l zzWwjj%X8ue=0k-=+yAzo$kbvDN}1>O*FyNNwF$PbBGHmrE&;wDhkaEYlsJ74|1n{X zhI-F~lShWnzTBvMUVEMX^4#)Y2LUpebFantYh{iiUQ0%3Gsi6ZckYkF!%u9aXT`uN z6~n_;GVBcT+CjnM&Y>n*E@h!W-2-DeH8t(%_1%cq!_nsfOQAy zW&Bk*NX+RVD0uDg0Vj73`fG^lXO|TUMvn+*uoEA?_y4*IYjah}omY~{=!=`3Ey!Av zHtffFYRDMLV12&rl-3x$Uhw@g7%_A-rHrNgpuk5NWBWolOjX17XeFr$j|iC-y%C4xa!UVKe&LYnE!AblaK zr5F)I7n|AH60Ccny{)`G2wIaB7{ipcE}#3y-`DpcuXq_W5lt63cw5R`F)s&gmV-!` zF8pvPpe8gE*Shz^D8I1qMb0(iI@^?f)N1fK-Gc`YT6gBDEG;cZBpqCXBSobzYRwtw{=>6}xsWEhCk z!`Xs9LaJN_z^^w{=2)71xJroKPejXgNZ=T6jyd?`Y_1S(3JO}I2Ha*bRti<4XKz^(>kKG)3!^4cgG85HX}{{uf{Z6< zB3(=PlY@f;17hag=%WD;hm^{!%qj;d-#)+o-Yg7q%i75HK_Sg$SJFM~OVU#4Yi!;h zlM1CQ?R=f;`ySU~Wop|F=rguy=Yr+nd;?>DPha6d?^3!xf-smaS%x_G&>6f;LPj$B z-RW-hsdxunH}G8yB{R)$KU8G2u&B4i0=K|rQkHX%)A(zgL8_R%=YXE%hdi{JcWSKT z1BT-(#>CqL0g4=g_>#qwsBq^-^R2KpO+}=t)L+%KeY~^mpMVhGhfU-XjX!|EdR(Lq zbl2N?h(2c>w(??;qO-kwrzEe5CR1CSD>8f$WY zZlsr&^-H-EzxXpa3oC^OwX6NdBrh$?z-UK%`bC^Udu5jgP~J|{0{kW2v%=*RZWQ`G zj|u|q$SG!cCzF}_j45Lw{W*c400(Sr`_>Q2{@P)1R4HI` zF-v#h+C9o|{RS`tz=ExYO24)ncf-&BIz{5Dr*bz(Hm>C$OlrvsYirD;I{jZc5{V;m zfRx99x@7~8&-lAXU)}!uwv?7AUl(|ttr#5jkI)g4w78XIDtW8Xt9V`IlEtk2!^@0d z%`B1cDAd0Bdx~;%W3TUI#oQKgVv=EI4ov z2Ns4r!ME|_z0=DC0oliXwVgvYH$=bEs^(cTBC_?1QxH+!6ha)?2sAVI_d9=!u3S58 z@oM?Aab<+EZ*6W1bJG$}&G6~k%Dcp8d?Qm!u)OP2U_Y)5bjOpdL!!pJl$bh0^-4ry zO&*S{%L3xXI73xx1YCgj2Iv6b!oG`SuUdY0z2`|@S`dHr* zi(dbZt+l~%zMy4`1G{s)*SVkuYWPyC;4j6fOlflsB14yieQ{; z2qyi5;GmGReM=?PNrE5n;63tuU6614e^4SO>E=6s*6*>!ba!iS&UQSK7EN_p#PcWh zB5NZyq&OS<+OqBS?gh4=Z<1~E?Pb@3n}aVh0prj_>V?~u%69Flb=CZQ%4T8I)yy=7 z-{?0UC{UEfm;eh0fs9W-|KjTJ?e8cf- zb_WK>_YE;24}$IjMW!ukgac_41CL|XqYpJM$iMB6*Ne`+M3-i2UDh%LL(4Mx8I1z(JKLeHaA&% zZ-y2UH}>>@Wd{F@iqFeaKHU5%p1{iAcKCLn>UzwVmoI$)DD*8vzEhE}OIA-(f8r(u zu21~b^jXUfpj6pJyyWCn$BN6E}WcLnT(=!@I4LZ1SFdCP-MH6S%l~FO= zx9cA6V`VI+9aPaG;yB~(f=ER-%~WTy#C7fS?#L5x$v0%mJ45WL^y~I-a;enNJgJNJ zefZ9$$4qCQhMKQvc9t(Fr~(Y{4U~WJQbq7C{m@WhK%`o?Jfw`e`%`o9p-enMy!Gth z!II0+S<7M0+|1wbj>B7ud5i#E__FoUy0)of>+dn;1}9VaOh z(YGbv(%$K3d)&qk5f1(PJMwwxI<*mLJL1Ny+g*G-VzlP{g;>RQCf zYT+N?g+G7ti^;1Cu{7WG03RB4%Z`+5B6d30adHbVoh>a-a3G*4e}H;Nu8yF2?Cwv- z$>sTK^Y)HG2LFWVS^T$mB7AUo!yqGb-(A~cd}DR&765TB4dCP;tmMWivd4eZgtQ_6 zsbVRAH;?T=^$ovT4>wz$!rw5f;4q=j(7YSbSem}_Jja_&}At`V95Ah#5%XJP57 z$dfhT625doyyCK^lH%DJQF2AH9Po3Q3l3if_ZjB4iq|jOaRAtZ>Bfz8NZ;Tf!|?tj znfxB>0eGqfv6bVnuYh|L58f)}?(JQ^O0P=<1LExMsBf3Eyo-8AXQLPJ4QczfM{m-E zx4d$0o09E-nr4b#R?^TQ?5g5tWl|R%pzMzeRZFlGGA+~nn|LgdvY)WXId?cUHKl3T z=l|Kc&dS018sy16{*)1TM%6$SS#=|X3C6jz(oGYwopvq}Z1OntU{4tkQDg9KXO(gd zUh}7-m&`c*Bh`cl>b;m|mCf;JVVCfG?$$hljZRN2Zxs}G2deb?%{-g%wL^3ZqSApb z3}}Pcv&b@Y)j2~JEw>zW-&yu^p@Dn9B+4cHks_{9_ne}mi%t&he-#A(EXNoEX@$AM zALC%Ilxu9Edcr(1cV#N8=t;X)GTAwZ&dp7JM>g~OgEdBX8MJYr-bOx5=?m3DX2i`| zZz)b!XqBup)WpI9xbUN+f*A#TKSNLKx@3EHBRz?w66UIeg{0^u!cqHhN1w*=qYI8z z4$J(R&)w&nR0ywkXfC|BDVy?E`$ZIGk8+^CmiaZj!f^DHcM}@sAw5uf#|SvqlarHV zJ?)2|3QJ3GLs)rR6yny&CKXr@u?)I~xKa>pga9+3@%Q%u+;ANz#>357;pyKSjb86P zxB+W-1VjNC^os^tUzNcCJMo7h%2VrMHJ7uArj6J;k{EjHG zs_{e|=#o{;PlMrfJ8@5PQ=hl^^@F*-#O*Y*xr}wyVnl4=A2acZ@y6v-ufwM5Wrr= z=!g9KGkgmG%#s5v1C5`9FVx{rq5~>E;iK*#S_t&ikS8TD_N-YX|6SEh7bwoUMiz2i zaC$UL*7zHaLDZ$H!V-zQqmSbx`%QXkDdr7ML`%vtCdnp#lupXF59K2Geg2%AftD*U zc?E;6rKT<_0cxpKRz%up!mMY1Tmeg&4-Wr^E_s&-8iaB8?T<4;h_c*iTn8t#4)}U) zXr^lTL2{Uf!}ZHWea+n zt1opNjm_BhPOk8`pL2J~{(EEpZ+C7+k_uE?m@xXYZYP%C@XiE90rArsSA`cE-rcCX z+2lP3HUX*uLbADVg*KWvL%rJy_7zzeGTl84v`OTA&j(APUtNj(oeOR{ND&Fqsadk{ zusnOxRp1(7K)J?WCFTJr+2?Fr2cIv8B`zxc+1QZdWy-a)zXyb-o_VXoh3_*(XfMY+ z1eD#k-3W55)XbL(?>nybQmKzqeR;F1syxE@ibg*YI zjxknaxAwfNN&FF8BHmqX6PKkwiYF(werfaqAU5qrW6eM!L$~a=fn*HEr|L>dqe}xr z?6Z46nPOnqP-x*>04)z=6}%PL61j3e04cJ(w<(EstkY))Fg*LNXvN`XDP4;Ae0=hp zOrcw6!RsOFwQa|*OvD|)ydSM=lrGwgx_k#uT{R1{%M7%TD;s%D9Y#p;=F~&TzcclR z+1bOrzK8nCsYZ6=Uf!k{1@Bu|Ei4?PV{i2BTW_U}P(w!(gFIWVLf*1Rj1RrwMkRb! zNPc7X-F;WF(d8b0TJG$3rSS87lZtMDRRfspQ5t`}t<3uV34mW-z8r3%PS)eq1>7u* z^MjsT(V((M%a;*GAQpXy677NYpPd|%$KHrAIbmyEn+pM+DEQz(xN7Ke-13Xww(yEc zv^I*}wlMm?UjNq*=au=11(7?gfD=j9`+>g*7kbUX|o&OnU=L3>3-1!%%(uYdmJB6rKF&X(C* zkX75Inpv` zQ#KzDe89(a5Onlf;NRsl&9tN>Al|(S%-i2J<+ET&zx9q$$6mGuUZ3XEUE4;%3Ydzy zVPfeQxLu~_#uP-jiNV;TMzet+P;M=j7-Zga7y;lCclRCnN5u_K_&*gM;oWBk34}*+ zd5n~C6v$|F?_l-dL=8CYqT{iOkfUYGe+6?#KWbR!RhaT*mkOHZglI2swng~Z1ZPRm zQ8tW`TOriXX_hO=5_8q}dth;>Sf~-zZ7^d%LT}9^5$ZbnEasHfR(N*|5@wHuyCbCLuY>z{mKSnVFi(k@u#k zoW-~Uw;~MQf6&4f#EbSydo-I@py3(9VaIHsw-txQq}Ifmng6y8TarC^W~C+2}tW; zhGEo|VjI1$jiA7RG70~72GOKnr&)oH=cOXX}SrpbE3*UqRYgD9oMsi|ClfB*iYBT>qJBH(^zbij}lw8t90 z7-rqljBaW-8yFdF)WDLx2sGIPw=BjLZ~C-uU(+~n($GVSfU=FSwYAV8AHWNd8$X91 z$^>r}0-+EyLJ&f<7OTQ6b;i;Fe$sz+?N#@gok|-MqQnukp$noQ(I7W&IxXP=BlW{G zjng(Vm&VYpP=&kJdk`7cgma5`NGe_0UKH;!OQw9Tw&Y=!rX#Ymdhw4oQ51GSq8Z39 zhaW*nXqZ*4C7Z5+-TnVB-W2^yC<3@l`(F87KR-WB3lba5(BeO1@h6)z%6hcT&8ppp zmlY{Na-DfT?R|ZHbPtFJ0bzF8xI5$(Z4NNRDF3B_mW6^dbjY*)-w5gA-6gxbGQHPx zmv}UO5(v6Fx7S(rS}E)XNadw<(f$1 zVnFoD)8xhLMHi~rRnJvwhD?y(pP=856(A2B*egT~eolO*q!%6MYV4MX9}7QPbC24F z6h~c2p4)L^WE3U0O64I`2Yqeh-@n)X0TNCXW+3YJqxoQaDo-u6%|6YC6%vXyzKp<4 z84d4XR{=HH>87N|%AM4k-!ylwqH8u|{bRVW$Sez37m`F&ZV!cTrHjbr?IYYiul$$2 z8345TV?F@_d@?UpmXU9Oh5YbCUwuBXCuR0D&as8>S4H$ecju|qtEjtaBUgd3aB&{_ zJZ%5g&(PI^nnxc5A*_gQs)v+Rbrm2ZX6P0%BCo4JBr+LnUKW)!c_WvRQ-c;Qdtcm@ z5g?D%f>fp(xhCkEN-dAOqe@Iuvw8l35&9i-!fXE+;;(?nGb@`YT!iMOh9?q0vKGc? zP8xg^T_eDeKgUu2>&g|(DT2k2bRFd=GNZ7wbdiT zDV7!u1#D=Mlb(tq2Fa^oV{qc8^YqXN1*K<^{jWXAYYJ@sB9|Sz`0H54Yz#TJ zxc#>GMcwlK@aDqD(Esua)EVW$2|qi*;(&wH0-Zhw(2l|n#he@4A*F>&!Ps5xe%RXpNE6m%1X164(Z;%z0a?{v`>0oB5?=k_c8U(y*utW(8c6rgypNB-(`A-Heb7Q1G^{?H!qnV@CnMe zbjTcr%1s&+Y0?HbLt5qi>@+h8GEGxr44ssVS>?{qZ4kQGUKGFJmPo z$lk#0lT9GNlTw|WxS0wmmlC~eyE{jz4ow~xzuP!xElc z#<@d4ti?I%7p?-sDK#|}*d_w7+*wpnK|w)QS&m7%A&c(lhEgc>nb%XPKIgGjhv+oo zgGUTBe9qF_Z4P8Q7_bs(<~jyXaI~t?lA^YN?mUY6W&bbM{#^-|*L`PbP>ZN0C+&2? zBH7$&Ahg|A*F&py-r~}S-}KrBccyEuLnriL4SZCGsvUOplls?U)o%j^9>9G54MM5H zF~vk|i^O#tsDez9<=q34^|&o%C6fn!zb3shHT@6^}~nXDDR4RFKG2M4>tM+yRjWD?$ivnAy21&+%4TKEK5<7@ za5&^Xvx#SyuHU;C{d+i)ByM@~_wmutaG<=;J5G6;BwR z06|ZgIoQ0hu}GTkET--UhXZL}`?ssh(&~9XLC=>jY)G z&6x(QV7BaqMJ84cR-rfM!>G&~c2Db}588!qv+70PTPywNZ_xNuBP|>Q9 z3Zq#(qVPu27!c*0DSADA9y8L3$z2kT+1c%+K(%-Rd(EQt0BJ!fI2P zy4*v7juZIyS@c@`7^Swuq%gZxBO(q^88VF zLC|!Utv8{Sf-CiQ2kw4qOH0A)w2vD>*#;=rjTlRUrW?1pqK@NRtsnb#Kfv$jwiZIw zQ_O+w#mt^dIf&P2*y&8s`EJoS*qP3h7$Ab9qdGlm)f`m#ccnUZ?EMb+`0o$gO0i|> zl|#4yKW0ML+g6GH)5B^*Y%R9wHn8KU`F6t0i>#=d<@7*I<2*i^cQ~Ml$A@HVKj^Ix zWlF6{Gf+1f$AiH+`_%F&N(|65rsx^2REZAsBGIt5!!RqGj4ko~h|*W*Uo}qcdj-yZ z2|UU2+UDulzH#(tRec}?ypkHXn-l){&~i7Xv@25_w{;?>F5Co zFP9a(3&lQk`Bs;2ue1Er(0w%_1J=tLw}%52khFrim<`&CC#65BmPK zbH+R_di(A_WBNR>5h}zT^6+4RBt48frTaDOz?^;28t3^?JZ;GaEs9B>n zwKwncd;c)5E0lXi4 zq=KyOyWHLuyF{y1Pwa`mce@B-=;QH5Rn^?YEEOmOrb0?1OC1BFF@%dLBz-wjChd)M zQxP&`6rxCwWL6gKI7&Ew(2>pD z)!dkjlNU9=NU&|3P*L%drskR_^L}jyt*cVIVj)4n1evqeAUH|DLmnZg`MDzfDz}{( zG1XF!K}};~#-ZVrQt4 z*`M1RG#Hgd)!&zvDkj6sy}cjKpFE<7Ad*#R4tSAX8XS`PD1Pbl=g%+d49z_~<6u#C zhz(+ay)UtjOS7~$3!Yi$6%AGb)1oKh zB;?i)D%5oNlKEP4Xq-vNO{z%LQj*zqeC|!4)BB}<4VUfTp10KS9S6#44K|vP@VX<< z?{Mokei5+vYNiOMhL|clU0yV1Cvnc~#V3Ni76jAH*0yV&{UEwX^OFda!Wj3HH{E(- z-2+NNavJ!8u^&v#78663%B$mjbTI!D6tMhw{#gpFaO!Qc6_pZOuiR}aBH0e$!T2># z|8UUx@4x>Rn)u{EYIp@S1Z$55c5K!uLNspOvzaKcWB)s~IEu#3rYaUHt;=3N`!s*fWD!odhuP*OdLCD%ne$w^- zyd#UDXu7qg&Y^0$%jyU!QiJU3`g)}Xe6JUyu43=W-5PlD0%YyP_wXVBj>j7D>cAgV zJLZVSub=nKgzY^68Z4-&`;{v z>*TXzjGA0JR=>V?fGG+4C{(rpfvOOp|A9jjjc4a`k#ba-wyQ(J!_3vH^*>C#HJhfu z;n>4JOq5S-d!8*9+(d}P^#jX6pzaq(a!0Gw#=>HtjU0=xEQJtEYBG29xNe$WWw^B= z(fcv8M3zp&)^G15m4;%orVQ@Pm*LmPH;*EVBW-Hm6aC(PK57%n4?-prjU9Z3$4pHb z*w@it`1z@!EA_F1fBU$!Z6Gm<(TcLA+H9aZO2q=K)iL*y5jH_VCshj{X5vH)qO;wJ=6m3}1U^o)$j!=U4SKQJ?hr84E!Z zq|UEy=Y{ee*^mwMer_OeAqBm>f6sgkjFEK?F3kCo{WLn9CTBC}zfaCoefLG2=1OE3 zU98TabxNU1wTjs)Glef{%0|A8RJVMIm4IrykzStMEEWvk%-@#s*^#bb5XaahTiwqZ zNnDo6U?;*A6|p7?%A+CRVI{mLW+$?eP*qdih)lNGYB=%v6aH{&e*Q5jhj<=EgVV?F z>mC)lm8sFzzOBsfS(1BrTAe73@e{&KS*jGrl<&?;GaemA zlQYeqOwP_K{`7e8;6Y}7zO|oUgj1Pvg>L7Mr`IPzC(iSba_94bN?f#r8!`o=sFt5V zL?x!I%G!-}Z-1>`_o{IGc1u8zAr2QNoG_aqb4%R(KeQ-`g85eQSW zvz-V2YQrT)eE9O8D&HYv2f#sw^YPWRw5XNME5-@WU3W~cc}Rds?skbTFDwL$Mpc*g zP9A)9Js{SCR@cvm`3ge^|~Lk7KEczfps4=D(HbCfoZD(cXI0O zB89P1zA{(srOd-SiqxP&)>_CgLf=rl>x^u5YHF_Uz`uywN|L#@eI7VlQ&VE;>FKu5 z8MbzJ{xtC+lg+Y;?Xm^jjA^pmb}psXvcK)jF#{Lg%dcQ!yqh0f#4o1>0T8Iv;yzLd zN^B)qXv8ZZBhlS{a}snYZ+?JfM}Y5qN62f@B_>)wQlW~z#WPr=8s020 z@H(PzIU;`i*QM5d)|CdG_!q2@_qmMjRG`~OhU8%#p2l7LN?LS(S6BA}3Odb#aphKm zrG`9~Q_n-MZ?O&7rB(?s$Cc~3OD(ir>l3_ir3KhDgQ*UV$si&u>Rd@tYv}_&q zsQpzA0q|X85ojadPq(DnlbKMv>`bg8L@@>NxqoAW*Bq+-QBTbG5QM{0$M%;;%YB-+ zM9{mQAKC%KuNzoku`Cr40G`C5(sJDTP3rU{jK!2G}(wO_Wg2uh+HF!%5BACA1l*>5h!^Pu$Pw?g5ULq3C#$Sn^r93D7<$Kj`Q^ITysRFS-} zBj3D=4ak*jL6U@pZ&Pm)$M9Rn?eX0c?zCty37=i|hjLOJuL>UC{-16*3@L!1v)-Ri z8@7fh7EW(d_xn)0USImmowS_@Fej{gHE(TiPe|Dc(Z}(lQY`!9UAHC$FD@K`v1^wt z$k^25+LI;pCNnGR&)T9SnY&ObFDC*eOK`7G=A^cRxNTg9eqtzVu6jN@SP`umSp@Q4 zrU|Fc#!_RbD=QrUf>Upa-z9$$>;&Z|o%!<`hfButyx;xv=234*s5!L6PPKiW1I&>O zTbZo3ygbynK{QnzY}Jm{w6>yhVPW~ojLHC{#xonsfhOk~QJp-3Ym{q8e*YVs9Ln+h zvqLwi(zmp|)Y0sky0Y0^J;*Q_=Jvv|8w@+}$WE9_UbWy5?~d-JAvNj3;lp+*c3C9` z(YyDc*eI-BCMIfoG9vfK7kJBFCJdRF)x%G&8qRLMpjD--iB9|YaT*{F`) zd5*^?CxbPyZjB><|BA0@N1aIRgJQ@I{`>e*(9Kv*#_H-9@2Fl(KT8nfbalDjlaUd` zI64YfQJ#$%(Z1~HXNY^0ASpSvvj8n~L{saknYN9~qk19$#RNVv4bF83o1XK5Tk|2QNHSkdb3{@t! zccM53{`9GKRq7+KuSXM!X#L>#8Frx~;^E<8+W1Nf11=nv)jE1JKC&oN4I68e(P^eY z71pSN-~1y=!E*I+{-Q0jwTh!)2og3Tn?&PUUg7^L(lq8|`B%ac6pbF&-PZi(&KS{Y z*6~iVtC}epR*K)I=@&3akKu8p(c+%W#2~Y+p-t}{rzY<)5JnX@l#12M@SUCj%O$PX zVU6Yhw1on@n9m}t&hQ@f8w5SMe-K!(RF}tGg)V7DQY?r&8KEu<0(Y~5i&}KirYzy- z@9pt7M{ig%WR6aYeLMy|Xuf-!L9DWJ6|f=f`=+0i42D|rUqO-x=XNHW5wacEbIbr> zfiLcM@v}yUw&?J{mi9o3bhg<_6-I3GG+}Jo!Rz`e_sPh}{`-%y*yIyODIg&Pg@i(} z_HX}l#!u~<*%NQiN*&jGaf?$dRllSnUc)};5w!r=08+4sTl!K8>_%?B9IsNF3V@__ z)@6>&rD>Zp_^Jcs`8KEEYU=T4$IvnVzqLK)VdhYk9wPXAJ9;Q)@SS9~!Y_w{zf5zy zrD1T6fBp#L;WTcvq7K3X)%ycw?hg!^zuul-{*gsXRG5HU zzOS!!Q2qs;;@0SP+WM*SgUQiQO)O#<)E&tmOC{I&SuLz+!G~E6v~eW<@fQM_{JFh7 zL4t8%@;R=Em55QyEzGc0DcK6RDNy2AC5~Uee%UshfV!zr=v&A}ZHqwHeEb`AE#7oZ zv?KeB6~Nh9!VZ0x%SeH^HW9~LYB9mbiG>{cpQ`E&V`%u!I#8242^^|{2& zR(s0F^#}8(%?$rl%@s}ITz4+T!Zasz^Im4~74nK_+p$5y&4W~uIYrfPqtJVI3;1LC zJ>n245x2TP|g;F9`a;7)Iz6uUEDGrYtDW3$;5Kf zK6wyK@Eoj}8KF`XC{32-rL|v?Y=6EXtSh|QhcQov-A@#Vm+TsNjATcQ4oG~Fqf*wo z{!o+%Q|E>-+Uw|~zT^b!C~Fa!`tIZR|Mcgd#*=OM-7);AcQ%t!U>R^EUYgwfF-OFe z^j?YD=|sdF5)v`(Mg+EEWjpaIl4(1AfbW?yJQ78jbyCg#)b zTz0l!7OaRAoN>uq2+5%8jF$h$;XFyoae~wVmWHE`@`J89^P3MX)aM=>+Hwgk!U~OW zX7t2>ii}dQc_c^8E$8E?&bdk|r==-O-tRT;5hofSwFv63r`}h0EV$((|JmeIF)!)+ zUH7*u&~&>A7O)FrPS!ftlPCS$X{6BX7a|CNK$bkxf(kNHM0K?&o8ll9kQm!0^=#Ow zY+@NRD^mMA!rC6E^ieNoyfT(MdUD!PXpQ`AP3C%*V0LQEaVT>=`ey3)Z!5&s-h#y3 zx64aOxeh|xHR8#WCxAFw^|>4fc=)xobrcZQ(QXmG+#p!J<3W{oTS{CUd3}Auy2o#y zi>@yVH#w%I3f#-qEHwSqdy-Mubv5*p!)B>FGB41OlGHHsjt_)4fr0tqXNm~pyF_tH zDRPB?%4R>j8cSp+KYpI930WA!^{)%9vAbw7oPyF1zPy$3{>dE4y_AdC@8weP7& zL;oap9I(AaCZ~$V%MMz1RaDReRt_MkH|pqrR`6o&XfV{*1Esod`bLH?2nVkvhb=;q zBCvMAzs#L7JV@zZqQ>)(EJCUZfzm?L_1E)2NLBXdvZz7|C9DvP0>|u^tQP!h2Qrrl zH+Z)AdFsO1o!ey^1%I!0Z*BoMY$>JSl1#}mW2rx(w#6+ZCc~s;>aDAvUq()Yo&Y%1 z&@p<#Hf;AoK}&pnI?SlaBg&%sMW%j@)NC9Hh9=WT}f@ z`7o;l%H(~;KO#ZidRfke0K6o8+KPET`iyTN z;aY@cWkQ+d&)I6hs!q@uk6L$;KKBBNG(hgb#N91ubHlA&@5#wY1uY0;f1!3ojsF%@ zM@Of}HMdd?gM?sO_J@YI8r(DT99J=X!!;9iGxtvHvsW(u2kU&qzd-l z#Zrarz3X|GYiib=G<>v4ctn8#Mr=9~a10vs2y4t9$VKRIP5Dm;2-&?wQ5(tq$Sx{2 zB4qMI`T@ypTl*^UQUj%QtO^fczPn$eoPahtRShw4VXe)lxNud4YVj#JTnTc>MO0xZ7CyZ1rT9r1 ziUG8Vn6JkpJR)idiqg?ay(~KHGns4B+o$}!d-P9SAw9sw!Igw3Bjw%YAIWqW%0yy|>ro@2S2T@VETd2pF=_>qs2%ei|Fa4Dl!{ zt_gJ9$5F>``BL(g6AQEjr)2R@KaKAktJL!C*oN7x>6YQX%4e{Gv-0vdqd5QPJ3-cH3kU>| zoF53K)9ZkM_^EoYyJpYd`TH)fh5qvjqA@0FqTBCT0NGQ&%}SRBO9KcbhT|cgUjUV2 zUl(1qIp3BleVSyNB;q`0<@`qC(>vbAXKO=0pOj|w^hA(j&;z?!7pZX6y-mbv&Ze`my}ob`B!xHcvo|e)ZbsYH*sf*oxzM5dCAr6T^`KBNYw2 z6b%m<9cTKUiL2okiBVXLlY%uq`nU!`eh*^>Yogy66ouNn&Fy72?~KeOb`a*e-7)_aMCZkB6) zn!$prbzsk7NMDuvg2P`u9r8AG(`w5!gk(heM;S!+uBc^B++{+o4c=KMggRx&b(Uy* zBt|c!y)r3mo#%?;lmk6@_z=LF?d|QEd7sr}()}9BtP{Z7AyoX_csBx`Q4$(EHlGQd!-fpdW6l{hk3L7Hf$;Tlj^ZnUR3Q%S0=a}Ys(zj2jMP(mVRM9sHV zI^MFjwl>b%fIE8Vh=EX{hXZ6G1(n!B-rdWN)#bsI%b`z~gj{jYQ|tf{eY z^3S;9b<7Tq9j|wGuk+pCj0v`X9mo?F@O&y4J0(azFdKD=w34Y5sM}WE z{T#@Q3FU;%#;eN(Rt*^y^#aM!k+7^-DN1ktTOTyJSv9%zMxT?AFooShk3Lbfd6+P? zzHZmm!SU~INh%?*_I2U~7dc}out$Jt-|EHCU#}wMqRat7amKTMN8BUA zVJ&RMU7_z2;qZ}zj%nr(gl#v6?Fa84Qup64-m_)ruqkiCSZ4tMrdx@QXOfa@eICxr zfvoK|dWd0bmH>`W^tOIUg;kJq0smoAN4WdyyZ+GK4~Be;6eM4ZsX4q=sFcKlj=E;> zEWk5~HmA?TB(a<|v>knvJQxwmZC{07_%$D%-~E;=H5^4-rb*Wc%(Lat_QRK8B|Z(Q zBVhzeSxeXJ%!%k-|0VPX$9!{h{l-f(QowiIliC^ zK?;mw3NLTA*mZJc$vq(r&2rtdU$tW{SLdFBJSw$e2qYB-hNMLpbKK)IX+j8OC|cPm zF)D+IqFEcZVUOO6U?11s4-&p#1me^I$t56ApB+iYP9FK)t`!mjW8{5jrR{j{hh(aj zj$C%#Db?l)3KD+kcpfT^OkYkPsE&9TR)V~9X9zR&wle+hd6q_ioahSABPHr4a|Pm)%DfiY$c0yc?Fos8-dXV$SAd$LDK2h(^dx2+nMlZET#Hz znttj!CGy?me#-=zArJTTx;kOzz}@DvN{xVQQFWeIj83~w-|g$lb$KPd_t>ur6C4dd zs6t)bLK6ptuM~_2puUb2Uyoj94u#_%F}scXQW?GH=M0dUS$M#0dGb4WMb{zK0GtS zm}Y+uA`1;u8{kx*kk!)FzK={#f(f`%6_Uy(b19g6=tB{&$!%$oIesufq`OV zTjy@MMI5p@HXYcHJ{?%C(@iCY zA2lm~P9V~P&NXhb-jP?6OwPAGRnHaWdy2PkwM(k|=}EjpHSJ0j-Ssl#S+P3gyg~Y( z7Xr1EwaVu7@GFzHuD)}wQtkICW%0F*ZJosl(sw%gWv*F7Cmr1Xjy%#u zmriK%d*sB$p#b1%@cs?hiEhUuc5?^$EF9oF(ic-V1GQt)F|o9|Qe(3?EPG9?MIm4s z!|bGoEHfKV|Jx+a$!SnT!FFMwN>3ZHfanA>Ard)6#%(tfa6a#;hIBM$0cU zJ5=`Sw<92L;&oWTce_|W7*>41(WhIR({r`o%wJ!hJW$>V+Ps?i>J#eKjH=cz0sef- zzIuM{jg8X-)KAf-FJYS$Sy@@7%a8$p$wyOb%gO@3bJIoViut7T?+XaW%+4A=uvx8m zPzis^WNjXpe|0Q9X6#Ra*2>Bzl=w5u}pqXcNh^52g+ zGe*XoV0QSlmE<=R2)Om*Vjl>b=Gk19^UA7GXzs)w>O_%?K9i1(-%1qfxireuttJWl z(c@1;KjV8T{X@8i(4XP=6nptn`8{ZZB(VmcgwU0L;-pA>1$#q|=r7yuj>}xWx>3FC zbH1u)q`wK7VPfp(N})+S6&xP6Fy@GM z|KMT#c#SxsSQLPgMk6r~v(-|^j0*d3`%=|veHiGDYAJiXW$`9`ww{~_IPgj&aEXL$ zLwKU(_oSxsBpH_HU6p~upDNE;jMqc~$V{NnL8%6FE+m4=qm62>2C8OCn= zBj@e*)>6}5IDX-Hd%DMU#4qsD@m*jC%hevsflk5=tXD1x@zUpfy=>ewt}*LD3>lf^ zX*@}z@3#2->4ipZV|BPqW@dWS>RIZrB9Q9UFKO~ZvhuS4I3ez@UZ*5}>*PosVZKwP z2PsK}*+oC6mRp479~Npe_7A=u!@l43(dD%Uqec(fEp@8&sN~dI^u@EQIEX~!N8erM zJ;>W#4>?UUy+RvsL(Voef-t?kiY2LE4DoB(sRY4SsSZb;R8Q5R|9YGBLlVh3XUq8C=Xbv#^_+Zo~1wIVe_p+>~7tR5IPNH~E#oka} z3_=L+lJ;mRRO?&V*l@KAqQkW-6wfM`=lsCK3;AO{F#wV>J+>5meml3{^yirh34 z%bBYW1}AJ&g|f7%`)k}J5~{Q-)o#;_F%&D&EB3Rc@Y>O*Sci1FoEp1cv`Oc!Px+iJ zgzgq;SL|m5ogwXi@={)%%5z6|MbSR-XkwDSSx!;Y82en~c8B0u{Wb=X;(z5}S|-D| z0Etmcdt#g2C%ek}xEmW)wedkkdjAilPG#!p{;RgGItLMb0|Vm1&-K-v-xq0C$4t!t zybhf2t%0|ljWmFY5^ai+T(Bz>N|aDJ!2yvIH~7|W;Q09YRiMmn>&3MK!$7Y&TBlm= z2@5JU*`_w$E^9Jfv38=w$b}!A$4&Zg2H+K%a60ac=*jxtNrnTGn@iKcS6gkLCd{4R zyxiK^aXa`+&buO5=NoF-uQxe0^+)4+Sp(FaXnIj+x{{>KyfSukIVR@2JfI*pq-cr8 zBk`%Bp?96;T6*6t1HsKt`?S*HmnFz9p)r553hv8??WZwtCaIxsb9{ggV&53O>jN;k zhOfR?^s}-NISwK`5HeuSEQ%qj|nYIdq zApH>1UjM;PTLq}Hm0j{{`nxRiCrN_N4S=%)xVIGTk2C*?|0hbQGPVS+p)uhg|JY^V z$)^@IC~?d7`v%wj<@q{~9 z0_ko-`?c_QHMhOR1IeIu8kToA7go?6`C0m*E`Y@-);@OxmY~9J8Cf-YAgT+m;ba^YrrX z8%faVOo~R$y!66eKg()k%-D*2W&J3?zlN1FTqAtGtoiPI6|HxRRVw~gp;NXO5L6`D z=)V^e^m3KeS-82F+VA3`@lGi&R+*y)F-p>`#9>6RUZVi)?#X(ob#42%yKlANY1|pZ zw0@&z``$w(Z#cEWlBZn<92L^7QDHSkQ8jP|MJ>u88)LkHXQ*gYWJ+exLHqTzi1V8t z!c6F&lfUOIHjlY>eNLqq8NZzMJiZR8t0QL)+7bw(0tjnOTlM=QJ7CjSgukQ^dh%Bb zd3g)YHpkqo?08tj;AzMdA~agm?->4AJ%3q7>Ie-V?s40aPXf9%(Ks3<%OYTDyep(Y zj+U4AKXmVX$Y(A=F=`W&m$&U7SxAtlzJtO)zDqr5<@QYGT;;PPgW_!-A=O^?dlKGj z_hCSIh^-(p4_o#7II}! z!8~$hdE?wxk}H}6kR=2Jy%0HRz2Zkh8*jqhtfW4+*EtS7Q3`lZ@NA}susf^g?7*`k zwIT-MkimfjN3Bn&Kl)tSSeRYzs*xg9AK)WJ!lFzGT^R(aIREVpvaT99kPApiNC3qZ zMwvi=L3rZ6yUfi&CN@e?03><7R;>HP+K9mU&wawn+dJdv$g|3{xo>4S!~F>=QzC47 z`?+6pGb=0D-QLpRZx7>h_Ne`*qH@%_I2~ZN*T5x~voYquR0>)lML2-s)=u@*{CD3Q zF}PE%hRhbZi*M=1ajSlNMMsC$*|*6nOtEouo8tWB=l6|)-tg-|=&A;MB`w4BZ|_6X zT%%iOzR@KI^3!`lhDJKixwox3(A= z7&gC5lQgK1_iq7u0T z0@0qPzO`^t~3h3$0Rm`Kbe`_M>DjYJ8%m_K?_Ms#7=^qdBn zOod?!q|)Smu;$fl+l0Y7G`dLcEv?e2JJG+ygB4V%hyd~d(>L*n{$HC!h7$3WbOaRfC1h&m-#Wzk?4+Y zI3md^WoFffStm}M!&$9$?t@7se)Gir+MMk%udu~bQzIeO-qUawG2h>3m>NB{kFy@3ZP`k(8I-Bp=@l_&m-&#pr{2TG0j zX!`~7S5cB0;vk^u7Jhb5shD~@^m+X@(Cjg%Dzg7w=(nuy0icAQ^K91__&M$40vvCT zt6bY}*vZ~}#av35ysN^*jwbifc(yttP;m)daCaI1`^|Ql$?KnzsmzaWNivs&8$&DY zns!2;r?GmzWc+3m;}=SPHK9+90OfA`7yc{}%LAMuV}fh0QKG)MTiC{rA0^t=`marw zy28m23;>NbcXhp=dU@ApX>U36l@>&}{VgOMNQv`aau)~=$_(XEyBLr4cTn;eAV_36A=@%#>uxEba~Zv5D?u<1B}kqN)4&r zR|V(vGH0ijGk&|Rl1FuAKzdoM$(@M3|8da2w2Hx~(JeeQlp=6JhnMbALf_0>6RJ_W z?__^!Na9PGHqX+9bd^MjF7ICqCQ9cSiuOBVRIHS$v4Smr!ecwJqutBpe7fHV^xmA_ zHrw|rZs1`58+O&N<=@Es)v9Td>-L7Q|NQC_%Z)o@Sr~R>X72ajk#&3ob@H?x0(fD) ztiZ_3vcRrf&(?Yx4fAyh-_wxj<-6eSfg+iu{$ zJpW~R7A*RcJHWk7+Wa5M{}ijPk@Is-P;ZV~5+9WdZWz zd&3BdsPe)MAuw%;j}Ws(jb2gb-Xntm5z<*IG^6%mU zb8Lm6p#9((He3;VnB1E;2dE|2S6=h7*BN^kE=hoa zWi)3ryv!EVA|!9fn>LP!L!ewEy8UI3rvjX*rk=mN|4yOQ2Iyg0)cqJKguBF>;@AN#hp;6P_%Cg|qMfBmJYcy5*7 zzfKY$k_SS4U{~<}lhTex-iV3kbl-K0cuCV8lS+9)3niv}Ul&i5Q=dw2ro@S7rx)Nt zXQ#dI#WXkdD1zvQ>yh}d4zeVb5I8GXj`t@i#+)Cz+$ackf1GQbHCgYT`LLLK{yV?0 zaPRfCbY*2_#NV)nmX)VQZT?xUtx~{{>z}H9bGG=fT{KJKdE`=yF8Sr9MI*;gyCw{d z+oPH3Tdr8RUH04Et-pSy`)FHl%FyOx^%TN>6n-Dr#FoqNbpA5l4E^S9t-p9g*P1Y? zk3u_L7CXi%Bi=Cevmt4W2!JihocvF_q6bK%WvTdOWX6EjA0V$5a^^3IuL27qn0+JP z6a>WE*8wHMFVjpww>w&s!aJr9DaRNA#l-KDr067l65QBwoE2u=nJdm}2@8&ki@S^z z-mo&L%Adc@jY=8x+HHXZcycajNFuRW4Je@NnIO3ja%HS-Y#jXdje>!J!GD>9MOMpg z|9b93dL-@1D^a0!V!*q|mG-2^^B??l3GDbVUl5CliK?4mk1rlP&TGCnyD{Z8dU>#G Tf{X?}%5V#*sIE{YXBP5*qlsZl^cKw3Z==@4m<2I+42 zp7;BMSg>Zzy?4%Y&fdR$B3`M=KO~?bxOeZ~Lxh5i2KcE3z7+6qz;_$}QHFc>IKLxg zB(*#;JAbUlem!$tzwmS_hQ8GLoWbPztM3D|B7|8Z5k8f?QDGM=P$Ph8mzwqDCzrMH zPTK>HwE@mkI&O+nk}kzciykfRB<2K0HXcKxdFZ7ZQrqz2m#wkLxU5D2EL2!n{L^qu zS(%jRXVvrUy^C!5zb$PS3%8g4DoU#alnZsiwt8Pn%a4|#T2{(5Kc}W;w7Wsej9Vld zXBPM4^C1tI2Xn;5y<8*ra625MIg|nXN`hYHB*KJ>+nJ(NioU#_5xQ%z3qdL#pkIGewQUIoOXsh4pN*n9!Uul zvz9KyF(!$Im9@3U{_IDW>G$?r3ti3_ZQN!y#0XR(3=s#RHk|mP)tjiuO!VZ=huf%5b^<~ui#eH^4-1~_Rv%K-?4)ZVs_7aQ{$%rMu9LZ!M%Yrj# zTqi*#cWxv>#u{uI5D)+lfFoe)LF0&j_09h9%i5U}jFJ0j zR)m)quy+w~FDN{Xk5o27C_KuA%A%18zj^tk_4+Di?i74u`?ah(>qj)--$ zM&b9DNr^YT>^`@E!2O?VYb@DYd7Ce@x8k|hgnTa{XxqOHVj)t2QexfH|7c!w881(d zN6}5wy7x&o3LGpg_U*GqHpqqAaJ{*AuwY6Pp;gP*TkE?xD6RaCP@B4CK$ZyAft zzBM$+6>3=emi!tV6#T53{dYuOJYvt&=d5vIdHl68^Ft<>tR#dPrYogD=9C^zq&!0^fuZ_^q^{WDml_S|vt%A8-O%96t5gE@@Y--XWy{p1zVZuwf z{^#=k=|&A6@qV@P)jF1WM$E=N2b1Qpi@2P8nh$GgYwKM$$=U-47MbKzv(ij!>-$0; zIM7Fsv8v65Bn{=hqiOOBgA-gFo5xmG%`C0OFjG)c>i%fzSsEo%hvq+~F-?tw;TIR@ z!3nZdaaG3PiHZfbk?U77ruXoADwQkV$c*tTkF{|>Y@`1)w)q$Leq>o*I4`A<*RAx_ zinRB}XYs50<3i&bf;nz(Ckl0FMb!j`q=}{FBNa`AS)J1=!E^grdI!A~jt4`|^-ino zwf1vne)h@v-9$^+VyvoAd2I-V!~CbISqpRDs0h7BB;16U+7r6E`btj*u0w0;UJEBabqP9Dk->-P_e+&Z|so?AG$ z%DEGD(m@JEcrJ#lzk;N7{l;>xsuDRK39Iv4W@))x9s62pPhUclUbZO286t(WuMIOz zUnzwqXeKDDsF?;!<+m33O5aNRmrR?~I zOXK$$Llzd6FB4lZMBDG*5DbhKp9^M@A!(AzSCm-yMK0V&Y|DGwRCuy z<9)=`$mH=5{d{WvTbNU8(w-Zb#ItIgum2tv_W2wp#Qyc96~7*dtvK||gLj?zHq3F> z`ykCKWE#g-LEXzeCsYh!9BSGZAwPMU&dyZwvW)UuLyg>LVR{t}=#2SWuXKLIEB+@u z$X5x8MlJG?P6br|=^#;-YFJT`?VpJWTLFEnX0-~fpEXbN;4sAKfi+RE31p3>xR@78 z6#t0&X-@lZS1d^h%>rV(1mf-7yKev6p-m(2SUR7(D`izx$Mb!4@VFat$ywPz@A7Q8 zp|#?auYVFIZRl;gbI^^Ay43@@nX@E`k;^UjDDWPCJ zmC<={h05TvO$C%pI{NpPHosx}uI#s~0^8mXLNX9pE$x9zZ?>x^^pTajy^eNvGhLNV;Dh)e)Ip4i5@L*C5*b=; zxuUzhI(AQ8da{lgay?%1dfzwJnK*lSvLgTb^WAaFunqsdZ_bf}!QZuk43|b<3t34` z2pNy5y?wHMZQq>xLT3aytLN>7F$pW%`cTW@7A5C?CznrP(I%T>5?R^Sh;8lE>^vhO zlS_MnIFtm3p;Iaijyw=e(F*v8OFX*y9ZZZb#a(?|E&bQmB4F;gHO8!adSr*et!hYR z?n~ZN;Tz_EXgKlBiK5etRuXdHo1-uh08#h3yFG0-J}BxIOQ03=Nfo~wO_2z&Zocz% z%XlVscQFKp=>$AQaU-;KWd(*y47C^@`XQ?hkx~CUyeR$qtu~TQJaDUlY0dU$tp7Fn zsh$e7+mahvS=E@q^9mI#3PpABIA&I8eQXW5{WJu6Q>ZCPx31XS>@ zt7*iUaT8B2A}AbY=?7C}Y$%f^a76K_H`vohj-K<~b>CfxH*<0MF3?_HUL1*BPUe5t zQ)#{!aQOD)NAJ4$*$XU56IaWaq;YK-T`RBR_>*BYa;rfI`4Oh*vp%z6Y3fJY&JACA z(4ig-i^zQG8kygXJm4A4Tlm zIZaYoPA;+Z^)n`GR2s)5Ay^i=k|?YtAt|V*4Ma9B$doFavA|YJETx@S+0HvaLUE8+ zK6Be!e6LTMl89EN9d0HBb=nwap!M2V&h*}A0-Y#*weS%d{rI>M69zMwF*Wza)K>qM zMnQ%FCgaNaNWM*R@09m$u1?9~l~^R&(fL5IJlp@t!qMd1RN=xCvl-fO#!57=3p9wE zUe#Pi_miM@JFg3SAqFFU0lwo#RYgtzS{F;r&L?*E$UG}MEwX$#I|>#X&>VCR+yk^T zF^XB)kV(ZnPe>-NBl=T>+3n%NZR6Q?;a=aThBD1kovG>RJOg&el^#+zcXtHp|3v|c zM;*oe@FQ!sN03IvPZRE+&W0K$-rgBWNssL3>skwyQsQJtht4YAhgntq8ax%mi>CHA zoOlI!G($^G$8{Z7EeP#z*n^h7Kg{g~g~O(9S^jA&%X2Dw;FdL&ugKKtt~DKhr?H zYB@1ui821S)imDT-c!*%C&TOnVMCvC&FV1~%)q&d)=36~vMek9*!-X2ut+$O>! z_kHOmjzIU>aeJ&AAOGkD6SAEIK_>r1HIn0Lha-km^tvY`3LDzJ_;0n(BU`?9h8aOd zC@qb$Xq)VIo+I5RC6Nu}XLxV~@4e-epppgtiBYKzDb1PFPV7TPJ>~eMO^5}raw-X3 z)H0^i!WZ@jZKW~eT({M4+nYpyw&jJMUUaaE4dz_`O6j3=PJAlce7-{IalRN^RZ-D; zc6%XgXK(Lxx~==~l#l0Waqg?#9rGU@J(%^sySeTg@*jNOa`4cr z{XWp_+=Px$Tv_#DEo`h|m#nEY-OzT10UdJS5cnT09K~BuOOlN6zuz`&UyLi9sU302 zvTu=34}wJmn+DUzjkqD&Znfn}&7EWt<3lF_vI~++Y?O3>A*Q#lS$pEH@b<6(Zu9 zsoS|pNIn>zee~XFHSZovU{#BD(&~+B@yWI?m#(UoN1?ZO`KbwUpu%p!ttJvBQ&QvK zzpmeom!FTs`pH1MSB|hDvaS4lQf8opHR?tFX}Ki7PJZFMMtGu^C4@}P$iU@kr0=eg zH#L%i6n>oyXKXTxyN?Mhc-?d;FVHTVf{lxRdpU2RcBeuk&N~REvltDpQ|SrbB2~*5PiJ8H^$FHh&fXe z55pfi3P(}Ns>eMF`ALk|eh-n%!=D8wM2zu2wZBT?!Yc?0zxSm$@~cIsDwT>-mA$GA z3HB(A?>oB4CY^`E5D%k6T?U2zak*5r_ie#}@S<^OHU|A=wz)})1j{44Z#n0dkXXzE zi90CTvqd@RynOl4U}Ckz_=X0ZCZ7!X^IY(S=TgU{G!VEb3-F&1N+T0%>kPU4KyzV* zN`=oetNV-626g*5#d-S?Y9eiF{->H+vdlSs*6&RdjB0cRMZ|zoJKIV42AvdKFNlnAiuC)j--Kc+K=6RcG-qhNC6*!ACNI+;|J) z_Iosk@~WAt`i_l$syu!jb2BZtOu)%efLuu{QF_i?$@C zlvm6l`C-Ikvs0$!fT94Qk~_1*!^6`$KTq4dm*2}<2`8-+gV7hzD={`x{=HzRETG3D zqer3B24D={FjEP#FnSmap`2cjk7QTEv_;W}GdiaK4P&TT=lvFTyu*Mw!=h}aI`6*w zB=@ci=V4Gls|mQDsK?LC`KSoL{3(XMa0>pM?G?G6?VGImS=AXd8}=juHb$VT7>#?X z`2K~~)YMdPMDbYOA5-de{j%Dm!jtV z*wzW~K|W$bK%G@`m=p8W(3uE*kB5;CIg`qoYT1~HOguJKbu@@Z!2mUZ@i@2htAPI+ zYIgq=R{@&&`sWZ0wk``o!)GFYW^;7v-SVWMItiHMjB!7da8HnNEmzx^o43c@Dw2$Y^MtGT{FdCG=(G(U?9@L4L9#G-BX7$MJ{bTP#|5hb4tfhPh1^<4U&Y=~JdI$Sa4?XUkb*D=(bK2&jl30bG)&=+2Idy{J@M=IiHnk!%cmkkkMW_& zZ*+A#&qQfrsM7}wwX~PFr!>!-ySe-?7(2}ZF>xurjKBSF1nQLvV%$u*Zm<8ivB#_Y zGvaIr(UnVP<|vVZoa-v?V-oiLB$oF2D29SF;OUab;g3_T8}TIZ60439S|R93Vk|`w zWOr+E9R^>P@b>L_F97aK+WN|)<#mF%|E@R%L61QUDj2~K$w@f1}JywT= z7>LQIvm9Sx=5YgNrZMUmsW8UD3`4Bd$5Hb}=S3&PFp3N@shZ^pF(SkbTrc}SvOCOC@_f1V;G-icA}+Tp%?Z5)k;zf+1#`Rm`Lu`)@QsR393+$<6&t9 zR7c1I%6*YoVEoeutXNq12tgAh zQs*V$#KW-AMT=nEDk&+MN1w;X`UESba2~YN-Ntz}4U(&gNS2J7nVAJC76x%BZ8RYH zF)mE0mT(y=8S~-1JEycKURg}?v4BT8W+GV5jvPcVE?YJabj*?d>pSv;Kb*y?l^=9J zAq!m;a!G)pXEs3%h4=(s?fJ)nw_ylp6mAqIyu_4|lp-+?qK7>##_x`$TkliYySUcAFU6~++(KdZ}>jdCNU7d|HcT(B=WBd_$;hmkbZfA)>c-b0|P3m zIbt!k>Cl%hsn$8Z6y1(*-n{uVKAo>o1gPf6);J%rSa^6xy!3o8sT^sX)9tmV!Ng;> zL&7|`+&Di9V$gkG(&Mq4Z`98Gt^2%Zz={HiTY&5 zk5#^}@=(b?C9EX!Od*KN!PZP}-Ve#f3&+2W&!%sfXkU80 zJP{#YI0ERM9!~*<)mQn!kWx1u7;d@z){YgdhB9?Hgaj)>DmOe24i$FHY&xY?hk!x! ztE&qK#bHXb7XD3PACqq4go-fq*h`e-X6ajh9nf_>;<7QhQOuu?hb~|fQvLJ1 zBvRSjD_zbUwVCEwX4KTW_J^Wu{ljU$s8+Fd^Ucm@Hi}+lHMOd$Mocy#CZsxvOv4;e z5ItibBMOEbcdF#5`u0ttWx-kqifkEns#k`{0!g;EzTPcIA{)`!sSg$L2nSj(HPgcD zZDdJGc^sPU!O?^5-Cb^;7a{M7sgJLq!hX;`-n2B^{aNRs!>&Rlc%*8}LYS5W?a6*| z`i+ZW3O{0j^iSTtm3bU;q&368@59p%E5AiIPfv+nXtJs##7k=C!M9wO;eRLNnfUcp z*48LDT;A*Gy#6xr4k}jnGbZCXVk}XkLaKa%DO!r-X&Bnp<>h;jx;SRWZ%9a}uQ=XM zghc?>QdvC{-bRW^Q;cS>Yn1AM7Xr3bsv}SGvnDK2(K3kslc0t-=&~XUtT}y- z*XNGxqr*M|B5la*h=GoUzQ}K_LoOj za|XIYO6P~AEbZ$%AtayHhpk?0UkBO_Kwv}pcto-JGL|Y_!zh>A=Nm`B&VXF;?3)& z3*!$^#8!+XSC&sO{UInvQ%cDq*Q zRgWlW_=UNmvH$;^i7m~tNY%OR&~ax zK-MIwGxBUqCfTAt^Viy`V7*Uv*DPU^WKMOA>l!5mD5kEOs^Mm_B|Ty~G2rw$IOhu{ z9-C0%fB{xrEx^&2HH9zt*mIYN*>Yr9;<^ua>OQ@;|F#u8u8NV>?}&{kBCL$LNm`ovh|r-vw>0| zsczgN_t2S;(>7ImuFB^**)hUVep53u6rihvIsQrAwBCuTjRTJz3@qH-k`=3apO*jV z$0Qc%86D84W=ceVbtvO`E-v2!Is>orOVK$KYwrg`j@>YOXt#{Ia#5lrU$-MjSLE_} zf{Y9m3we>t9}ZXW?H7#lMr=N8PpW5o?@}r&|1KK;XZN)n1Xr7&GV6S67}3kpk%TF{ z=Mj8$l`dC;rzYHgaF`u~wi>=V*nj%>vNG?()*nXsSX%Hf2U|{QtOqkqoqd6gKJcMi zI0D`R^n|J@=%Q|*eJx*h>4N)$FFaDJNGngTlnhJk!Y3O{5YU#V=H_IRnSnV8&1J%i z<}UiRw8Y5ObWE0W-q8-a8eqO%x$R+b7NmXr|JCLGU(6LJPaPc{60E>5TCZ@RCZ{i_ z-w@RgUEaN9c|ysIkV$4n@%v`*ER27;vL-Z;e-iYy2WA^-tNZ0Gx>;d~N}7*E;lFGS zM3pk?GF9U=XNSo5Oiu}J{Bq#Eb%O&j4*|qMpenh=#VI=G0UPM+d)njFz-97gBHImAW{CiN@n~C=X%d& zmXeZpF4Lm4H^1|hRRnBm8>t#1EOiTPgWy(jGq1OIa)giwc>*z0{*23$qcR-dF{Opu zfnd|{fB=|f>Hx7%9*lu7pH!~jMNL0LKU2gtGUK_!lKjY*&OQq+N2-eY>P`?M72uct zp}jE3#(aSLW?|Aq2>Pj*pjt1)sa}R8I8*$N#^Hx!pqqDWdl)eQ7h79fU=qglrId3& ze;&4XrGQdyGBO7)>Axob6JzmkoKV?FY|WKqlrMFwduEH+jYA^%s*LIU_li zUk<)`>j7x5i(z*q2XH9rkI>fE`xrSwk5Y5Qe|BB6pi(8DED*nfJS0)q{umPS(dRH; zJ|gd{IqFdo&`G=k0-XT=)_I+<1OFDD7m%kQanEXZ`5w*D{iB1`IY(x2C3k$!b1J%b6mc&@q0S-CagJgrFFy z#wb67iuuz19JWP^_U9_&PZIP`V)W0X0Yg^!CDdJe++a%Oba!(GHaEDOKsXNEk)vZg zcxvCOs}ZOIkq-clZFGxUIXR(#8E|uRC)ETxy}!SoTUc0$Gi7=G?vM+F8E)>iMOwvm zWqej8z%bOb^8EV*q6I&{>{fbmZ5X1rRR8%4mkp9tr?jW9%Ra%`?-s?c)qM867r?*) zr)9|Jj(TmK;+1yHRQ(GURu;gnR{PVuCue6@8W(Ojxth|p z{>N^^7ALLWxhYs`=>jpJn%E&8xN6+*=_-TSO*xyJY|Temd)!onLO$o*AOe|nU(f}o zy>;PwVBznTuKCFH{CSMqm4wm*2hpqfdNr1-W;Gz|02(;%B zRs%po?wM(CJF!1>;S8Rn$W$g^CG@@C>x3rDEycliYX&Opl^I6o7rdTxhYfO2;QK(s zs(0I=L68A7(op8O*K`(LE9W=ksrHWP!b$W-g_gjf`z>$+Ecj^K(Y-Uibmg8;$$Pk3 zCF4AMn^$6Bs7xYb_AI_n1BOy>fPDA5yz<+JfRh+kewD?ZcqWc#&rH)_h!+Y^u5U_?}W@;LkmPQTw z&eZ(8l@&U0-7{aiGtsIrKG`}YFUTZZbd47zAhJm43+2W+If!g>a`HEhcO6d%-xwL8jmmT31mxtd;3HP8 zc(c+L^56}VP+d)p9F^tFKrIDjMVPdfcDtjU*yTv<;m5tw8y)?o&vA4$?*3b~mEwxY z9m?DQUVc@ud}b%eh9zhCN(Lgo!V$%;O|AZ-YIEV&O?jOzfPod0)<(<(rIH z38gvumZ~R=mJ3t-WYf`KOH1SXR^>38|Jlem*@$#t1}=W+nVzP(X$@FiWqz3@*q%FZ zakQ>$WVF^5v*okGv<|wtP)(K!UzDu!7z`=BwzhWBdgj+SNio09V%RJa->l!W*OCAa z&v&Z`pu{p49lrfB%S{+WFEPPK8uDHkUL3S%Ngg;iH|JPBzjg8f%BndL(^Y-p6BrZo z5F*Q>(#n0TPX0F@#+HykzH;Q*#=SC}+YaVOl2g56Rej&-sbD1sIhL+-?iY698DX&b zQKYppTkpKRQ>_bjw`OOdppR>nXoGqff18wINBbNti&08d6;D7_Z&aZlwj=pMYj?4zyTiqnhY z@qgiory%l*QNQ2YfR2bjD32}uF46?ldCb=RqN6?bgUKTO$G{lVjSk0POI?xM^JQ?1 zeT9(iz5m$t_4W6r2=}~Gc#N}^7sjRicN8L{VG$tswBHC1`uV{`6aI*bD3l5vD1vIY zV6uqG6_p`l#`zen-D`DJqV-gE6blU4u`x|1d=C*$r>hJosCO;|ne)!HE4befsdzBS zOlJh6qM}mK5%5SMqzZ)D=a`9Z`E>Msa!Sf8i0#)egB}>YC!#Z(m>wJ6 z8T#_33S^ydR4^j~=9uY9jZkck>*iN($ePE~*E#T|BfYOV!Iq-vQPwxzOAuMW4Xt~l z<0o=DP_t!#CE4ccD*+=kPfmFavP)(>DaAsvWJ?qbAGw@o`!bNOqOvm7*2?n&SKKEw zE9)7E;?lCRnDC_jtNT(NOUHvh;rIOg8y)v%K7AZ4`!*zVgASv|bBM=96XF6Knj0Ib zR6f&Z|30^<4!r%e7y73H8P3gp42$$j{&!TN(iwAehKKcxP4fYnN%D}Ym?a@q8|CK; z>%XeEwzUn>D^*ogY|0+-3e6p}Q3isra_INglIK*Haml#c z#6zzp+Q(087hXdaMrH_iyf<&JGZIHQNtLb&fwd1e=C>|>ULERo-aT^=p)fA&K?UcrQ*S*BvQ5v& z#&PH9q&~(ia8%BH)!}MbT+QBOAM4Sf@eoHh0cfz(VHRWfFmPdwvO1g(RPKj4={v5z0)JfdqYR+k3xzz5kM-h^cmmsmbdr?o}35(aqjGT z;XAXA`TBz6*#BzkY!a?2w-rjNPPOQnw!x6nXL;m5(OL5z0N6G-xQy*wmBu;r8xFJ8 zukjKLgQvVtANeduLtq3U7-i3~7-Y3ATnw32%vnCO{8~NgaCF-ul#K@~AFnx$CF39M zHg9o`^2_PSxViJ49}nGK4}q3MhSiG8%QB0YJVqW_sj7^H!y@qW1{}LwKiyN4*p50g}Y;G~8Q{$8=D8Ca`dj(=aTB?XZ^tiKMgc)sZ-4ARh@$;3WzP{lq<<|qm< z<+~a_cE-E9IWrmltW!dUBUU52vP|qBEoUCNHBmOUbqeUz<|fWq47G(Ww#;|(lP#@M28~`Zqc*Dt?U}^y zhtE(-3tlh;bk1qC=QKPo)v8LCj5RIW_j~_p9cLv>oik~J_|hZ08$>f;4EW@7lVO*D zj_Nfhw&O-=y}=_Oz-PogGe6IWAP=pHS+0llJrb-Dq@EP)bc*=Z#s75cT~BdPvDKBT za0VTR`)&@{4czPgf*^|x-=Lq7RWtKyQf2vgAnKwbO#-t(n7O$jjap*&F4BJd&>2en z<<*5>V5?ZFldo5*0f)pDZa1rgrksj?F*;#Q<2`g12a7P^l>a=&qM`{tLqz%kAvrm@ zLCf`JShMTgof-qzk5vX_qAzVW<=;lJ%CBIHqyC316?R?rLkzH8Y^wKCQ!`=mlwMzk z%;ep>41Vms{*k>i+iJbvtSlphPsGC&NNwC30OaJTHwe@yk}_|If972{bz5Bg7G9~i zA+M}zk-42E0G^1b1I6OWnMnvC@U%sqn6{`Ci2_IkizG&+-*hFQHkg@l#u3%B_rnyEfR~g@W6Kq zlta#t>5Oz6oQmzxXB0ND%Zfq^wcoGLl&zg9e8oYJAj`5(0mv1m-j78vH>gma2=J9( zciBHA&G8Mzms(#Ep2qj@pxtkDh}yYrs!u0p-kGQ4;1WSUz3Jb5^=HQozwI6ZB~SCm zu2oyxRfOx)8&30ditH`2b1?v~yB+P`p3ng3^XoJPf-S3VQ!Bjv_1PThUho~7_Hu2i zyNLQ-(p+oJh|R0=*A+W<_a#YqFV2sTl5o6~@FqOPr6i^_datFZgLty`vR51~+qrZh6j@nG zvcm84`{O?M@bK{dynNoT*K@r;@rL?OXlXcT$jHcOb+k3$z_&5*(WasVu1?`Id}L&T zH+3{rjROiM3XqwCB;TUqeBCwk;Ai_p#d8oPuXaR<6P(ORg6+F!G>)-#C+&o}rno%y z%n4jx;-t&+Fh)bI92QOWn(QUcwZ~(&#iL_sn;!j)s6I~C9PzvG?bhbc@ps+#rxcGB z_X7=RdLxZ$q>V9+DjmjH-x)QiX2zg~5lGv0VZe*C9QEh?I?attwbIuJwj{h=IjW|% zmJu(h$}qj<)Bb8rYGca!oAu?Ib-=|DiJdOar^~YU>S7;*G*BgW z>uZ;Pj`zl7CYJhEVxp+{L$AX#S`^&1#=|otWN=`GY4zaEcbgAu51#*0$eEqJy%fB^ z5%O=VG8a2xBSChL?dXO01fBR|39DEic13XbFhq2$Y+<(qDVI4y0lwEMCZQK4s6#gG zTL|2vv8^r6!HkoO3xlGdh($0^JpFkj2L%W9a3^aq^VukH8&w&{m%Y)#=!|%?Cu>n4 zvp~y2JKm$Wid8Ajy`<>@%%h6}vEoe6?=jF{^hfszO;r|T6 z-=?Ids)_&$dvPLei^k%}buvn*lZ6xBl%?@fNrHfCPB$^B!dcL0#2ZwG7KU7SMOKUW zzTDbX)4v~_^Ci$NJ$TWC6>&!xPgY4Zb zjVeQ=HaKT2NlPFW#}|uub@cNYWfUKR&DQLO$#YVJXuipIt^`O@j~VYp6-h>fAY05W zx&zV=0>=0D=%Q44@M6>Z^g!`7b#hGz{J33DIEDgkkx*JzM-nwT(evdM-iWg!`e|sgg z!5r#lZmuPK&Kv=;NaSl7G5${M&)sQfMU>ZGr^vs10dYIV_n zITY*{0H&-JD>PaTIn>)*>cV~ge8+LBNK*!+)Nx5&AG+%cDdnpuGpYAF-cx+nBI3p5 zefas|XckR<_{Ckh3=Hyjb5aspGMKRp>H#pq&gdu)4r>{N1H>VEUeYd6CJeIYf zLlgNj;4G+ih3sRb_ujw9=J)T5ii$OKH%0Es6)5_rjMzsqMBZW*YiK!rEgOHjb#)5v zJ6Q`ZkZ;rPBiSJwR%3ep#LxzvZZE@cEDTEkh4$bpbaNWq66uvsUX!fD3ojNeXCU{e z)CYJ64;6rks5ME1S4A^KTGi`zEownW?s{}bAoGkxZUetFVu6d^F|%H_2@Ne=U9|(L zSDI9Rmz7rg0Bm;A#;g4$#ij78(50~Rhguk;SWEGOCo&KPl7oXoj7;B=P_MPUi_0xO zisjQu|IOp`ot?cjLGaMem0RpbF|8=e`7Ke=<97yV9Ov^pyi?=J2u$AJr%N2_1 ze=QjAWf^zT13X9$xQO&;5?a4f8+>}UUEkc%5rfE$Mhx0Ws1SX!b8-$8QV#+m9n5O# z>xoW~&7-q_-)<_~Ad%Dyt*3kbeNhY?GVWhL9EZ9u_fA}1D!q8|!l`o-lKX0-S>DxS ze|q;%;PGXB{Tn}r!zG-zjp8OW8~96i3N+YV|z>77($v_e>vf;QLV|FvRr!Qf3N?K z;f4D7z_u~qCA+%13grD$wn-kI>*MSL5*j4hya`I6EQ_9?EcZ5D76*3oW`eyJBAw@A z^9g60x#&ajgN^V5)*V-m=HA|jX$m7YCQZrg=Yj6xp?p!4{m};vaY#1UedaP@Et0R8 zRredW1z=W?Y`Hfw*IJ%M3JX4qJUVLL+1{dCKgEuTQ1jlkg z%^x1rcMr_WFcpWLfn_|F?CtEX>oMnIC#S+My(y!}{r8s;3fy*V|F5&ArbdE;_Vhb_ z_{V&YOC{jx@~1FO7AfksEmW9_HnsF<<_%M^~z+Egt~?{{4L3XNy2YXkq%js$*7Vg;}8BI;-A+00lmM+s~gT)5(MV^yuH*ty{FL(EQy*cvg-pe zw=|5#|6jdx3rBItZ|d-~%J9*PbNUmW@Za}=XOSU9{anm?{p2KfanaIZs$!|;aPN3| zEqFONj^|>(SRp4z>G|lh8u5uf7!eZ9V44kJ-k?{~s_bT`e&4b>m1-W86W=cZie@+o zOOJ{Q9bJQGUqmyifhTJU5iZ`DR`qcX3+2d!)i1L85jdOxL=R)-!4ON1%;T>Zgxosm z#gB|olND_o{H(5jb#X=u)a+s%oP4|#oC>WNaH;PZe&NwGw7byeU+90bQ2dYU ze(jyU8R{X>60-?4Jn0ZcmRyPgg-9+e@S1YmkJ;-ig(jj!*2 zS6yZBs_Fe>BN5&EZLQK~mX`NG0)PMhjUPyp0HKrco1K#bEBv$0G0rWK8-Wz6ABS{v zOkcd1SnR^ zW*c#}{_75?6R@9lLxY3a$P zuC_!6^#A$qCO!AJPO-SSIEya7hn0t6Bg4a#o$d`C05YZ=gcj>pW(LoZV+e0vdPjJK ztZskp^v(ZXV$f*3(jRpbP(Tfxoui*WO9Ouo@FoKVc?Fz3qRjWzz~`Q+qIvzPg0Wji zr(L{cRV*f@DpjWC%4~q1YH-V!O<`0UrmePiBJgqa?`Wsx}GoPD1 zB$!*qE|&#G2OsZUH!GLa%d~C$IHHpX@M=BD&flM2kJuh?aIH}PrXDfi*EjN_jkT}+ zX%iEA019A{O%2mOMzbEE#vH-`n*0{X9itXeSje>^SUTtW>Uc?U7(;k8w}H+MY3%&< zMWq&{MuPb0se_xwHD3nk6CpDYKB{YEE3!g*%o&jWV+9oaz4=1`Bqc%D7yN+zGJcm; zknq4Z@5X>c$($<_UJ_`){+m3%F3&V7$+=W#V`E-~<`l#L%JbV7ArWcMO7UXK(lL zIQ;4ukSEMIiIdCYK7+Oeb?{JI--R2{<(`~z@T$St>UxD1uA=!8gWr>kZIdI>p zh!CAuhQ(OquyisWCd53vO5N%H?fmjzHwGgRO@@>B^7X3*79eBx2wt7020jO9qv@cp z<()fsfHk*#BDaH1dJTH4rgXMm8z`O1F28Q7K_U>0q@#AfU5@STZ6A5XrLb+TN%sOf zS$w`fVZH>4Ma7Xrx5Bd9~N8S86>bS~>vriHeI8 zwvTf4@zDs4=DG2w#>uZbl2BVA0wP(X-3P;W0rNo_Wobd0SlweI`TkPi(IXi_4>AE{ ziA4b2ebTIa{)iI~pg6pK*3`mc;5c+e77k#`Y0TYE#K5<5ZWEvarg_=ZRQ*%p9RenXYLT3VvEUwWPHhn=+n#-QQ- z`;YVU>}A61z+^x;d;wjT&-{(@{{8!a^pq;3uy%eY9&(<{XX&w6 zhud0~M26QhH;h=G)|1#llvI4v5L$ez&I;ST+pTuqGjjc{uH9uow+tOCzRTk12}^Zu z8R)+RCXz497U`9~yUR5LDK)SCz24S4vc7&DS|QbUd2~~|s@?Ou0stGr6{gn9-+uha zh3ElRMgqjB=IP@z*x|jwmU`buj>|&k7P!}1P#+%6gc`lQw|IFHKO9i?Uj?z~9g^cM z=wzWa29YOQm-unN6pKVbHOo=3N>$1iFy^r)2~ZTUan^slxNefX8$}cKHz>01GrsKC zD5b)YF??y&%n%y%8ei-(GoRo0r^clT#v|JngsYsS^LBQ3XWZM&UdXEx#3yxU*^6cm zjiq&=0B&Bhd2!=T&Yi&B78h%$C~==Iw13!MdFAiVqW7Lb5u0+r>R6_Vi0w{bWqYZi z)`z2OQn-GGEG!D@07&X1t-`Q+gS=*A93orLG+mRYf;xwqVhrw>0-S3292+1cAGL6sXe zu%+Sw!~<}uBlMiE3Y8n%|9vkC&+$E;`)3Z1$G9W=BM&{e4x1MHWfF5Fue}`YuTY)} z8>vDm?o=}~vwQlsK!K}-T>VP*4vXPKMc^l$j0_?0ta-8oXgXTI%Gj18Nky0j8{x)k zDB|FSWb88))VrsvtDB3B*a-gG9(J85aXRl(Uuv9yaOULUL9kJVAIgN|CMTthSd6M? z8{P7^e4uQUU;D1e&`=A!gO^wOQQ~uMm*V>z#w83ixer$zrR($hP|!4~2?VX+n}x@kUTdZbz1qjX(fEIY|f)kDQA|MUgD$J5gEu@dCrEj1Q`HH#@aBfu3;- zx=_L#IMGeEwY35s+4}0tx@y*CXU7#FQd3jcGDE;Ha^fB2Xu&xmAWHR`NXCWCF*AL7H)`*%ADP7;Os zU=|u}Fj6`nfbs9=_fT-Bybq0BlsIxM0$%&_zqhp$dK}3@RWMJ>IN20x97EqGrd(r< zWraXsoOPzf0V7;#T#e?nl`H%WD43N%?!MDayOfj^Gs_o4O|HN|19k>$EZWrGuD$&u zS{M`|+LZ|}L#c@jp&z-x2B-n+v{tEnNf3AxT9rRT1XYwQ?lEWrR=}2x5(=it*3833 zBUCttfLvk*QbBM9j0iBoHHD9(P)w>X+eZX%-Oe1z6{blSgjEVm7AqHLPTgR*R*HN~ zga}ey0}9zZ3PwH9%$tx44wnDg8JGy|7_^r{T-g)@8fLo#2tIbdeER9@e8izs;2GkR zRJZkS9h0gg(>HaRZXE<$5(y|9Qyh6w{G&8aNIN4MT9JTaQYWQD88szu5cv}XEbv(3 zuF)SwtH3pm+RQuW=jUXDUIRaWN=2#0B4}|Xv(Dt~tewDrUusyg=&vE!@T+B_;qZV&@=n~KyONb8Xn%_^8r~py6u84`d>>>9bE8F zXfaz78{FcA6AVRe@c_CCaCxP7fow@yM#jsMl_((rx{jNs9w4(M0b*wL(lY&bk zYtZH@W*8G!eCZJT?1mZ@45#wWHOg}l=8k!l+Txb4n`kL+zF_=Y z(obF%zztb+`=GyjesF^D={>4g8cJlHTUf>)hXRAKdXNikfwII3Ypz@ND2?grQV?H9 zn(-#QL_fz~)3DE-gTS;_C51H^VrA=MuB`}H8}7I*-S!++x2(q+X8g;S?a>V^!Sq=!tElzG=;$*xyQxEJ%f6jAc zuL83MU4+A{pKq8)mRXOFeub_CbEm8tik_8Fq-=fb;65@hJUVP6FR~l$w|+{QO6ZaMkpYYZSnxC%sSVNf=|X z(rvj#tJJ8d>wx|f$=Z6xC=8xkSgf!R0T7psjuPNaf|E2Mx@2+7u-1fd1UeMb$xcS9 zT_e?WDt1VJy!)h zGCE2#@v`tB0OgWzBZY42Y|38S@QNgxtf>VIH9Ot;Nv|#g%+$@LRHg)*sAw&4vmNe0?a2P6g?-8d%XRu9s)>?7TsM8%|$Z3azHSGE#8 zt)9w;1eLe=zOV(})a8<11&i@ZNOep2-?_rT?B<>x^|l2-SRMeGNCsAtRA*UX`sd5y zVkvNEJY&)JBkq*kq$dF>xM8%fdF`Ezsp5^DxuYa*V<~YngDTX6L!VhM*VZFN+&m95f0xuvkbKt;cTWW79XpUXy~Fw8!zOg0o0DuxQ??ecwpl5<>~VbFP2; z_8LeP0BanZ-rr#MB4y(az)WkG7w4i7)+YWX9~dSbc};6o36aKIF(4iUAd7B}7{R#^ z(CE9F`jmfJS!I5fHe?opPc_&x>^f1Xqf3c$Zb5)(O*Mj z;}K5Y9a8`|#;6JP6MPl-M0SXU1Z%w5VtcUB?<%mOPD9z838$GbayX-(cg z^;YNM;UR4MAq(HPdv5XL@#vy=p&1p8u?WK|RI?S?!l*}k?5b>ma=230Un28?{?_=T z9(jAKLqQMbw~l`ek6z&4O!X+^D(N$C3bVizriydYR%P>U34?IFAc1mNqubpWHD-X| zzRy*x-LoKR$s~cGntVDL>pIr}B>^L@^j`qhJ|H4h=^xuzW8=fbmX`lo+uGWL)^59p z`z7+`GR5-EI%lm9Ttj96X_Z{~Mb6dJkjWA18xH-um0WR zL%WyumNL1jqJZ)?kCiTmpUz#=X2^?0Wk9kHZ3{OXG+J^T74onI_clooa|MNz9{BkK z3L-D&x>0+bW}mVORFg&1xcYX2X0c$FtB2dc-vy6DQuyhHfzXp^hB-}Vj!rDb<;D$TY4GAAlTs!l>zzajV({TLCdBba)UJ)DCWF6Q=SR)W&x)>qGOZav+>`*OJ+gu zJ)rcHXZHwxHGqCpErizu>U1_EKvB;pg#?>5!0K*<-<|%f0M>|Af=GDiug0 z{+Dr)FMdzJh)wO)+mV9l+Eo%TX3MeeuT7$nyc*1DqcyZM$GT=A$#x-AW4zBXs`aEI znT0%TJVWGIjyQk^nZDKUx!qhsYW~ye$vz436W~4!`qyQ>;y4vDj2Snf5grg8Jmhqh zUpRgEU@SnY=iR6;xlk+u2m>te6TTJfVW0tq=-~hti@0r!eEPycTqkp`I3num&aSurPTPi%tTLnqMJEvRBYJf z@})CB?!Bk$T{Kq1YXCqCQ_(UcKk?UHN}>dB7Ly)Pm_-yd3jO58VxIv6v!^~n>)(Mh zfofIyMI>mi`RHM6%s^+MKI+pRJjy+)L?sb8)(HISSOv#gswBYqo* zp#=hRx6w7|B*#&}6{&CCI{bofkeUO{7tvvAD)OIr|M;I;HL6Htnu}(lPgjq4cb)iu zn{P>X!qy1TO%S{=NZ<;6Rmr{n*n0M3o$9wh_qt_zZ$$kEUoI096Lc)!)fxTOYvi5( zhtrsYXu+iP4h3y+ys-@%hY{zLe6b^gC`dpBNXjsT=zg1zZ;wygPe1x9P7FCx7ViFJ z{}soMJV@)F_H`3$nnnHnvUc%XO|>;1Fs2UXKEb=NWepQYh2~zR`a^)em|`XKrd8i^ zPW>E@uCL_Mpo$QJz|s5;a>rqKzc1lxI|aq(?^%^`*kZ?X499;_k;(jD+jIEYRLN>E2q&#ov;E=9e1 zb|s2liR?zUrOIgB{Og^iTjekbUl%c5dR&@pN|hG?G0J8*VwzJDeC9t6P2X;)gZB#z3Gu3J7#3#Ea>BR zwtRkvkPf<;oy0ue%IZ*IU?{oFQQ6jHA&ON(Kph48aT44)1)=QEC%)NI=`pH~PQn4F z8GtK`M!ZJk4I&dZ9L9-0QbSEOu=gesIxD$bkldW6o7QQzO33bMQIjc46AZ!0s_zaH z9BsQPHv~^t>n|g^XO@px>}H2npM0G>RiG>kE(>BQqAo36>oIC|n{v^PMP__tDSdhJ z>|2mnXVFOT=o%A{E0P)?FD(R#Ep!`-DRY3*tJIj~IOOu`7>B6yfb<|kcKfto>suxZ z3N>ecX!R#9*4V%|*noNdk(SdP`HlTsF~(q~5l<;K-s%661@)%AW0m#p=`cOwPLkS5 z&=8VLaVROm7=(p|PKCZy`f6*542)turHBz)pK*)HGcdt2m9pn{s`58qPCZ^dYwtb4 zTmIUjiGb4wQhe$*l&Kyps(VMHR|40mGRH&J0lGbUvAwMhCO{ka?E-f zksGSH*TbHqBcTVJNvZIqOOfyDL_;>!)LGGn$A3ObE5@V1I(g&&9h)z;iC5&s{WJ>{ z$U>)?5Fs4NT2?w)rw<%Hx%5rH3q`)3emILlY#z3{KVA-RqE%b-C`V$G{Vn~MY#N%I zfs^15kXwPen4tFeHv+*g><5qRipp~pPgF|p${|H`vc?q;OI2e&O7o##O7U2dHfrDn z_6AE_eg;-wxW$ugKKowRG;uJ7r>)U13+{ipVGxMw#~R-?$&nOQ7v8UlW&UfEuX+PmcmRK%f##-eKEM$)Zq>F8x^X)=!SBYuPHV1SUV-|22(i`jS0jIb+O} zu963@e{O26to|qo$Xx-6OcpcH+I&Y9H(g~6WuXxQj`|Pm)i@nOggU-z>7dn1cMjC$ zDm6F~@EnKL9OAPj7%N@WyTqS9XwSbAIqb;Nk0($)B2^^y^1t=2e*~Tjna&Hz{k|)5 z;ANGmfL}I`o@iXdw<4vRCoqJ!#QkI7-4^Y844wTp61ln{$GaJ@CR%7oX8CVj(&5-| z{S%r5AO2-tRL0@i=~jD=5K?RsO7KlyT;$SP@$A%OmtxY@~}*Hn~obqnS>X}4aUYAW*FOxFrhE^6#iV1Kk!*hvu2n5|C>Q%I-2?# Jb!s+|{{w?U56%Dp literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_1_row_8_odd.png b/megamek/data/images/hexes/nuke/hit/col_1_row_8_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..3f85db439135de5b01fcd7266643a1251b5eff14 GIT binary patch literal 4022 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 I#yE!l59&CWrT_o{ literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_0.png b/megamek/data/images/hexes/nuke/hit/col_2_row_0.png new file mode 100644 index 0000000000000000000000000000000000000000..135c6a98ae53cc81a32fb13df5e83923ba199c09 GIT binary patch literal 13129 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_0_odd.png b/megamek/data/images/hexes/nuke/hit/col_2_row_0_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1a38b23de675e06b34985aa9e0e2c8fb7fb6b4 GIT binary patch literal 13250 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 Bt^WW3 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_1.png b/megamek/data/images/hexes/nuke/hit/col_2_row_1.png new file mode 100644 index 0000000000000000000000000000000000000000..98cf4453a522ae755a5b828c4ea1c2cb5c489991 GIT binary patch literal 11938 zcmWlfby!n>8^)z1rJR(bYvAY_AtjwMLgGhB3knDdNO$+>l#~+KK%~2+6-7EnNR6)X zp7)QzwLjoo=bZ2J-1q%?p6Hi4s*gw*NFF?R@JL-v2@d==06uC&4}qVKfzzxH9`HM< zD=8Rw=Z>{GRNKvcKwr$SmgFq?H&M^${u6FmjX}C8`k+{ZZ6q&yEL}i*WM)ePrsHY7Bu%S zeIF0B+v|JL;rn~eq2~Vj{@$4wOa8U<8sm^h$x^DMp-kym1X1Kw&$laaiumx*L4ijZ zq)fz`1P=+FMr4k#l*$tY!x{FVv&L~1kWmsec!d&PRKk&9(<7)ja_#@XneRcGkb#}L zA$^<>3>=&QA?>}9y<}gDzddl>&cX3Jm??0Jjg3`uj{_B9*OEAhS%#1Zwh5jp5;ufh zaAN|?B)&q>Y)b&Q*C|!wtZG3+CGSX4352w|kti(iE#0&lb&p`5l&Ya2$VYFPG8)d{ zz~__>2R#`lmWOZ9GhZin-beH+1fnf{-oBcS8a@G`$?|j}In*Je)Mzb6gHVr$HqS;X ziy$N;$dXFj%1X94MO;R3o-ieBF9El*L@}%o(I;6q&K9opU|iD0A20l}H~Tv7GcVul-{OU*j^T)u5xQzIg8}%4^ANn^w5S~U4c5cwn(mY7OSevBdTg#guPH+6V zQi-kUsPQ{eGf=snm{A$)bkx+4(c-q=;)*=6+SDRq+#0lnc7VC!*h}v4&KSIVA+wJpOSE1 zbqF59lj&b1%^s9IxPnaM3c*_1BboRjIRYvGJjpN+zLY#qFl9^$73z<Bgeq^}3!v@=XWODeBgCkz(UT4*>0;#Kz>q>p4uaT*{L zDKj6Kt*exB44CGg@yI*AR0v9E;P&rt!tJt-k2Hn{%db3ehMJ^{FvatXP`jxLjuIEV z%BkUU2kRL|6hSZBm#-`rYwrdEkDupF|9&z#Lf2qqYobmW!BVK9|DSnWi9y)s!o_zp zF5kYy9ll3kx}h;7dww^L@vNi5abjxtQs2G)%Gi^IbT!rU;@c#d7ULSCRYE_ULu%ox z&)Pr0@J&nw!P;+forh5=&}Wk)~f zNadvwrvhl!Jh7v zHBnRYFik_l+aGe5rN6-ihdhM>GWVI!Vlfb_S%rZ zU7QX%mkw1TkkG^-!WvGZ<;Df+a1EY@>5UKQwLqiK2o>V+mz0gTVMoDw8ncVKL5*8P zy9hfUghQ%5E}Ug6<=C;$MV6iDMG=dlhB~!Gh1Q2ti5X8FR~W|xX-pB@7@XJHZGaM= z+L>|uIwuEBZw*T3V6}_qu-H4x*4=J=)v+3bEP;}4p_&iF@WZUt3}ze*?cQ7(u!J3= z*Ev+41>RSm1U)BtkzLbA`28T}z#l>};=jC~%RVZS`}q4b+(a|m4y4>IlP8ihF{SwF zwD3tVTvh^)uw9n$PSzxS>M$`gt~|^-3KRmHg$f8fcGRx=rTB};*7|dJeY(u(&`EA0 z_Mg|XLi^U^Y&&`l^&XZWmCzA`9}XTPMI8F{>M55iPItV6CV{z-7#Z{uaXuk<*){^l^mXx&kz?M2Oad_?(0NCVl4FiEcE4>?{{ezZH2kW*b#7pGF(5s zA1AqjKUt`?>@3Er;4GA4Sh5ZtWqe0Is>>0xUj(GANoVnb11}Mry{kZ94<@HlNueb$ z$rq7`7y-)kXC5VPshIUPX}VAZEXLTxqT*_rCUpwY?I@o`>nZj2-d0&?mVumtVlRg$ zx;Uz2>(xExS%C-hkIh*Hks17E+M}XIGZ*lv8rnRh&T6+v%~C^ubp3!^qvsI0Q&A z7K!}_xQnIyX&#V0V++%=IY%mGyrh>j1k}UcGTfRX>FKYG%`Ca|#$f*#kw|0+s;;SN z;_vQXFUI0Sslq@^w47)06dmUi>o4xJ?Ha#%)U}lC$Y4aCFHiDY0)E`>-~^_`9ZSxh zdMeY)$|65Ahzda`@;Kc?KaEK7&5bs(sEvbME-57;SOn z(O840_7WdZtj*WZ=+Ox>>C!(M(BiVGtla1u;9>fH$R^z?O%}=CaL#>kR5y5V&SdF- zDzI=9u+6@Fj0kvzbJxC%wfwJhxqQxL+C_9SSb)uR@A{`>iGgZKBs``F`epYGbHr-Z z)hOMxC;<+V94VAvTdlF|WaksXqalACV&G-DK9w2T`=nAwRd8ggb5<02Bx)5(F6yN|oA^$D%1XtmB*y?qCvf+*4VcI!D-kEq*4ycDV#C#Gs(ZfLln ztYdinZCYKg!1(@;G@(M_FzJ033R(=|6;pH)=>#fI%>O%PJnTlwM}SV}KJou1wz zYW4_0PWOm=quDin6mWecF-0uuuh+hGk4%&7>%{7`_BVStK%Pw$^VV#i-Q>!8WP3PF z2rOhQYV zs{X(7Pytld~8>xeyShpLs-0;x#||z-3$3FIx~zgYdUb7+|y5gf-;Hu zi4#mMniBT->7a>)1<>kQ!faqn!dY>E&IYlN;bPd(x6K}Y8==e!&SNrpMU6#J|8l!{ zZo70ET9fUMcd46DpDpR;j}H6u1N+kXlfK}xK93j$x)cr}_?4BHx zz_e{7>x#eP>w*I1%X9*hbn86MuV$UTu%AD3?LjJ@QjA+pDo$j|)^&E_crCG-h}o&V zM^S5;b26MYGDHPhTpaP4BL>F$tZ9Y69NCWDcmznK_6hhczIS1E*-X+?H$y~oLLV^V zH_(_u7^%616t;I{^?lx(?RA<9T$$lrAIn{ump7jOA*Wbchp@%iAPl~kV$M?P0Ao4; z!~7U+8xIzXD4}8tE8!h&QS0_Q$O(ZZ01rj6;(LTaOeNBwjLk_D=Dvnc80nAkQ_4qc zm5B_@@W7pmVD>NuAtv3rakO&{{^)2d^XB{E37ZhG`rBDqFv>1BmBnOUuW0Fo4#=!G@)kP2KrJxT809oJKEbDnES+(3-#vX;E-oHboLR@! zw2VD(V*cQc8V0d)I%TKy5m!|))sDa<-}pXbeF-n@NveErkj7o1E#{>mfmM0g`Bpw0 z0r6XA63c<`I5o;pcA&>0F>7kz6U-KlvyfS-udJ%YN+2Z?2vTI~ygvyZSAij1RLWWVUq?t%f@eOmrR~SCK6kRl z)ZqnW1oK6D^rQ&;s^~+P^zyOJ()DZ;^4oi|y@QGdax?neM%(5Lmy$5iv7Ix*|2`cH z-*qR+Jo~dOcRS8~+IfG7&60*~Us<$NLNGC_ZbJjn>tT9o`3|7)e#vF7Pi1P<_}RR* zl*^zY6_h$&>marKS-C~YlXAd;g4D#kjKk9su1jkjv9vxb ztE6i9Vv zunD|$?QeSIm`tn1J;NTvq)b)3nlwVU*7C>L*`MM7Jf0RLi(Dk)5gZ@w4NkeNCK)iD zVEBcsgX0*Q6qWQDzc9HT6efFqf@*4=;CQMJ;+*AdFnycCVV&>bl54vD<4S~#@C8i< zjU@P#4t(mfIbsL2cEAs9*r}H<0u9$w*xJ`27KI*vzwCc8^+v1>WX^zua%zg$zJ=sy zshoZytghw|Nh0?jngy|bRvnGL$JlE&%{B{Yq0CJSD*hq1#O0`s52A4O9hj?>3f zmb{NB$*V)QjEw9uNKLB#>JYW~I%!(p(xPa`y9Oznahf_jONL|CG&8RL+UQabvIZWi z$_<%y9~CVJ2T4NG2h`` zRLI?h!AQ2VP!7g)p4(@i@~>$_jH>nx2RX`kN7>_yXP2~0Qju`n@lWpBnqfFc=~*n3 zYWQhJL_6CQkxJ@4{ugpXBWu(eyd%?Il4(M5+&0U3+JL_*8G2^Xatbb=$SwPIP#6*> z%10a$*6JlOw|pp)XTR{>J#~FBVd{|L`|b3ze=djbF&j=Qy~M7cX3UKLvnYeuZ?mYh zL=Afm?9Vr;iRcm}sIc=}w5g%yHpchO{(CNCTR*>f(|K>+FwYml!ZHSbx6~F+jZZNn0?t~57YS=+FV@Ew{X`$o$N&&^=JH2KKE~m1grxLVKwdAh6*P1I{7lA_3KX^Szl6P*anR)C*LhMt0!k< zDgutw`=A+pb&Z;^NrLk66*a8=nDc;ow%%d~v5yYD2c==(>c>+PpO63j%TVR)OoXrd z{7iH)oPW$H76=-0*EVuLe3wt&VO%1FIAGMv%ceoJ-pSa~*cl_Zz#Q&NF-xa^+{_krwjN zHyF5r9{5wJVKP+&&S!GKUTJab=XwBq3#6*{nYftp8FbcQDY~3-@0ri zTmsLEZ7?b-Ko(*P0m?uN{2l!JIP3eX0L7f66<1JUDmA_}=S;pF-AKPVOvK zZfty3d}a<2+WUh1{G3W2tV-uV92&%YQ_t)mUT~CF>lc0H*W-#^zehB6Tv;P%Hk5bY zrj-IUtx`-C+5RG-hS^3uf70A^?cdIfTIqMcE8z@&%dP9iJ$!{BJPO$#75e3Ki;J7h z=zJTmTGgudE>GbXa@b#TUJBbL%%z<0mh4JW;$Hkx0=QI&d{HQ!nGYOBrkJ9#KJ;22 zK>&B8PNnR_v0kZaoW}YyQrEDDu=E(C?+S4-MOLDW`X;@r?-HS-#@k=(J~R#f?mUJH zbogbpK_TD1sh@-xm21{YZ0(eH=$NGc+us+`)jw$UW?uO-KR;-|`Kq=}5kw$!TNZg) zQE+|Zw>49+bv($t-a(3vQXKBa$`&7obz21?QdEkE2L>Mcq)+Xg!F(_rv!)i!@55D@ z{Sob|-Yp&otj_&H5GmbK~` zsizb%^X<_M%wvm8dcO5`u=6rDS1vFjEsZmxQC2QT*QwDAwztjyamVv-n>U&!bq-N0 zcL6Qe$=_H7oYZ*UeA`hEC;3B>bfejQaG<<;k!?$g=^RK@nbCq{WT8j*{9wYQ3;u2TbW3X(f2_01`BZp zp1rbMTRilUkUNwuf z+%ey(9}m%D`+VYubZxy=7DJvGjKkBnzW5>yH-Bld`gNheHc$=C80xZAdVtX7g%fS! z+^?-s^Ah>9>Qn16*r(DfP^OmpfBZ)NXK}GyB9mH$^pudN=})}2kpjE6%QejgDN>iWhi(@K<`|?^Tazj(tFECz&EfN? zw+yF%-&1U~9QLxRZulv!eV@8w@zfC};#|0H-O#ngfLfoXmcjU#u`VS>-q{7DZ(vvB z#_I~v$3c(ha}y~dMU~YBM7({AU+E??%i$=xdpSqWxg@0EsHsckt=%2xuk_R8N_`+< zgnT<#TJ2@Vvi$!Y0gjy6R)&Ex1IJE$Fq6dQaMNJ0-sV|#O*Q4i7=^=0%^&e$w3cms z`}1DSZmT#L0qpI+FPWW|BBqk5x!Gx#Ftq=6Dc$FV+Fk9jLpqGu}mMlr0Qhd2WnU%J}^lk^Y zP5~zpfq9#y1S4#vydGaITVo6WMi(cP061YnChwrL#wRI|wJe8x4o!5fj1Ni0i){6r z#l;urh-Y2jSnOMrH z6i*Ep>)U9LuCB^LwAr0PQbki}d@LsSm|trtgH%D`8PC9zY78580MDaR0~#7X^W9v* zD)U`&pc)-S%Wztajr{z1ZMHrAtJ?p#M@eX;-Yy+~YpUyL`2nbu*TKSTC-)?>y?4yF1@d zt6Eg#8Fquc76nsn2O-U=2kQ^?^4O~UcLM4-q?4-^3go4zP=XVQSIj*2Cq58+=n7%Z*kJoY3G*bRS30h zo!UfeKp7U^(XC!hlTs_Q@n+zEhbLza9o;}GF}7STTz>lA%Q-g3>k!%4s0k7S7>O3Q zN6BnMHY0*0v(y74Qx1K0=sS(f=Lm)*$ozL3NH>C2kzYQ`PmFTNzeV;EtAtYRxQzRy zQ~&%L4@*c4agI|ain37#52|r?lhg(}N7oY+>lHwL8dO*d)4xvk{A<2+o^BWsN>%$` zGmx)UhLT`9Fn7Pa9oqpbL8WJPrJS1j6ZKM|DFFu_zP_~WAi%Okc&Lsuph9#kChi^7l}nN6O2kOvdizQJgO z;@UhJFa-)Mb?1++2a&p=k&-%|^P|vJ#HyR85|}$aiiO0nN!pV}>igJRaEQFKQc4m{ zbA}?rqi^4ugvv@9p7n)H3a>V0#35jWYEna}ZY(8V*=$(rj zA^!HwOa9uMEYgOdM&)_jp1<(`ojuA#n@GKEhTbW=UCPslw&;*<@-T2hwQoH!V9Kzb zU`i!2-=!wbS|%r?9z;g^BStb%e#-!rY?GgI$9qvqKP*GvhvhT zSFr;A;STx!!6nH_8-{f(r$e$!mxQMTm8gM(Bon2|V2-Q#vATQX5j~HZr zO88REn*u9BO>)M(wnx#o%!UJ5=)`B_Y)@h;n5&@tzs@UR-&Wta!S(FxRNLlq%4g0) zCn5GI^{QVh^?)r2W%g#~me3L2X2z_M3M6Gb)F=M$fT^DhWpzLc5Z3c~cN_qhfpC&-` z6R5vhw2t`6+W5bHgo9A-cl$o-DgJr+(Bt19A){BnhhlPNMqiRV48_rvIR?pHE_vC6 z7f!u#zuA1{eVv7-i|2|f_lQ}bP4(H`+#NA(iH%j`$r^Vsc6Joc0bF>Pb)T&;r}}Ht z8ZM{o*IH}w-FiyJQ!LsdpW0u9QOew1zUnOHzh|t072K{bdja1C!Rdf!WOPzFdvGIM zSbOg8-*sn8-#A+ScBSNuA7vg$(F=V@T87G6UvKxv*6`VEnEI}|#w+Q%J2C~mpZpo0 z9$E=!9W{2|PG7w1r%xONXiFHSt&a|z6JJ3M6i&Ck$ew!KN9u8TpsHpECwzv)gISBc$TpKuB>sdN01xSrJA0tq_ugcbIi;ZI{cr8 z{qAd7lk^Dbc-o*emPgub&-HV`%8UfBixH@ZHo7)QSp_QwC>7UD+#+`FS&-1pp=61+cIn za>W+L0+g2*g*PUv+-JKx(%90{0m%RQvMl^J8WP|6|qVM z1u0r<0o`dUx)!^+*Cg^4DzF{|ASO@o&7+kdmQ%8Ts$XSOj+9}nCq70`tqT_&S;7nF zcIp}yfb;k9 z5F7m@CH`?aWHjXhyF!5sbnEh%kR8qFIOPQXkM~K=k_LFt<=s2?n{zI1T`+pZEu;4N z`K#PNe+nTY3Cz+7lnFcDKRm^IB~_(ziW|zRqnT@i5`eo2v;ML6`Xa|(&k{{caM_!9 z_f6ka{|RT>nF@Z5*x~_hmGd4jD{lcc$A5k^UFiF0Ofi%FnP0ZH{v2zRU0LZUHgDDL`Oj>>h^bdS+4T4M zXiwtbpR%{o5?}oWz1z#`v*oV;xJvJVO;(3j`uml2@)uSXnopLlxy1+x3Bwe+{vO+4 zDg0&-_3#*(iMh5`Z3Hlu4TEP(H@TjK3j_oY+xE;apOfq4%Jd(cA54LL^|pf6`CNTO z028uyJXm1me@Cah%J|8v=^I_*HJQo_0J9r+yX4QdYT);`6FV{f?^IPq!xuL;HPL$)L(i z5hQxkM@=;tFgsF3TT{&TVINa^$gfh%S@_@{V|knSPLPQ$eB=MH8~AM8UY#siIq#)H z2o$e)8huk46~^Qxt&HY5PGq>XQN?+h19W95osR4awNjRxVe;$nPu z7wL6`>A*}>NR#wg-gUZC4q#OXIYQjPrSrOMhP7NLZ{_Xsh0(~g+u81~>pL-DUqbNd zjcPN09vTXTy1lmvh3I_I>h}~s>uZEV`2<8XMXu+ihd%9opL=s1{n+N^?ymtnoHC5h z$x@PQ?eF3&yILOE<(Z>uA$@MUs0t)|@VG!RJjhlm|NS57>c~d6cMEMgt-sbbhEvHN z`U79ONhjncfCNX;xuYGle!7!t?3}43BlM59HLSY28d$6HI$YSCDZr8?`t1n70{lWz z4ioM>)0{<+wZT9PxA*RFIbhR(8fJ-M7Z(@*{(hffLe49?2-3D^%EK_mwXc#2)$KM- zPtR~_GP89Wa5*T=Q3&)#lri05*aI(mQ8UMs<`WJiJkc-q_g8zKGJFbsF)ivKt1BrZ zW98*QQ7U@36crvW-t_JroF?HFzong*L&5(Q3&3v4XdYk{p)XmbFT~!ad%f>COs92B z;I>C#(&QiJYQjH1^zJ!Rz$Gi7t}^G_#Tz~YIZOeWXEuX$+U0=o{M{!XOk`d^DvbP@ zz3M0rCaC6j70kOdRQnvVzPIQ2#BFCf_Q!7YA-vqGW${1-BvB%nJ?WeF>h>S&D_qq-g$hw z6Vh8K5l&zeAZ~bV=bsi!J1z)7;t%T#<+=r2PFzX~-l8vAOKtx!uNlZ&*!t~{THXda zSYVgzs_JuexNJ=#JnFt9gW%aR&%XQL@CTkd6xfSqQ*-lSdOXr|a?FgK0TM#?@WrRQ z7e#_rA3kKg^9oi$b+4@zNqjMpQ%mO{4!kZeD5~Tg&wD;vdpja9^QLi|;+iZHuLrUM z)Zxkss^A9q{@jL{kcvu)*brEZBEKxZKb5%bqPU}MozL;Zqz3j(kB|T>QadgYO3C(| zKuZV+9J0;F454Mup7(Eks2Kv3BupV}78ri0nf~yTtG+Wo{MdRLX+!Sozg4k}NVS(7 zFddkoFJ7fYLkCO`-t7x#mH!6|Oz<&1T0rR{QB9+}BP859E|mS+Lmnk$-dljlB72A^ ztA6{J50UU^dAa=8?$M0g-HhMyM5hv6WE9M*{wb=XMJ+!87T}V0|4#xdlqh#BnlmrG zbVDyT`L`C~p_7!c<(n|PN3xCCHA$Wz>n*JiJb%+PgC$ zF_73Irp)j!$zVexMi{23P=apijaT$jKAILyQ0eA*jduF0^tt)xw!#77A046rDJToY z@pXHjCrBsB>IBj`0uDjZT4u##`*ugd*fIWEFMs!1uROYEUaX*kPYAa zY(-c9HdZaP_(!tDC12WG%Z~9NbLYHuTIaSdqaOk5d#Mft>&Ja^ScN`pH%>cNYfJQ;*tw&I-;6=cIfI+RAbX@U1#US z;QjWp5LjpE{UC60U*A?R6L{MEztbD#Y+}+6RPSM1D3e7tBPI7A(d*ohlU!KLF3u9A z+kfpo@uBT_Juu)F9=m|e%9Fz^j6qBIZ79?W5NE)y2~m;Ysjh16Aou;<{c+1{OvJyA z83onmh!DUjn>qiKYdEZXWm$*4*h)L*i5>&V61kpF;*>|w)SzMxNCU7Zhkk`$*8 z&$b&(!Awj5oPiTfLr=aY|5>Si!6Sg~Q^&M~61%PlcTWUjQGTbz%yzJU$3OLTJ=S-{ zmM%IjkS#3($Lml14oEHKo%$1RkCtt`ya;WecimA~w=Ng);wcxm)gA(sRG}TwUiILV z?0`;7vpzf^CXi=pl|lIoiE6UO^uvxKnvf7jakC8{9fQNj9{=U_D=i&zF7|=IsWR8D6c3E0f;OU>n zP!rxfrwjpr>*o2sv}27V0E1CZBTHDE(A6j(sf+wkQ~c9+Pn1Cs0dzG}570x%I3Fq1 zSyCHb8)MV|`Xn_`i#@PjH$e_3QMcJ-+JL<*P*2k!uIvRfwpN0J#&uh9Rx~_E;v#b# zY?vm(u(Z*P{)&lr5OCl9$&*f#(fk1|F3@&L-HRQfX!=?^wd3h?g&B?GdK~uBC3iud zkTu6FM~qqHxq%s#atb72`^@*tR8(mxXOEz5zTJkMLW$p3u+9L7dfW(UXKJ5@)@D{M z^vuk^N03EZpVzG2TFARM!}R{#^**81{f-MTeJ@B{f1Aj;=d%3tlqLlZZA8uf+iy)D zqt@smt(-k#_xIl#6cT%?rEdnkBI*&e0%#EoSTM%r;Y7{F0i&8iu`1`PzO$$cPuVK3 zq-!BpR)YPHk&vh%q$JUm_MW6XPp8ktQ(c+s`{mNv-(St~xCMcYiN=>BwT)W9Zpt?b zcs&xSks=C+Acw$6alb(EYS`vxY4PS4ZXIy>%+BONL$czfcEjwni`cHy7BKS~zP^@f zy&(jO#8b*nhN-y0vd3^E>w?(0^AjWMZXU$yM^)9_@|V5)hxuQl_|PsO1h9MlKwVi! K>8qku$o~Kfj5)FZ literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_1_odd.png b/megamek/data/images/hexes/nuke/hit/col_2_row_1_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..61148eef047faa4ed51e62ac7a3e9e1222309ad6 GIT binary patch literal 10874 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 QTmS$707*qoM6N<$f=f`8tN;K2 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_2.png b/megamek/data/images/hexes/nuke/hit/col_2_row_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2c70c4de91c24a9b936d6338c2539c6c585523 GIT binary patch literal 10191 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 JPDHLkV1i5C?t1_L literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_2_odd.png b/megamek/data/images/hexes/nuke/hit/col_2_row_2_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..b061912bec324e9a30f6fe50089a6a3455039ad5 GIT binary patch literal 11494 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 If~`aT2hT%~M*si- literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_3.png b/megamek/data/images/hexes/nuke/hit/col_2_row_3.png new file mode 100644 index 0000000000000000000000000000000000000000..24d06daa0a5068f66a792676e45ae3a2939616e6 GIT binary patch literal 12760 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_4.png b/megamek/data/images/hexes/nuke/hit/col_2_row_4.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b569721c2b2dcd6267b5b68946b354a72caf02 GIT binary patch literal 10659 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_5_odd.png b/megamek/data/images/hexes/nuke/hit/col_2_row_5_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..abb80953c926c7daf74235a75d7b7ff723c0f790 GIT binary patch literal 9919 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_6.png b/megamek/data/images/hexes/nuke/hit/col_2_row_6.png new file mode 100644 index 0000000000000000000000000000000000000000..cb173a8bda3f6fe8cee855118abd21a891c4d7d7 GIT binary patch literal 13644 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 MRrORFljZ64*P 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 RfKOTxX(9CyHL6d;{|7$?phf@y literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_7.png b/megamek/data/images/hexes/nuke/hit/col_2_row_7.png new file mode 100644 index 0000000000000000000000000000000000000000..e111bc2a567ba1e11c9d8ad9e7c04e76ba7be434 GIT binary patch literal 11448 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 e?>6o3H8H4v)Uaa)ivBlFrIqMz#>TjNFGK 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_8.png b/megamek/data/images/hexes/nuke/hit/col_2_row_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc13482795484613dd07d98f1a33b3a2ea6dbcd GIT binary patch literal 6336 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 R0RK$TA$9NR)N0v9{SS*NNk#ww literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_2_row_8_odd.png b/megamek/data/images/hexes/nuke/hit/col_2_row_8_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..9aad676f8c5aa23020df76971a03ea448f463fae GIT binary patch literal 10982 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_0_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_0_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..f83365995e40ef2ae09dd119a3ef8daaf07eb2ee GIT binary patch literal 11534 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�gv6hM9mjNvM2Pr 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 H&Heue>A84$ literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_1_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_1_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..c90bac0c60f2b9fe8889a1624609cd95cb024501 GIT binary patch literal 11895 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 Y#F)^$&`4!AY@i$mtg55(Q|WE+f7#bkG5`Po literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_2.png b/megamek/data/images/hexes/nuke/hit/col_3_row_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3c961fdb8bf06b700f5769e7d5efa766d4d703d7 GIT binary patch literal 12786 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_2_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_2_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..910d26bf7667522b76347e3f66fa81b56ccee634 GIT binary patch literal 14204 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 IWGy5A2jCsdrvLx| literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_3.png b/megamek/data/images/hexes/nuke/hit/col_3_row_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a824a39163b8f863932469370e96d341d1970164 GIT binary patch literal 14130 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 TTzdoG!eJ=Nsv@eSjf4LWr|)fU literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_3_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_3_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..66993654d700b15da19e2086b6dd88673b91a310 GIT binary patch literal 13912 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 M3L5fdvhRcb4-wb{{{R30 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_4.png b/megamek/data/images/hexes/nuke/hit/col_3_row_4.png new file mode 100644 index 0000000000000000000000000000000000000000..8b458f6b40d520cbcc62c248280fef54fdf4a17d GIT binary patch literal 13621 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 H^&$K}&Qg~> literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_4_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_4_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..bd68941d4ecdc078ed26c2e6dfa76c24c54858b8 GIT binary patch literal 13611 zcmWk#bv&GpAD44tUu`;1j59gi-L+$KhSN2i?wsay48t&t4b!<{$Hd{Lrx}Kc)A@UT zUaxci-0SX%PrU0%Fwj$fOhiwFg@yH4Q$xiFc!vTn4bUUtzf<@W8y1%6iKdDoG~nG} zmvf$#efIs`B4*i9&e&J)akUn2^(Y$~E~~I6mZ1Wkij(>~^G+s1i{OA8&qZBn)Pu(Y zp{k)FxtnU1Nq&DinJ_8r`uOSRSsU)YKi;20-_4Q?hT?ak+;=X6X9JpiiENECYWRrts?U=jOd!%>i zJHzrD%FgqB8wZCRr3Qs=6Ye6d%wY$ODl|{x_iv7*!a`DUWjw43Xi=zcrAaLt-Up+n zxZj zR*xwIdZH_9Lhdmo+grKrTv#$Fo3OBA1cJOEg$wys?`S87-!klKgpBR?{lOutCdFA$ zkwcSaHFQ9f-&QEes9LAgKn0EQ~z zc}h);r>Mb8?zs5ELNZ`SuzutC6pebbb7TWm<)leN48tTsHU;aq*8-WF%~OK9Qz6N99KG z4^+50cK2zc_Ta<>sM)+oM{0Qbb6W=Mo9bCD4I=1Id@k-viQ9d0y<(YRI@cLNxOYtV zO^LmO!=rvt5V?-Nu8^Eqs&n2>W$Ip#21Sfb1a%TZ=ffLIg3ed{qPpJ&2QV@+DEqLm z|5h%@lvraF&}A!WWl*v-vyU}O<>X{|Y>l7Dv>jB-&1Luvc}r5o1OJ(Y{|Q>pi3Q<| z%U&?96B4T;CVi<<9_eErB*X%;N;8q|n;A*fCN-nuqc&zVjSvxQi1+QKkls65+uf-O z*kYqjvOa6f`>Lw9^D*TZ~LETJN zkRc3zNf5Ywv%U@P3}zX}ArD_|-Yj5sU;pJB{C~lTNGn$u{aH^E&m4mbic1d`FLlx~ zFmRA3O-^TTTy)|Dmy&_l$m3Sqv6Vnk zSX8QOp39h5UQ%x)+|}jKIh+n$bIm@a^QnG~^N^+{^l$$aRNy6oV0c?P02REP@_~oy z&!51fZv;=N5}^!YB28%Ul=D)MXWhT>@`ic0) zcFq_;GfSM$N0nDph>w@ZPKn1HpT689XY$E3VMFTl{QM;C;fNGs)e+-RuE~m1phroT z7ng7tj71yw?erAVB+`^MVqb8^)$ARcKTKE2Rr!Wqtn}~&Z>|?30~TAKsE)#yyIscs z%;L&@RQV~s^}xd^>LIP|q=wInDc8dDPT5CYLS5 zq9bbq88_E*Kv!AmU?57Z`od5*yL~=TX9+e|FdeeK;%S2_wi+F$o@;Uy2tGehH-RdV zueU$5;rZguU~Ft){CGCS+qc_<<0uq{O+kSZi3K&oCX9iwjR^VTfAkX^ds-mlGQt}AG|cD&t4-_ z4=#(ZzlVk0gZy-W`TNsEfLhA~C})6?C+w3hc~we)S4m zMQaPL^_(6yRBZCH74M;l;DBgz?$rRg?B>JxKyE5`;W~55}X9gc(Blx79yd+5T;pK z+nKbCPdwM{^Q6=Nz@a}byrIwNJ1ya<@8q6;=} zNctAp%0+cHAH=FF@9yT@>wvHR&+%L4+a$rOB;}hi&*0iQ|5YrC*E=+55i|)2Wa|fm z$7*$*ena@-D>Zd>vj$sEtD+(uU46S?U^d(ANX6M0)SEng$qRYam8VoaG)&2z&Y918 zG?}&IQCK4I{x8k2%3mm0jNTV!rYQcLO109wdJ2t>uBq9d?<9C3VhD?kjKr>Krtbkw zh!!c?Fn`A)Okf2m;GoXlFclX6d*;!x%T>JGk{#k$Y^k1#3c034F_iT3D1`^ik`C-# zN}QRe94z_+6R$rpTRU)L&vWx=t$$QcAG3}bFTa}T7cJD~o#sWO(U5tM+_^8GJMGmo0bEi!-FgD-LwvmX($5+WAd9 zfL<)Nj=E05GKM8oS3eCwArmd&wSo6%)^gwT_fVUctA;;*s1I#pzBV@t$;jx`ne<5=;&dflCNAe*wSQR zDbE6v1%+{15CisqON*GyEC;#vs>FZUE}T-2vxzcD5^E@8-tP+A>~IVVN0Q|o)7oWH zTKbL|ziSA4?0VjQQc1i+_wY%DwpojtWbBm8lUD)EFReqVFYZrY zS>TH8Y&V3ImFhHt;{0HPPsb4{do%jB)uS(FjXE*KROn2Zd0ne)~%0 zlJW>M$X-y%9;3sR$;R9SipH{XwTF|lx)K@Dz7GDcye#5Gt4FS1AqX!D zVF$)2Rbv_XI>n_2H10|+a=T39{ZnBJ=FsHUu7kR{St%VI-IHTfsNyZ=t=y%f`Yz_t z*Us8Pmir@h_{HfLn+>&R-KP}K7DI$yWM)FORDTY#C#Yl;7c&E`%$>+xu2ROclku}* z13B#b6}{M1u6dVLn`Zjk7R^(ahV5ZD`0m7r8h;yD;YQ{2t;VjB9K zaml_m`?8J*+t8NrO4V<(vl&*uoPa+@`5uR)MMhQx6sxyeDrQj8pV8aUPA#FM*++Er z^w!?8)j&2Dba7A|M^-YZ!HW>^Qz=8=&V(bGPbyLM__9<B8m;1`D8Zu)7bI-UoQWLOKzu*)C~y@b`?+woL8~i z+-7%O)v_Z{WXlL!v}kq0(B+JNI`M4{uanDwCvRd@*${B`LQvfK8kCpVTUvCg*@Pi) z7zyM-dBw$CMOvjpMD=^?fz0mi?pcYdG4XAN!*Ba84D1sW@PIPhUWh4;fv8%#@*==g zIO0dNOmvFI&GHQ8@(dFUuWopc=j<%nc2mTGM*B`0-bQT&T$b3`-uvfsV^YP3jow=> z3U)WCz?pLXJ$sZxr;L8S?nSIh^HD3~WzPvU-1m>f&2L>s33!(2DC-KMf8w#$mN#_j zQtmk59V;1dS%vcl8r-!igc~6?v^32@j~81eMN@#Tr%!ow;C?_Gm*BoQ*Ah*}W&@&N zE8Zh}B&XMuigsgFfj9FcM%C~P0jJLk0KbX>gUyd8APPbuX`yTG@>3KJ6r``Cr|Z2J z9-4o6x2m@wB{kRXO4=S$%!zxqzZ{HJWmsNbmokaaY;j*4Y&k%^7H5K)l{?>luowXEv&)67gv=r2Fu(tx=z= zFu`SbLOBN}YCL!$qe5ozjEc~b6#dlzMyN_5QLNoG$ywG>IN7gT$^3$#U=ndk( zIsfJq# zrCnqN{*r z4h~^Cu!VIW>r2s`YQws*lhM?wJjNo2n-;5m**Ec5^O900#CZh;m8KAOO~bGGahgjW z2K8Bl%GgF4%|@KrTBR0r^kZBZ5W(k}eHcMVX5R$@e1uC%P6Vv9#Ip5fsY(ZoB({D^ zgd3BOstE{(MH7Kg$~TC)w9%Mq6ohjaSvW-#ol63O;{x&^$ZU>qOXj zvH!~mO0Opr*?KvT3j4W=unRfmU@0}JJ!)xP8pwWW-G6?tIN#|{ngGuk50UoL zt`I44b^c4yQOf?5f}?!nYx90CP2~)Qlp&#Nnd>t{~ZuL*Bwk+VT6x76WjoFfNwss zGoN0mds>q=HHrKV*m(Tg2bDH|e<~8s3NF$+x+ncT+9C3?e2Buz%F1o!o<#og-pWnt z1|oO#?IJ_(Z!!t#@t(Duf=qE~_%K$Q>^ZmzV|>fHdbGwt^^IEN@Q!yF0F^m9 zYr%3#Aln97vTCdb(|1ATsr9Y{{7ET$vrTQiEb?zI-;##z_#fRw`+r=5@9bK|Z{Wu$ z&=N%{u<{8L{P%DB7}#fxBd>lop_m=^X55`R6nTrj5#v30kMNT)%MZ72cjwiQ|JNby z1F)+%$kyKeo0SKfFgQx!a<`k*>vV^fH)IBKQ9?$kbs0Z zY;Oxa&dhUOYx~bZr`)Le%}QwR>mV13m9uYAmFNLM-7d9gmpZlYT0*jNKjwybWUZD= za|S8XJU5OIl)q}JE2}CsDl;g@f9QX zR25oV?M-{bm?|rpf@k%_+$@nB`ZADbU8@-@iBl`YJACyal05=m@Hcrb&6;wvDF<^| ziTFzLAB;Yy4?E-+7gw6s+6`{7s$>~r^C8|F@Vp;NKipZZ;j7r*WAqFn-` zE2QkKp)A$DU7X*HMD3pfaoaKEt z|CnWI%z=c0%C&>AGkprzm_tzj*H~`v2{j4zEC2p8$X^Q;-lDR)x)cBn{ zgc?TL?~{&HG!Pn9yhIsb)oY_wyO(^X#j3p7Dj9t(?%xGp_g^=^^Ep?8pg)w$Cb7Sz zePXTgELZu3vEN~!xtr+&`z|Stl;rc_@3EnbEc6b8KPxOlCM!soSvKGK%w}lW4{v+B zEx@@Ru1Z>`oPLojYLKZJ)srDO)j;udUUFy0sN-nq!}TbPz-zRbK$&H=*AF_^cy3CW zmMt%tl^+wvwlxXcS6L&*1u2il94IwGRK{E+N>H=@Ul3sBXM5*+Hzzvph%!8uS;S^D zzxb#?!wQSoNzJOrS$JAji$w@CRx>h3#P^XZ%ZMu|vLzG3tkh!U3THlV`+n|?g!BFw zUZecjF|aOp)-hz*_ zLlyTVJhr8UWJ{~as5<6Qk}<@u%Cspc^VA}uXM4$$yxBZDmiP&Jwl!Y)ZR$y#XL#Dn z?!S+Ef{_P|bTU704lVvyU9O z%{Ru{MXOg&GyG!kCBs4bCLnD`b@U8tXOG^InIW89U6s+IGPBA#_B#E2z8u`I;2!ur z+oc*5?8ytNtI$U;;nZf+<^qq&OBGD0sVXXdwPs}V@?Azy3~3DQ@H>op6`r1-ecAn# z0uv^r@FMQlVNb$h16Lxe00Ioa%{`SvaS>_ANxSOQQ-#kR*IKV`*NGcQk{TKa{SFq8 z&p)^2z=a1VjwvDgRztp@yW%F-$Q`PP;C{Z7IeV|YZKGI8s`d0K(*}h^Qzl3WRU^o- z>-TJFAH~@Sipiz!b>ziqu3im+3Yw*+z40e0#!1kyupY8(NU^#_@Xb@lqDoaweHX-& z(nE?kg!)t7iSm6nQ<_pLdk;-R1L!U^9~^4~`!rFO_RNi;ciJ|nC&|VMm{VL_ToN0} z&y!Q$sl1?4i&Ovjk`M0hiy0~>ZStO`?+B(zNBO3Ye;^$6(IlHY|AkVmZ+aVgLn45IxKKwdf|+;4Yn*p1vbTiKykEnnY0<_fLqrA=wamQ%lpzr4pnXI|Xrv!M_-E zWo8G@WWM()v&&2$e5^@yHv8C-z<@V-R_Y9V0z3@DftC50Oj9u~md=0mvLaaVJ-Q<^ zo<4Fb9RJ5yay81GkpC#@$;ISMaTzpE-PkznuJ)~IgUj<{l_-4Tpt6-?nV*BU&^dwK zLq|WCj0S|w%qOX6zWTO|Ozt$yfwaeV;!DdPh07;F>(vqj#j>LZt>KxIlZGbsW~#iI ztL3e?#4DFS+%1E4D`HCfd_qH3Jk6{^Ncx?;3b1<)%XifVeB;=Zau8G%gGWOekufZn zmy!KHv$f6q|Ih;pAL~lCvItZOFUS7+hY9CXiHN+||J@#4T}@aV_{SL#e;%Lp)guQc8Zw6x$5TFcAncU;8D#<@ zmX}}M-%&oO`TGNK+Ry7`lTc?wAwB}iJE(q-dayzDEV=!L(@6X8|GAtH(h*TxB?yR2 zV;=z&7sB>f5qYAC;LP(g|VoG~`0>?d@O)1=OPywEdJI47pV*!6;g8HD=FOd+g8}u@YUa04`6_XKHr6pEx83~f+}R&(xF2o)<*I7}vHphixZ)YfJ@=W; zetA5se=A*6^W~#In~#V{$ladx_FTiap?^hs2)zn+KQ$Bcg#bK2t5G$i0$d;xTuW|Y zxx7kE-Xc~o?07xQqvxvo6tcr!sFx|IYm@-CDzZXQZ;P9=n5E45nwfyUW0617Py(=T zg%U!oE)oo0Z;+^D)NaQao~w$hVn zss2Pe7vhLaErJP~(eUqc7kO;#9-!W!WaVuxH)$DWN~rCx+LaRS2>!#w3WOw_6^b2| zHKD!U^1soKP z^76LgBsKF7n8nw&Z!OU;}BhshoKf`eK_lWRSTnEbivv#jdp z1rjZ~Jl}UVd5AP9lt{n0Kd};*^oFJ11z(&j7ka9(W}8$Mr|+kNUinSb~iU3u1ZHRd^har={qPo?S*=25)6YxXMW%3db;2&+j1AK)_= zftv_!(-uH(T`Ee}*A;m#sVtYfJ%r%M%SqUnt4i&#&xi6-Th1!Re;n|#P@C7PP?9Uz zrYyO{o7ag7_{~a}CL%2|R&RBaZXDgQ@y2ZjOu1o4!X&T9gBQ7NC+XU4#-r zxm7K@3Cl_=*O>qXM;5@mUEGu~?P?+{CpnBLN7AyCfQ|C->bF(KqUj^&oqn;!i}E17 z2rYZJ_&+vzEb+>{!30ZQ{Ps!UreKr|iXmVLNO$y;=|}XdO9XmvhL2P}De}i=x$nH7 zynb9TM&yIR!2SFuClOV(wW$M&VdqUZZAage(m9!Qr-xfwMZUlzVv}gRYy)D9sv~T6 z{=agZemRMnQe8UyVU5&#T#`ZJ&1+IVlk;*`#nmRi z0~Z{q-{De{qj)-=Q;k}k3DQG!Xj}R+H|-u5(_!0mN`hDpk{lgo{K_vwBNDijv zWiJt1h|G%Jc4~K9Y8qJGK6`I5uQIlhAx1G?WuPL8YH5~T<%KA)$qtwAZqKBbho>rV ze}`a#&Dw1_9qXktUF+N9On=*s{q=p&URgTvd|;n0G*(%)Tl|md;2_>${oHfuTXE>k zuEp2%q-S06Z&|`(P~mGyI;e3n{ek?vyw(3}QPI&zi{^6e@>f+x)nsvi9-#gT3{Xp+ zrk{=U4KGcS1&;z(f>-+aUU}hj^dpBHGEL*+N~?D&$G@wF>gc5!)n+3;V4<1~?Ws{` z)meO>%(@eMVv8^u7;tYzW&3it6hZ6wUc;npmR&a1tqL3@~{X8V|lY zE|QlfI~RaAG+~-*hN4u)%1TPpzA)7vPvkOij$su2Uuk8;2BepdTdB0|>wErW15OOG zV0!Pv$F;kZs#>4O)BPsY)Z~m}w+AK`^_oj+>U!|Dl4FApM z1DN`I)rMFAK;~6`t1%t{+=!?7I`sX&G%G1TOnI#*&=!ih+e6*DgQq4d6myVYj& zx}Af0wGrAf2o-m)L>t=oJiI2Oi32T_W0p3l)O@*^`-|Q*?}`{m?1xMf(fcwDjYhR* z6Gv~`WQB>0gwX378sR5=g7V@?HuUd8&*wK6q(QiEzyB6hj#g#`k4xS_NQ~`f$BW)c z$blkJbgm}0v{H(+-a8XQT!6cXODf`ERG;hRMqq3Vy8CE_FUT+AVq-y5(uW~bE>Ynf z310~%&9x5N^<2AICz> zhgcX4KI|zk!VL+?1Q~UR96^#vC^ehPNWkkC)j67Ah)4TY`TtE&N78?e50Q6NiK<## zMg!|Ha@ktsEBDjG%=KL-ysxf));fsr8Oy4~)#88Q zep`~RXf=mzhk%_mg57`rV6aWRMt0MQMb%Qlw;vS53M=N_C>|kOZQZp6x$yZoj6+fAW$>jRqjx90|j|z$7 zcuPw8C|%D{qhiV}^u&ufU>w!T3lo z4sWxV07V#qFbR`pDx6m}<&SdHJW0=!)hlMT(OahdFoE}n4-@iQp?BR`we}gqU^KcZ z7^fEzIdvt4mbD9N`yJ#tW8j^cPkJU9CzE#r8k?M@uIZcDY6Xf;=4jWb?k z8ieovRR(pX)*6&dC1v6$()8ImVsmhCB$O#RZtzNsW%uIyar%oYwmtBVgQJtHXH_|e zx(p4sgV`rpyT=Wtu;JnDPKl6H+BCUq+QhOi-h)Iz!NF#8tz_tA^wM+^`gG^tzC-`@ znFg;@T%5hxPDiT8N01WCObHE52g8k(jj3=}xE;)QYT}l@k~gX}L$8?-|I&trqKKb$ zL{x4FS{ER_+{54(X_^%x0~?yJ9^%B`%%+9uG@EdOlx|JQ8YDAxn&t=Uj5#WV;#0fp zoj~lvFO8{tj;;hw4m`st&Hj`0T9*jz?si-Fns6Ah-PyHK=gBdP=qHs)=WNUut*}k7 z*CzP*yg+B5N)t@+$-F&z*Lixnnyf+Eto!sL!2Aq5kpLeLb}Q>U345WpG+1^JDJRbVf2VGa%s!yjHa6+~6m zifZ>JEwDgktuYs-JFC4t+(vW-{Qd7Z>t9^a7db9HX(L*lrtbTjK z4YA$4(A9>>P>(8&RUHO4S=oN55(xtc*oS3q)FON z5=R12V~5{-nObC8@R7}$6i6@GjB2V%dxJayK@qVNf;*D%sYFbf&$x}ECkrqf|6`I% z2A2h51mS^4k#FZ4Lgkqbt~5qw;34wf1Nj{Z&Jp#_5-lkZ&9BY&Pji#nQi(O%ic#|6 zo7VY7B^9!>-*Wi%+4&x+rxk4yTX$un!v0da&9(iv(v+X~&c5FC2QjYEF5XM4K*@YK z#foo(>tmRz{Z=CNDZiyog{7UJUmSx+2z3Uy;jFrfR#H+Y{K58Q$qL|Dd!ln~YdQ|w ze`x7tepsxWs`Z>qe?HnH2p>FH=_smOEM_lqRyTg0@igUMu}9on{g#f8^0&8|3M{wN z4;t1z2Ya?7cKWXYRbx-JquDL}3*2Q(s`-S>{ougucN@Z}v~P4DvJ0m`H}Z_4Z1RB= z!sGYGTFqRtqPUW!K>vl%kw5w%;!M$iH{Cea)BTo?xoCAC^Gav+CX1Jv5w%fWXJOV5 zLieQWk`V_9=!V`0fd*7Gc{Gs`?)siplV9cmT|C=6)*nDwf~OJ}zwhi)Sy;+C`SjK6 zQ&Jejznl%%xh(`dD!JW6(#i$CD}PJc1UojG$|o6$0%U1tAQ+Tv@Okgh89(HKTi;J`|1EZe;WcBzq!i~$vMWo-S{25m9 zcBwP{Rfr=@`xlJLjFUO7yp||Ih5ec$W}r+pNm5b_2nF7KjkmAU!IKp6Aa0_YW zemj|yp>mnqBfC)@)Jff9?+CR(IGsT6Ezy6>5`9460D#Hjt|t7BSB+b@o699$yPQve zz0nM7r2E%-SS52jKsic1av2sO5R!2W9bkgi8k${l7t1f&_1Yffvs2-8+Mqu^f5XJE z$y0m7-@2G+KjQ4^n)G+dG#M}&Glua}H;k&Y0RIT-#poujWr}FkkhB*f!FfWMZ{Gg1 zef!;5(aIgod<$S@7`ZNloV9oY;z`;`zJ6G;ud9hsT~<1Eg89 zpv?C6!0RXcT=`n75|3Ntu4s3m^r}+}gjLp=B?;CXt`2Gk?xCRTU71aTSXdtY{(KmSY#gfXbL69L)LZ8l*jOAXe)&>Jov zxs9G#R;%Y@k14@zm~@(OQ#0}r&R0S+GIFo0x-TY>PCRBZCY1==2lsQUJvDK`>*+hg%Y1<$NlO-z^Lxjs{iN}u zzmUFrU;)eRkvhcu_sGh_#@oR2RXLCDvyo4h4T<(wde3@q?Qd_mZP@P0RJjWq)9ra@;ke{{f;$P zme23oo{NS+j051Q={G>xJqCdR;Iru7+TgN9^y*?^)}T6zR>luc{EOjZ#b>!&2c8eE zCUusYVwtPm;=R%T2lL7(=C!x-mqOjdIT+w;-|W@3PUW~Kk#r^MNM%-<*9nV@BTold zo@Krwdymyo31r`#p|u|ylkLq+E9Z?U%D2URS$4(m`6gxQCY(e+nz;UQX`cDPK&U%Q z{)X2k|Ckmqvb%P5J=X~2+miCA%SC3t5iH-xd0+k4gISUWas->-2w2vCFnF%Y9)^i; z7x{a9H7_^9Q<~bP+VUn`!Nemep{~!>ey9!oS!n-v{nG1n&g<31^=yOP4Ks7#rdQZq zU-bVG#d!TQ;e0XCvA&jr?N}71_`_mTaPH~CY_H-wiNK8f_Q3thq(gNE7b;2buTOZ0T_q}lCUVdF&RR8|9ek*uI7Cmh_}Uk;BJz2cD@fa@f86iMo{f;vTvACz>LBaE^T3xyO1Qg(g_C99g!yAI`i8X&O5kES6f=hJt_oekn?)`@R z7uz5>l#`IWW|BrgRgE=%@ODp`Cm{_{^YtL6^R@PVnx$Z@O z#wCAu7%T+I4!^GIb=>W~C4CY=cA~x+^(-HIdJy5Fr_IN1*m^-~a*N_LnQY;o@x!IzZu#C4PVJXu?}en~ z`dg~}U(?ZJn$RI@J|$bK+ivSGAADG>iVoaX8j`GU*Rkt+uFYFy?tw~)O||5%-!tN& zCR81ovab!e4F4Cpe0e));S~nomYrJZ!5sWP`s?cKiCQNxgkOgNkz>jvB)ca9OrA8z zZcHBG>xv9Hc>G&Is2s$k3al&?oxu~vXk_9hceAZnz@6y z+_YwLaS{3Zl;k1wB8`rvF!>$0CKX(}c@hXT<49iyXV>43J+mG+e&V3(r!+rhj%o?W zN?9|9r{?EV%3L<3q-beP@1H~x3cOMM@prmbkSdx(J?%^Ig`7(>S80R_ySYUv4{wWm zYh%|k{ij3)DD@eY7ZCF;s7JfaG(eI}A=koXd@5`piRQ7jf1Ur*F1reqxMzODGn(l7m{Nnsd z10EnD?JQO(ks7^yg{KG(d0G<(QeKc=(5ym>(mw~nU5aGu5@H$PqM%TfYqg^6!%m6% zv5Z0O%ab~5FjH$@VS$~CLvhLP3vIvsC2iFASBbHbe;g_&V00_aKn94{*5uu{ZyTaa zx%Zs7PH~#;mTV66AZ!cBaazs90yXe07}s`()b{ftgmC!$-HG$ZSUYi81fqFYz7RWOpC|IIEvkqPP^*l)f~Tn5KA>z*>liu8oaX$2#66(*8o%O6#V>2Jpu&f97&me5dU^EGF!{yUTNWYQfxn{XGIRw99OJ8 z)VTj51Y{4@EHmOYcsl02f8-@){SNTIXini%Gl(sI&p@U-T-@Kjv$8QBL!-Y$m5iJg zo;A`>cSi21jWk1ufe4s(p!Y4lb!3&h^v38Z30kB{^uX!*Weg6=hmM8CmH$OGMI2j> zefr3jeqdoSMv^mAGh_vM(LEFMCAGe_tI#IiPTDCku}tH#Si8wYl_siT%_d}4ah60B zP$5Lrs}0J4WioInAs}}#*tN^=Sy5NV)Gs>h+k(*JjCZD=hcdpHB`amweOa|8=^j!4 zszGnzdNb3~Z|`ue5Ma^QB+LIrq)s6F++nR=^{GSxfU4n1KyWaFn7;Nj6xh>wpC zmT69GO%1i#aU6Q#sj#o@8rzPe=3mB zazjTTb+lVuol`L>Z@)3)`*_y(IIQ$IUM;-r)ml~0^p#zb1&(svA$hl2GpMse!m(dX$83Z8 zrKO^}`l56H>Q{kgxuDbc0hep)`Nc(!5BJf4Kfr{-q=WNQQ~l^$bQ?^$5E@@Uq_Zw` z{`x93HpI~k8^$X7f7n=8SV~H(`xTNDM@gRbs9ai{InC$FKKG=cw*z5ue?UWJTx#Z- zJ`MyJ@)a`hS*|;Km1pgKdm)P$B}1|dD7ubQKHE+AVM(`oA`>}xET&Kv%hx&RxPIpp zgNOiO;6WXk>j{qirS8J|5J&AU%u{NBsv&{<14L1P@u_Lia`5ZBGxFG6j+c5Q*@jkV zy+Pv*6z|C~5Y+^OmrrIG%)SbSo6A2u5cl@_Yq1=P)Bq1bVQH%BsnjdIj`|;@ Ch+i83 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_5.png b/megamek/data/images/hexes/nuke/hit/col_3_row_5.png new file mode 100644 index 0000000000000000000000000000000000000000..748ac269960cb4c8a1afb59dfd5030c91838af59 GIT binary patch literal 12747 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_5_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_5_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf48ed94cab496a2c1f0ac4cd3edb82c7676c18 GIT binary patch literal 10880 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_6_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_6_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..23396b6d0646de6336d88e0ee4969879c771c837 GIT binary patch literal 12680 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 F{{dZFnmhmi literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_7.png b/megamek/data/images/hexes/nuke/hit/col_3_row_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d6606b48777466bb7211e93c8f1b310c76fa14 GIT binary patch literal 13328 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 B)-nJ9 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_8.png b/megamek/data/images/hexes/nuke/hit/col_3_row_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0329a4a21174e640b1d671c2c89031d5a581257d GIT binary patch literal 10662 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 F{y)GyAZY*q literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_3_row_8_odd.png b/megamek/data/images/hexes/nuke/hit/col_3_row_8_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..a1817a814524d687325a415bda3d004a6d6f0313 GIT binary patch literal 5582 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

l0CO<9xE|2W|?d2if{JVBQ8Q!Bg{6l+_p+eHw> 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_4_row_1.png b/megamek/data/images/hexes/nuke/hit/col_4_row_1.png new file mode 100644 index 0000000000000000000000000000000000000000..369ef796cddc7d6ff0eb71339e3bcdd80fb1d2e4 GIT binary patch literal 12313 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%0D0%MaJeeT=DtLM7bjV^E_rz=Ze1 zt;HDMn+aS(I1x5Z^YOi?!a#)JHnXgIrP^JD<{^k=_5O*ujjQAM)t#+;=$qFEO(J~> z#`V_QR9CrvTGg{9Ge_T-+^k59>!tcXq0`6MlP^d6rkw88E=_|g^CPMmemGxw6=ve}qMB-R zywdsbrIgxFBM@GpchD`W$?m>}B55X%FWddbFrQn(H*lWNKlj#9Lk%MB47iSuP4N4E zJ<2`2xSJ#!SX1ngCw#G2<)P-IIv+B|L2v9*1~y6S9zz4ke`wI9LWp<~bZgFUzJA4H zHjBJ{Rp@^nv17`JEL^hpeZ1*8=jmWlsXy9Q+yOGT$_(=tj7|f1Fckr7nnldsXhx;) z3*)#PXH$g3%WGaD2^>Maz5N8IS`wo&2E*@Z>%IV0i@oFm4Wj>vl^X3=Nuz5RI@R7> zT0XV}MGnZB4==cKyo=g6;v2D=5^el>*>L!FtcESBMGvPy{SU%2SJ*&Xmm#K@!jSpb z0#s(QNaVZ{8<9XGYNr5PfGBk=_gx30UMw?z?sGe{WhVjQM!N2#Ur z@;Q+-W>M}vU1RqB+iBL4>v!Eb&5 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_4_row_2.png b/megamek/data/images/hexes/nuke/hit/col_4_row_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a97149906700f62710bae7cb349bb31dc87dcfe1 GIT binary patch literal 14145 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 literal 0 HcmV?d00001 diff --git a/megamek/data/images/hexes/nuke/hit/col_4_row_2_odd.png b/megamek/data/images/hexes/nuke/hit/col_4_row_2_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..82eb5231d64915f6de3ac3770f1b4b0f2f6e6b23 GIT binary patch literal 14301 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