From 4ffb3c4af23b561976d222e6c9d14cd0f973a3b5 Mon Sep 17 00:00:00 2001 From: Scoppio Date: Sat, 4 Jan 2025 18:41:01 -0300 Subject: [PATCH] feat: move ACAR base code to MM, needs to implement GUI and force setup --- ...ract Combat Auto Resolve documentation.pdf | Bin 0 -> 192368 bytes .../client/acs-report-messages.properties | 115 +++++ .../client/acs-report-messages_en.properties | 0 .../i18n/megamek/client/messages.properties | 2 + .../i18n/megamek/common/messages.properties | 48 ++ .../ui/advancedSearchMap/BoardTableModel.java | 2 +- .../AutoResolveSimulationLogDialog.java | 20 + .../client/ui/swing/CommonSettingsDialog.java | 2 +- .../client/ui/swing/tooltip/UnitToolTip.java | 2 +- .../common/autoresolve/AutoResolveMethod.java | 68 --- .../megamek/common/autoresolve/Resolver.java | 62 +-- .../autoresolve/acar/SimulatedClient.java | 24 +- .../autoresolve/acar/SimulationContext.java | 49 +- .../autoresolve/acar/SimulationManager.java | 37 +- .../autoresolve/acar/SimulationOptions.java | 24 +- .../acar/action/AbstractAttackAction.java | 26 +- .../autoresolve/acar/action/Action.java | 28 +- .../acar/action/ActionHandler.java | 27 +- .../autoresolve/acar/action/AttackAction.java | 24 +- .../acar/action/AttackToHitData.java | 31 +- .../acar/action/EngagementControlAction.java | 34 +- .../action/EngagementControlToHitData.java | 31 +- .../acar/action/ManeuverToHitData.java | 30 +- .../acar/action/MoraleCheckAction.java | 31 +- .../acar/action/RecoveringNerveAction.java | 30 +- .../RecoveringNerveActionToHitData.java | 31 +- .../acar/action/StandardUnitAttack.java | 32 +- .../acar/action/WithdrawAction.java | 31 +- .../acar/action/WithdrawToHitData.java | 30 +- .../acar/handler/AbstractActionHandler.java | 30 +- .../EngagementAndControlActionHandler.java | 35 +- .../handler/MoraleCheckActionHandler.java | 36 +- .../handler/RecoveringNerveActionHandler.java | 35 +- .../handler/StandardUnitAttackHandler.java | 37 +- .../acar/handler/WithdrawActionHandler.java | 33 +- .../acar/manager/ActionsProcessor.java | 28 +- .../acar/manager/InitiativeHelper.java | 40 +- .../acar/manager/PhaseEndManager.java | 28 +- .../acar/manager/PhasePreparationManager.java | 26 +- .../acar/manager/SimulationManagerHelper.java | 30 +- .../acar/manager/VictoryHelper.java | 28 +- .../acar/phase/DeploymentPhase.java | 26 +- .../autoresolve/acar/phase/EndPhase.java | 36 +- .../autoresolve/acar/phase/FiringPhase.java | 38 +- .../acar/phase/InitiativePhase.java | 27 +- .../autoresolve/acar/phase/MovementPhase.java | 34 +- .../autoresolve/acar/phase/PhaseHandler.java | 28 +- .../acar/phase/StartingScenarioPhase.java | 28 +- .../autoresolve/acar/phase/VictoryPhase.java | 36 +- .../acar/report/AttackReporter.java | 26 +- .../acar/report/EndPhaseReporter.java | 25 +- .../report/EngagementAndControlReporter.java | 30 +- .../acar/report/EntityNameReportEntry.java | 24 +- .../acar/report/FormationReportEntry.java | 26 +- .../acar/report/HtmlGameLogger.java | 24 +- .../acar/report/MoraleReporter.java | 27 +- .../acar/report/PlayerNameReportEntry.java | 24 +- .../acar/report/PublicReportEntry.java | 25 +- .../report/RecoveringNerveActionReporter.java | 27 +- .../autoresolve/acar/report/ReportHeader.java | 24 +- .../acar/report/ReportMessages.java | 36 +- .../acar/report/RollReportEntry.java | 24 +- .../report/StartingScenarioPhaseReporter.java | 26 +- .../acar/report/UnitReportEntry.java | 26 +- .../acar/report/VictoryPhaseReporter.java | 28 +- .../acar/report/WithdrawReporter.java | 28 +- .../common/autoresolve/component/AcTurn.java | 26 +- .../component/EngagementControl.java | 24 +- .../autoresolve/component/Formation.java | 25 +- .../autoresolve/component/FormationTurn.java | 26 +- .../converter/BalancedConsolidateForces.java | 24 +- .../converter/ConsolidateForces.java | 24 +- .../converter/ForceToFormationConverter.java | 28 +- .../autoresolve/converter/SetupForces.java | 464 +----------------- .../autoresolve/damage/AeroDamageApplier.java | 70 +++ .../autoresolve/damage/DamageApplier.java | 317 ++++++++++++ .../damage/DamageApplierChooser.java | 124 +++++ .../autoresolve/damage/EntityFinalState.java | 30 ++ .../damage/GunEmplacementDamageApplier.java | 30 ++ .../damage/InfantryDamageApplier.java | 72 +++ .../autoresolve/damage/MekDamageApplier.java | 192 ++++++++ .../damage/SimpleDamageApplier.java | 22 + .../event/AutoResolveConcludedEvent.java | 27 +- .../Internationalization.java | 47 +- .../weapons/capitalweapons/NLWeapon.java | 2 +- .../weapons/capitalweapons/NavalACWeapon.java | 2 +- .../capitalweapons/SubCapCannonWeapon.java | 2 +- .../weapons/lasers/ISXPulseLaserSmall.java | 4 +- 88 files changed, 1828 insertions(+), 1714 deletions(-) create mode 100644 megamek/docs/ACAR - Abstract Combat Auto Resolve/ACAR-Abstract Combat Auto Resolve documentation.pdf create mode 100644 megamek/i18n/megamek/client/acs-report-messages.properties create mode 100644 megamek/i18n/megamek/client/acs-report-messages_en.properties create mode 100644 megamek/src/megamek/client/ui/dialogs/AutoResolveSimulationLogDialog.java delete mode 100644 megamek/src/megamek/common/autoresolve/AutoResolveMethod.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/AeroDamageApplier.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/DamageApplier.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/DamageApplierChooser.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/EntityFinalState.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/GunEmplacementDamageApplier.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/InfantryDamageApplier.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/MekDamageApplier.java create mode 100644 megamek/src/megamek/common/autoresolve/damage/SimpleDamageApplier.java diff --git a/megamek/docs/ACAR - Abstract Combat Auto Resolve/ACAR-Abstract Combat Auto Resolve documentation.pdf b/megamek/docs/ACAR - Abstract Combat Auto Resolve/ACAR-Abstract Combat Auto Resolve documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2d0a9439892e16b5a83d662811e59ef0897d2047 GIT binary patch literal 192368 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

x77Sk5 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

R10$uK;` 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 literal 0 HcmV?d00001 diff --git a/megamek/i18n/megamek/client/acs-report-messages.properties b/megamek/i18n/megamek/client/acs-report-messages.properties new file mode 100644 index 00000000000..7dcdd4822b5 --- /dev/null +++ b/megamek/i18n/megamek/client/acs-report-messages.properties @@ -0,0 +1,115 @@ +# +# Copyright (c) 2020-2024 - The MegaMek Team. All Rights Reserved. +# +# This file is part of MekHQ. +# +# MekHQ 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. +# +# MekHQ 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 MekHQ. If not, see . +# +# +# Copyright (c) 2020-2024 - The MegaMek Team. All Rights Reserved. +# +# This file is part of MekHQ. +# +# MekHQ 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. +# +# MekHQ 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 MekHQ. If not, see . +# +100=

Abstract Combat Auto Resolution

+ +101=

● Starting Scenario Phase

+102=Team {0} Formations: +103={0} has {1} units. +104={0}, Armor: {1}%, Structure: {2}%, Crew: {3}, Hits: {4} + +999= +1000=

○ Initiative Phase for Round {0}

+1005=

○ Initiative Phase for Start of Game Deployment

+1015=▻ {0} has {1} initiative bonus. +1020=▻ The general turn order is: +1040=

※ The turn order is:

+1045=▻ {0}({1}), rolled {2} +1060=

⁜ Future Deployment

+1065=

▶ Round: #{0}

+1066={0} ({1}), Start: {2} +1067={0}[Team {1}] +1200=
+1230={0} +1231={0} ({1}) {2} +1242=no effect +9999=

● End of the Game

+2020={0} rolls a {1}. + +2201=

◔ Engagement and Control Phase

+2200={0} engages {1} under {2} conditions. +2203=needs {0}+ to control engagement. +2202={0} rolled {1}. +2204={0} gains engagement control! +2205={0} fails to gain engagement control. + + +2002=

◑ Firing Phase

+2001={0} attacks {1}. +3100={0} received {1} damage, {2} armor left +2010=The attack cannot succeed: {0} +2003=Needed {0}+ to hit 〈{1}〉. +2012=The attack misses. +2013=The attack hits! +3090=High Stress episode! +3091=It's crippled! +3092=☠ It's destroyed! +3094={0} took {1} damage to its targeting system. +3095=Rolling for internal damage. +3096={0} took {1} damage to its weapons system. +3097=Took no internal damage. + +3299=

◕ End Phase

+3298=

Destroyed Units

+3330={0} attempts to withdraw under {1} conditions. +3331=Needs {0}+ to successfully withdraw 〈{1}〉. +3332={0} rolled {1} for withdrawal. +3333=The withdrawal is successful! +3334=The withdrawal attempt fails. +3335={0} has has succumbed from his wounds ☠ +3336={0} is still alive ({1} hits) ⛑ + +3337={0} has been devastated, there is nothing left of it. +3338={0} was destroyed by the pilot ejection. +3339={0} was destroyed after being pushed off the combat envelope. +3340={0} was captured by enemy forces. +3341={0} has left the battlefield in full retreat. +3342={0} never joined the battle. +3343={0} was destroyed, it is salvageable. +3344={0} was destroyed by surprise, it is salvageable. + +4500={0} attempts a morale check. Need {1} to succeed. +4501={0} rolled {1}. +4502={0} holds steady and does not lose morale. +4503={0} fails its morale check! Morale worsens from {1} to {2}. + +5000=

● End of Combat

+5002=Team {0} Report: +5003={0} has {1} units remaining. +5004={0}, Armor remaining: {1}%, Structure remaining: {2}%, Crew: {3}, Hits: {4} +5005={0} - Armor remaining: {1}%, Structure remaining: {2}% +5006={0} has {1} units destroyed. +5007={0} has {1} units retreating. diff --git a/megamek/i18n/megamek/client/acs-report-messages_en.properties b/megamek/i18n/megamek/client/acs-report-messages_en.properties new file mode 100644 index 00000000000..e69de29bb2d diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index b71c76573e6..49932600ee3 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -4828,3 +4828,5 @@ Bot.commands.caution=Piloting Caution #### TacOps movement and damage descriptions TacOps.leaping.leg_damage=leaping (leg damage) TacOps.leaping.fall_damage=leaping (fall) + +#### diff --git a/megamek/i18n/megamek/common/messages.properties b/megamek/i18n/megamek/common/messages.properties index b7f0baac68d..20b7bcdf6dd 100644 --- a/megamek/i18n/megamek/common/messages.properties +++ b/megamek/i18n/megamek/common/messages.properties @@ -600,3 +600,51 @@ BeastSize.monstrous=Monstrous ArtilleryMessage.drifted=Artillery drifted here from BombMessage.drifted=Bomb drifted here from + + + +acar.invalid_attack=Invalid attack +acar.invalid_skill=Invalid skill +acar.skill=Skill +acar.critical_target_damage=Critical Target Damage +acar.skill_7=Wet behind the ears (skill) +acar.skill_6=Really Green (skill) +acar.skill_5=Green (skill) +acar.skill_4=Regular (skill) +acar.skill_3=Veteran (skill) +acar.skill_2=Elite (skill) +acar.skill_1=Heroic (skill) +acar.skill_0=Legendary (skill) +acar.short_range=Short range +acar.medium_range=Medium range +acar.long_range=Long range +acar.extreme_range=Extreme range +acar.TMM=TMM +acar.attacker_JUMP=Attacker JUMP +acar.target_JUMP=Target JUMP +acar.shaken=Shaken (morale) +acar.unsteady=Unsteady (morale) +acar.broken=Broken (morale) +acar.routed=Routed (morale) +acar.more_than_two_targets=Too many targets +acar.two_targets=Two targets +acar.invalid_engagement_control=Invalid engagement and control +acar.invalid_attacking_formation=Invalid attacking formation +acar.formation_tactics=Tactics +acar.force_engagement=Force engagement +acar.evade=Evade +acar.formation_is_infantry_only=Formation is infantry only +acar.formation_is_vehicle_only=Formation is vehicle only +acar.size_difference=Formation size difference +acar.shaken_morale=Shaken morale +acar.unsteady_morale=Unsteady morale +acar.broken_morale=Broken morale +acar.routed_morale=Routed morale +acar.forced_engagement=Forced Engagement +acar.aerospace_formation=Aerospace Formation +acar.invalid_nerve_recovering=Invalid nerve recovering +acar.formation_morale=Morale +acar.jump_modifier=Movement modifier +acar.withdraw.crippled=Crippled + +AutoResolveSimulationLogDialog.title=Auto Resolve Report \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java index fb74f8ef95b..d704a79091a 100644 --- a/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java +++ b/megamek/src/megamek/client/ui/advancedSearchMap/BoardTableModel.java @@ -113,7 +113,7 @@ public int getPreferredWidth(int col) { } public void setData(BoardClassifier bc) { - data = bc.getBoardPaths().values().stream().toList();; + data = bc.getBoardPaths().values().stream().toList(); tags = new ArrayList<>(); width = new ArrayList<>(); height = new ArrayList<>(); diff --git a/megamek/src/megamek/client/ui/dialogs/AutoResolveSimulationLogDialog.java b/megamek/src/megamek/client/ui/dialogs/AutoResolveSimulationLogDialog.java new file mode 100644 index 00000000000..f796b364689 --- /dev/null +++ b/megamek/src/megamek/client/ui/dialogs/AutoResolveSimulationLogDialog.java @@ -0,0 +1,20 @@ +package megamek.client.ui.dialogs; + +import megamek.client.ui.dialogs.helpDialogs.AbstractHelpDialog; +import megamek.common.internationalization.Internationalization; + +import javax.swing.*; +import java.awt.*; +import java.io.File; + +public class AutoResolveSimulationLogDialog extends AbstractHelpDialog { + + public AutoResolveSimulationLogDialog(final JFrame frame, File logFile) { + super(frame, Internationalization.getText("AutoResolveSimulationLogDialog.title"), + logFile.getAbsolutePath()); + + setMinimumSize(new Dimension(800, 400)); + setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE); + } + +} diff --git a/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java b/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java index e7977ff8998..25d670d5440 100644 --- a/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java +++ b/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java @@ -296,7 +296,7 @@ private void moveElement(DefaultListModel srcModel, int srcIndex, int trg private ColourSelectorButton csbBoardTextColor; private ColourSelectorButton csbBoardSpaceTextColor; private ColourSelectorButton csbMapsheetColor; - private JSpinner attackArrowTransparency;; + private JSpinner attackArrowTransparency; private JSpinner ecmTransparency; private JTextField buttonsPerRow; private JTextField playersRemainingToShow; diff --git a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java index d23be02e5b7..0a72608d49e 100644 --- a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java +++ b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java @@ -1888,7 +1888,7 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo // Seen by if (showSeenBy) { - String seenByInfo = getSeenByInfo(game, gameOptions, entity);; + String seenByInfo = getSeenByInfo(game, gameOptions, entity); if (!seenByInfo.isEmpty()) { attr = String.format("FACE=Dialog COLOR=%s", UIUtil.toColorHexString((GUIP.getUnitToolTipHighlightColor()))); seenByInfo = UIUtil.tag("FONT", attr, seenByInfo); diff --git a/megamek/src/megamek/common/autoresolve/AutoResolveMethod.java b/megamek/src/megamek/common/autoresolve/AutoResolveMethod.java deleted file mode 100644 index d65fe3f3d15..00000000000 --- a/megamek/src/megamek/common/autoresolve/AutoResolveMethod.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ 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. - * - * MekHQ 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 MekHQ. If not, see . - */ -package megamek.common.autoresolve; - - -import mekhq.utilities.Internationalization; - -import java.util.Optional; - -/** - * @author Luana Coppio - */ -public enum AutoResolveMethod { - PRINCESS("AutoResolveMethod.PRINCESS.text", "AutoResolveMethod.PRINCESS.toolTipText"), - ABSTRACT_COMBAT("AutoResolveMethod.ABSTRACT_COMBAT.text", "AutoResolveMethod.ABSTRACT_COMBAT.toolTipText"); - - private final String name; - private final String toolTipText; - - AutoResolveMethod(final String name, final String toolTipText) { - this.name = Internationalization.getTextAt("AutoResolveMethod", name); - this.toolTipText = Internationalization.getTextAt("AutoResolveMethod", toolTipText); - } - - public String getToolTipText() { - return toolTipText; - } - - public String getName() { - return name; - } - - public static Optional fromIntSafe(int index) { - if (index < 0 || index >= values().length) { - return Optional.empty(); - } - return Optional.of(values()[index]); - } - - public static Optional fromStringSafe(String method) { - return switch (method.toUpperCase()) { - case "PRINCESS" -> Optional.of(PRINCESS); - case "ABSTRACT_COMBAT" -> Optional.of(ABSTRACT_COMBAT); - default -> Optional.empty(); - }; - } - - @Override - public String toString() { - return name; - } -} diff --git a/megamek/src/megamek/common/autoresolve/Resolver.java b/megamek/src/megamek/common/autoresolve/Resolver.java index 97e6fbb6ff5..6b8865bf1b9 100644 --- a/megamek/src/megamek/common/autoresolve/Resolver.java +++ b/megamek/src/megamek/common/autoresolve/Resolver.java @@ -1,38 +1,25 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve; -import megamek.common.Entity; -import megamek.common.Player; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; import megamek.common.autoresolve.acar.SimulationOptions; +import megamek.common.autoresolve.acar.phase.*; import megamek.common.autoresolve.converter.SetupForces; +import megamek.common.autoresolve.event.AutoResolveConcludedEvent; import megamek.common.options.AbstractOptions; -import mekhq.campaign.Campaign; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.SimulationOptions; -import mekhq.campaign.autoresolve.converter.SetupForces; -import mekhq.campaign.autoresolve.event.AutoResolveConcludedEvent; -import mekhq.campaign.mission.AtBScenario; -import mekhq.campaign.unit.Unit; - -import java.util.List; /** @@ -43,20 +30,10 @@ public class Resolver { private final SimulationOptions options; private final SetupForces setupForces; - public Resolver(List playes, - List units, + public Resolver(SetupForces setupForces, AbstractOptions gameOptions) { - this.options = new SimulationOptions(gameOptions); - this.setupForces = new SetupForces(campaign, units, scenario); - } - - public AutoResolveConcludedEvent resolveSimulation() { - SimulationContext context = new SimulationContext(scenario, options, setupForces); - SimulationManager simulationManager = new SimulationManager(context); - initializeGameManager(simulationManager); - simulationManager.execute(); - return simulationManager.getConclusionEvent(); + this.setupForces = setupForces; } private void initializeGameManager(SimulationManager simulationManager) { @@ -68,4 +45,13 @@ private void initializeGameManager(SimulationManager simulationManager) { simulationManager.addPhaseHandler(new EndPhase(simulationManager)); simulationManager.addPhaseHandler(new VictoryPhase(simulationManager)); } + + public AutoResolveConcludedEvent resolveSimulation() { + SimulationContext context = new SimulationContext(options, setupForces); + SimulationManager simulationManager = new SimulationManager(context); + initializeGameManager(simulationManager); + simulationManager.execute(); + return simulationManager.getConclusionEvent(); + } + } diff --git a/megamek/src/megamek/common/autoresolve/acar/SimulatedClient.java b/megamek/src/megamek/common/autoresolve/acar/SimulatedClient.java index 0a0f65a1b55..f58fd812cb4 100644 --- a/megamek/src/megamek/common/autoresolve/acar/SimulatedClient.java +++ b/megamek/src/megamek/common/autoresolve/acar/SimulatedClient.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar; import megamek.client.AbstractClient; diff --git a/megamek/src/megamek/common/autoresolve/acar/SimulationContext.java b/megamek/src/megamek/common/autoresolve/acar/SimulationContext.java index c4398a1ef81..4ad9626f76f 100644 --- a/megamek/src/megamek/common/autoresolve/acar/SimulationContext.java +++ b/megamek/src/megamek/common/autoresolve/acar/SimulationContext.java @@ -1,20 +1,15 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar; @@ -22,6 +17,13 @@ import megamek.common.*; import megamek.common.actions.EntityAction; import megamek.common.annotations.Nullable; +import megamek.common.autoresolve.acar.action.Action; +import megamek.common.autoresolve.acar.action.ActionHandler; +import megamek.common.autoresolve.acar.report.PublicReportEntry; +import megamek.common.autoresolve.component.AcTurn; +import megamek.common.autoresolve.component.Formation; +import megamek.common.autoresolve.component.FormationTurn; +import megamek.common.autoresolve.converter.SetupForces; import megamek.common.enums.GamePhase; import megamek.common.enums.SkillLevel; import megamek.common.event.GameEvent; @@ -29,15 +31,6 @@ import megamek.common.force.Forces; import megamek.logging.MMLogger; import megamek.server.scriptedevent.TriggeredEvent; -import mekhq.campaign.autoresolve.acar.SimulationOptions; -import mekhq.campaign.autoresolve.acar.action.Action; -import mekhq.campaign.autoresolve.acar.action.ActionHandler; -import mekhq.campaign.autoresolve.acar.report.PublicReportEntry; -import mekhq.campaign.autoresolve.component.AcTurn; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.campaign.autoresolve.component.FormationTurn; -import mekhq.campaign.autoresolve.converter.SetupForces; -import mekhq.campaign.mission.AtBScenario; import org.apache.commons.lang3.NotImplementedException; import java.util.*; @@ -52,7 +45,6 @@ public class SimulationContext implements IGame { private static final MMLogger logger = MMLogger.create(SimulationContext.class); private final SimulationOptions options; - private final AtBScenario scenario; /** * Objectives that must be considered during the game @@ -91,15 +83,10 @@ public class SimulationContext implements IGame { */ private final Vector graveyard = new Vector<>(); - public SimulationContext(AtBScenario scenario, SimulationOptions gameOptions, SetupForces setupForces) { + public SimulationContext(SimulationOptions gameOptions, SetupForces setupForces) { this.options = gameOptions; - this.scenario = scenario; setBoard(0, new Board()); - setupForces.createForcesOnGame(this); - } - - public AtBScenario getScenario() { - return scenario; + setupForces.createForcesOnSimulation(this); } public void addUnit(InGameObject unit) { diff --git a/megamek/src/megamek/common/autoresolve/acar/SimulationManager.java b/megamek/src/megamek/common/autoresolve/acar/SimulationManager.java index d9aed0a920d..96391296e7e 100644 --- a/megamek/src/megamek/common/autoresolve/acar/SimulationManager.java +++ b/megamek/src/megamek/common/autoresolve/acar/SimulationManager.java @@ -1,28 +1,30 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar; import megamek.common.IGame; import megamek.common.Player; import megamek.common.ReportEntry; import megamek.common.TurnOrdered; +import megamek.common.autoresolve.acar.action.*; +import megamek.common.autoresolve.acar.manager.*; +import megamek.common.autoresolve.acar.phase.*; +import megamek.common.autoresolve.acar.report.HtmlGameLogger; +import megamek.common.autoresolve.acar.report.PublicReportEntry; +import megamek.common.autoresolve.component.Formation; + +import megamek.common.autoresolve.event.AutoResolveConcludedEvent; import megamek.common.enums.GamePhase; import megamek.common.net.packets.Packet; import megamek.common.preference.PreferenceManager; @@ -31,11 +33,6 @@ import megamek.server.Server; import megamek.server.commands.ServerCommand; import megamek.server.victory.VictoryResult; -import mekhq.campaign.autoresolve.acar.phase.PhaseHandler; -import mekhq.campaign.autoresolve.acar.report.HtmlGameLogger; -import mekhq.campaign.autoresolve.acar.report.PublicReportEntry; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.campaign.autoresolve.event.AutoResolveConcludedEvent; import java.util.ArrayList; import java.util.Collections; diff --git a/megamek/src/megamek/common/autoresolve/acar/SimulationOptions.java b/megamek/src/megamek/common/autoresolve/acar/SimulationOptions.java index 86d72966d84..d6cde18f092 100644 --- a/megamek/src/megamek/common/autoresolve/acar/SimulationOptions.java +++ b/megamek/src/megamek/common/autoresolve/acar/SimulationOptions.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar; import megamek.common.options.AbstractOptions; diff --git a/megamek/src/megamek/common/autoresolve/acar/action/AbstractAttackAction.java b/megamek/src/megamek/common/autoresolve/acar/action/AbstractAttackAction.java index 5d427a37e74..872e2e6c8c6 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/AbstractAttackAction.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/AbstractAttackAction.java @@ -1,26 +1,18 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; -import mekhq.campaign.autoresolve.acar.action.AttackAction; - public abstract class AbstractAttackAction implements AttackAction { private final int entityId; diff --git a/megamek/src/megamek/common/autoresolve/acar/action/Action.java b/megamek/src/megamek/common/autoresolve/acar/action/Action.java index 6154a9d4950..c28846a290a 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/Action.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/Action.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; import megamek.common.actions.EntityAction; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; /** * @author Luana Coppio diff --git a/megamek/src/megamek/common/autoresolve/acar/action/ActionHandler.java b/megamek/src/megamek/common/autoresolve/acar/action/ActionHandler.java index 544ccd228bf..060adafe4b5 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/ActionHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/ActionHandler.java @@ -1,26 +1,19 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; -import mekhq.campaign.autoresolve.acar.action.Action; -import mekhq.campaign.autoresolve.acar.manager.SimulationManagerHelper; +import megamek.common.autoresolve.acar.manager.SimulationManagerHelper; public interface ActionHandler extends SimulationManagerHelper { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/AttackAction.java b/megamek/src/megamek/common/autoresolve/acar/action/AttackAction.java index d2b73c6e1ab..f7f006324a6 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/AttackAction.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/AttackAction.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; public interface AttackAction extends Action { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/AttackToHitData.java b/megamek/src/megamek/common/autoresolve/acar/action/AttackToHitData.java index 14b7ec937d6..5d7e166e063 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/AttackToHitData.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/AttackToHitData.java @@ -1,31 +1,24 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; import megamek.common.InGameObject; import megamek.common.TargetRoll; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.component.Formation; import megamek.common.strategicBattleSystems.SBFUnit; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.action.StandardUnitAttack; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.utilities.Internationalization; +import megamek.common.internationalization.Internationalization; import java.util.List; diff --git a/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlAction.java b/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlAction.java index bb665b42e63..c445e2b9005 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlAction.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlAction.java @@ -1,30 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.Action; -import mekhq.campaign.autoresolve.acar.action.ActionHandler; -import mekhq.campaign.autoresolve.acar.handler.EngagementAndControlActionHandler; -import mekhq.campaign.autoresolve.component.EngagementControl; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.handler.EngagementAndControlActionHandler; +import megamek.common.autoresolve.component.EngagementControl; public class EngagementControlAction implements Action { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlToHitData.java b/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlToHitData.java index 88189b3126e..72f9a858660 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlToHitData.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/EngagementControlToHitData.java @@ -1,29 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; import megamek.common.TargetRoll; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.action.EngagementControlAction; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.utilities.Internationalization; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.component.Formation; +import megamek.common.internationalization.Internationalization; public class EngagementControlToHitData extends TargetRoll { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/ManeuverToHitData.java b/megamek/src/megamek/common/autoresolve/acar/action/ManeuverToHitData.java index 4a57b9dbaec..da0fc0cf183 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/ManeuverToHitData.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/ManeuverToHitData.java @@ -1,28 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; import megamek.common.TargetRoll; -import mekhq.campaign.autoresolve.component.EngagementControl; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.utilities.Internationalization; +import megamek.common.autoresolve.component.EngagementControl; +import megamek.common.autoresolve.component.Formation; +import megamek.common.internationalization.Internationalization; public class ManeuverToHitData extends TargetRoll { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/MoraleCheckAction.java b/megamek/src/megamek/common/autoresolve/acar/action/MoraleCheckAction.java index 25174f7703b..4f3f4df69c4 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/MoraleCheckAction.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/MoraleCheckAction.java @@ -1,28 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.Action; -import mekhq.campaign.autoresolve.acar.handler.MoraleCheckActionHandler; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.handler.MoraleCheckActionHandler; public class MoraleCheckAction implements Action { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveAction.java b/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveAction.java index d9d37909957..2debaf44186 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveAction.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveAction.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.handler.RecoveringNerveActionHandler; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.handler.RecoveringNerveActionHandler; public class RecoveringNerveAction implements Action { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveActionToHitData.java b/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveActionToHitData.java index e71a09b4490..6907622f79b 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveActionToHitData.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/RecoveringNerveActionToHitData.java @@ -1,29 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; import megamek.common.TargetRoll; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.action.RecoveringNerveAction; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.utilities.Internationalization; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.component.Formation; +import megamek.common.internationalization.Internationalization; public class RecoveringNerveActionToHitData extends TargetRoll { diff --git a/megamek/src/megamek/common/autoresolve/acar/action/StandardUnitAttack.java b/megamek/src/megamek/common/autoresolve/acar/action/StandardUnitAttack.java index 87d51bee103..8d3c7a33b35 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/StandardUnitAttack.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/StandardUnitAttack.java @@ -1,30 +1,24 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; import megamek.common.alphaStrike.ASRange; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.handler.StandardUnitAttackHandler; +import megamek.common.autoresolve.component.Formation; import megamek.logging.MMLogger; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.handler.StandardUnitAttackHandler; -import mekhq.campaign.autoresolve.component.Formation; import java.util.Optional; diff --git a/megamek/src/megamek/common/autoresolve/acar/action/WithdrawAction.java b/megamek/src/megamek/common/autoresolve/acar/action/WithdrawAction.java index 85563095d40..b7c94f19bab 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/WithdrawAction.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/WithdrawAction.java @@ -1,28 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.Action; -import mekhq.campaign.autoresolve.acar.handler.WithdrawActionHandler; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.handler.WithdrawActionHandler; public class WithdrawAction implements Action { private final int formationId; diff --git a/megamek/src/megamek/common/autoresolve/acar/action/WithdrawToHitData.java b/megamek/src/megamek/common/autoresolve/acar/action/WithdrawToHitData.java index af9c0896ced..23e6ab939e0 100644 --- a/megamek/src/megamek/common/autoresolve/acar/action/WithdrawToHitData.java +++ b/megamek/src/megamek/common/autoresolve/acar/action/WithdrawToHitData.java @@ -1,28 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.action; import megamek.common.TargetRoll; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.utilities.Internationalization; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.component.Formation; +import megamek.common.internationalization.Internationalization; public class WithdrawToHitData extends TargetRoll { diff --git a/megamek/src/megamek/common/autoresolve/acar/handler/AbstractActionHandler.java b/megamek/src/megamek/common/autoresolve/acar/handler/AbstractActionHandler.java index 2806f265584..72485129516 100644 --- a/megamek/src/megamek/common/autoresolve/acar/handler/AbstractActionHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/handler/AbstractActionHandler.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.handler; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.Action; -import mekhq.campaign.autoresolve.acar.action.ActionHandler; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.Action; +import megamek.common.autoresolve.acar.action.ActionHandler; public abstract class AbstractActionHandler implements ActionHandler { diff --git a/megamek/src/megamek/common/autoresolve/acar/handler/EngagementAndControlActionHandler.java b/megamek/src/megamek/common/autoresolve/acar/handler/EngagementAndControlActionHandler.java index c247e90f457..a86af715753 100644 --- a/megamek/src/megamek/common/autoresolve/acar/handler/EngagementAndControlActionHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/handler/EngagementAndControlActionHandler.java @@ -1,32 +1,25 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.handler; import megamek.common.Compute; import megamek.common.Roll; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.EngagementControlAction; -import mekhq.campaign.autoresolve.acar.action.EngagementControlToHitData; -import mekhq.campaign.autoresolve.acar.handler.AbstractActionHandler; -import mekhq.campaign.autoresolve.acar.report.EngagementAndControlReporter; -import mekhq.campaign.autoresolve.component.EngagementControl; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.EngagementControlAction; +import megamek.common.autoresolve.acar.action.EngagementControlToHitData; +import megamek.common.autoresolve.acar.report.EngagementAndControlReporter; +import megamek.common.autoresolve.component.EngagementControl; import java.util.Map; diff --git a/megamek/src/megamek/common/autoresolve/acar/handler/MoraleCheckActionHandler.java b/megamek/src/megamek/common/autoresolve/acar/handler/MoraleCheckActionHandler.java index 310bb75c778..69f50f8e411 100644 --- a/megamek/src/megamek/common/autoresolve/acar/handler/MoraleCheckActionHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/handler/MoraleCheckActionHandler.java @@ -1,32 +1,26 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.handler; import megamek.common.Compute; import megamek.common.Roll; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.MoraleCheckAction; -import mekhq.campaign.autoresolve.acar.action.RecoveringNerveAction; -import mekhq.campaign.autoresolve.acar.action.RecoveringNerveActionToHitData; -import mekhq.campaign.autoresolve.acar.report.MoraleReporter; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.MoraleCheckAction; +import megamek.common.autoresolve.acar.action.RecoveringNerveAction; +import megamek.common.autoresolve.acar.action.RecoveringNerveActionToHitData; +import megamek.common.autoresolve.acar.report.MoraleReporter; +import megamek.common.autoresolve.component.Formation; public class MoraleCheckActionHandler extends AbstractActionHandler { diff --git a/megamek/src/megamek/common/autoresolve/acar/handler/RecoveringNerveActionHandler.java b/megamek/src/megamek/common/autoresolve/acar/handler/RecoveringNerveActionHandler.java index 74796f7bc10..7f5346a9587 100644 --- a/megamek/src/megamek/common/autoresolve/acar/handler/RecoveringNerveActionHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/handler/RecoveringNerveActionHandler.java @@ -1,31 +1,24 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.handler; import megamek.common.Compute; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.RecoveringNerveAction; -import mekhq.campaign.autoresolve.acar.action.RecoveringNerveActionToHitData; -import mekhq.campaign.autoresolve.acar.handler.AbstractActionHandler; -import mekhq.campaign.autoresolve.acar.report.RecoveringNerveActionReporter; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.RecoveringNerveAction; +import megamek.common.autoresolve.acar.action.RecoveringNerveActionToHitData; +import megamek.common.autoresolve.acar.report.RecoveringNerveActionReporter; +import megamek.common.autoresolve.component.Formation; public class RecoveringNerveActionHandler extends AbstractActionHandler { diff --git a/megamek/src/megamek/common/autoresolve/acar/handler/StandardUnitAttackHandler.java b/megamek/src/megamek/common/autoresolve/acar/handler/StandardUnitAttackHandler.java index 464d2b4cb95..fa5e603dc28 100644 --- a/megamek/src/megamek/common/autoresolve/acar/handler/StandardUnitAttackHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/handler/StandardUnitAttackHandler.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.handler; import megamek.codeUtilities.ObjectUtility; @@ -24,14 +18,13 @@ import megamek.common.Entity; import megamek.common.Roll; import megamek.common.alphaStrike.AlphaStrikeElement; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.AttackToHitData; +import megamek.common.autoresolve.acar.action.StandardUnitAttack; +import megamek.common.autoresolve.acar.report.AttackReporter; +import megamek.common.autoresolve.component.EngagementControl; +import megamek.common.autoresolve.component.Formation; import megamek.common.strategicBattleSystems.SBFUnit; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.AttackToHitData; -import mekhq.campaign.autoresolve.acar.action.StandardUnitAttack; -import mekhq.campaign.autoresolve.acar.handler.AbstractActionHandler; -import mekhq.campaign.autoresolve.acar.report.AttackReporter; -import mekhq.campaign.autoresolve.component.EngagementControl; -import mekhq.campaign.autoresolve.component.Formation; import java.util.ArrayList; import java.util.Collections; diff --git a/megamek/src/megamek/common/autoresolve/acar/handler/WithdrawActionHandler.java b/megamek/src/megamek/common/autoresolve/acar/handler/WithdrawActionHandler.java index 23d9de7b826..0b322e82e17 100644 --- a/megamek/src/megamek/common/autoresolve/acar/handler/WithdrawActionHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/handler/WithdrawActionHandler.java @@ -1,31 +1,24 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.handler; import megamek.common.Compute; import megamek.common.IEntityRemovalConditions; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.WithdrawAction; -import mekhq.campaign.autoresolve.acar.action.WithdrawToHitData; -import mekhq.campaign.autoresolve.acar.handler.AbstractActionHandler; -import mekhq.campaign.autoresolve.acar.report.WithdrawReporter; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.WithdrawAction; +import megamek.common.autoresolve.acar.action.WithdrawToHitData; +import megamek.common.autoresolve.acar.report.WithdrawReporter; import java.util.concurrent.atomic.AtomicInteger; diff --git a/megamek/src/megamek/common/autoresolve/acar/manager/ActionsProcessor.java b/megamek/src/megamek/common/autoresolve/acar/manager/ActionsProcessor.java index 48e5077f773..266fd0a2675 100644 --- a/megamek/src/megamek/common/autoresolve/acar/manager/ActionsProcessor.java +++ b/megamek/src/megamek/common/autoresolve/acar/manager/ActionsProcessor.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.manager; import megamek.common.actions.EntityAction; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.manager.SimulationManagerHelper; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.*; public record ActionsProcessor(SimulationManager simulationManager) implements SimulationManagerHelper { diff --git a/megamek/src/megamek/common/autoresolve/acar/manager/InitiativeHelper.java b/megamek/src/megamek/common/autoresolve/acar/manager/InitiativeHelper.java index 030a1d6f1dc..781570696de 100644 --- a/megamek/src/megamek/common/autoresolve/acar/manager/InitiativeHelper.java +++ b/megamek/src/megamek/common/autoresolve/acar/manager/InitiativeHelper.java @@ -1,35 +1,29 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.manager; import megamek.common.*; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.report.FormationReportEntry; +import megamek.common.autoresolve.acar.report.PlayerNameReportEntry; +import megamek.common.autoresolve.acar.report.PublicReportEntry; +import megamek.common.autoresolve.acar.report.ReportHeader; +import megamek.common.autoresolve.component.AcTurn; +import megamek.common.autoresolve.component.Formation; +import megamek.common.autoresolve.component.FormationTurn; import megamek.common.enums.GamePhase; import megamek.common.strategicBattleSystems.SBFFormation; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.report.FormationReportEntry; -import mekhq.campaign.autoresolve.acar.report.PlayerNameReportEntry; -import mekhq.campaign.autoresolve.acar.report.PublicReportEntry; -import mekhq.campaign.autoresolve.acar.report.ReportHeader; -import mekhq.campaign.autoresolve.component.AcTurn; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.campaign.autoresolve.component.FormationTurn; import java.util.*; import java.util.stream.Collectors; diff --git a/megamek/src/megamek/common/autoresolve/acar/manager/PhaseEndManager.java b/megamek/src/megamek/common/autoresolve/acar/manager/PhaseEndManager.java index 0e6882fb860..4a438ec296f 100644 --- a/megamek/src/megamek/common/autoresolve/acar/manager/PhaseEndManager.java +++ b/megamek/src/megamek/common/autoresolve/acar/manager/PhaseEndManager.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.manager; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.report.PublicReportEntry; import megamek.common.enums.GamePhase; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.report.PublicReportEntry; public record PhaseEndManager(SimulationManager simulationManager) implements SimulationManagerHelper { diff --git a/megamek/src/megamek/common/autoresolve/acar/manager/PhasePreparationManager.java b/megamek/src/megamek/common/autoresolve/acar/manager/PhasePreparationManager.java index 954ebb56f36..9102af8347e 100644 --- a/megamek/src/megamek/common/autoresolve/acar/manager/PhasePreparationManager.java +++ b/megamek/src/megamek/common/autoresolve/acar/manager/PhasePreparationManager.java @@ -1,25 +1,19 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.manager; -import mekhq.campaign.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.SimulationManager; public record PhasePreparationManager(SimulationManager simulationManager) implements SimulationManagerHelper { diff --git a/megamek/src/megamek/common/autoresolve/acar/manager/SimulationManagerHelper.java b/megamek/src/megamek/common/autoresolve/acar/manager/SimulationManagerHelper.java index 6d434f6c391..b088a7705bf 100644 --- a/megamek/src/megamek/common/autoresolve/acar/manager/SimulationManagerHelper.java +++ b/megamek/src/megamek/common/autoresolve/acar/manager/SimulationManagerHelper.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.manager; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.report.PublicReportEntry; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.report.PublicReportEntry; /** * Helper interface for classes that need to interact with the {@link SimulationManager}. diff --git a/megamek/src/megamek/common/autoresolve/acar/manager/VictoryHelper.java b/megamek/src/megamek/common/autoresolve/acar/manager/VictoryHelper.java index 2906956d493..e96343ff7d1 100644 --- a/megamek/src/megamek/common/autoresolve/acar/manager/VictoryHelper.java +++ b/megamek/src/megamek/common/autoresolve/acar/manager/VictoryHelper.java @@ -1,28 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.manager; import megamek.common.Player; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; import megamek.server.victory.VictoryResult; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; public class VictoryHelper { diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/DeploymentPhase.java b/megamek/src/megamek/common/autoresolve/acar/phase/DeploymentPhase.java index 3bc34e64023..add09159813 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/DeploymentPhase.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/DeploymentPhase.java @@ -1,26 +1,20 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; +import megamek.common.autoresolve.acar.SimulationManager; import megamek.common.enums.GamePhase; -import mekhq.campaign.autoresolve.acar.SimulationManager; public class DeploymentPhase extends PhaseHandler { diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/EndPhase.java b/megamek/src/megamek/common/autoresolve/acar/phase/EndPhase.java index e41171297cb..e4a55b41b67 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/EndPhase.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/EndPhase.java @@ -1,35 +1,29 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; import megamek.ai.utility.Memory; import megamek.common.IEntityRemovalConditions; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.MoraleCheckAction; +import megamek.common.autoresolve.acar.action.RecoveringNerveAction; +import megamek.common.autoresolve.acar.action.WithdrawAction; +import megamek.common.autoresolve.acar.report.EndPhaseReporter; +import megamek.common.autoresolve.component.Formation; import megamek.common.enums.GamePhase; import megamek.common.strategicBattleSystems.SBFUnit; import megamek.common.util.weightedMaps.WeightedDoubleMap; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.MoraleCheckAction; -import mekhq.campaign.autoresolve.acar.action.RecoveringNerveAction; -import mekhq.campaign.autoresolve.acar.action.WithdrawAction; -import mekhq.campaign.autoresolve.acar.report.EndPhaseReporter; -import mekhq.campaign.autoresolve.component.Formation; import java.util.List; diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/FiringPhase.java b/megamek/src/megamek/common/autoresolve/acar/phase/FiringPhase.java index cd9b7877df2..ef7f9166d62 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/FiringPhase.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/FiringPhase.java @@ -1,36 +1,30 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; import megamek.common.Compute; import megamek.common.Entity; import megamek.common.alphaStrike.ASRange; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.Action; +import megamek.common.autoresolve.acar.action.ManeuverToHitData; +import megamek.common.autoresolve.acar.action.StandardUnitAttack; +import megamek.common.autoresolve.component.EngagementControl; +import megamek.common.autoresolve.component.Formation; +import megamek.common.autoresolve.component.FormationTurn; import megamek.common.enums.GamePhase; import megamek.common.util.weightedMaps.WeightedDoubleMap; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.Action; -import mekhq.campaign.autoresolve.acar.action.ManeuverToHitData; -import mekhq.campaign.autoresolve.acar.action.StandardUnitAttack; -import mekhq.campaign.autoresolve.component.EngagementControl; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.campaign.autoresolve.component.FormationTurn; import java.util.ArrayList; import java.util.Collection; diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/InitiativePhase.java b/megamek/src/megamek/common/autoresolve/acar/phase/InitiativePhase.java index c3d74f31fed..db2e85c6fad 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/InitiativePhase.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/InitiativePhase.java @@ -1,27 +1,20 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; +import megamek.common.autoresolve.acar.SimulationManager; import megamek.common.enums.GamePhase; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.phase.PhaseHandler; public class InitiativePhase extends PhaseHandler { diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/MovementPhase.java b/megamek/src/megamek/common/autoresolve/acar/phase/MovementPhase.java index 15005d4469f..6b440aea534 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/MovementPhase.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/MovementPhase.java @@ -1,34 +1,28 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; import megamek.common.Entity; import megamek.common.alphaStrike.ASRange; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.action.EngagementControlAction; +import megamek.common.autoresolve.component.EngagementControl; +import megamek.common.autoresolve.component.Formation; +import megamek.common.autoresolve.component.FormationTurn; import megamek.common.enums.GamePhase; import megamek.common.strategicBattleSystems.SBFFormation; import megamek.common.util.weightedMaps.WeightedDoubleMap; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.action.EngagementControlAction; -import mekhq.campaign.autoresolve.component.EngagementControl; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.campaign.autoresolve.component.FormationTurn; import java.util.Collections; import java.util.Map; diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/PhaseHandler.java b/megamek/src/megamek/common/autoresolve/acar/phase/PhaseHandler.java index 98deddf75f1..2ec5036a56c 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/PhaseHandler.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/PhaseHandler.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; import megamek.common.enums.GamePhase; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; /** * @author Luana Coppio diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/StartingScenarioPhase.java b/megamek/src/megamek/common/autoresolve/acar/phase/StartingScenarioPhase.java index 9bf1723936a..a4092998ae8 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/StartingScenarioPhase.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/StartingScenarioPhase.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.report.StartingScenarioPhaseReporter; import megamek.common.enums.GamePhase; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.report.StartingScenarioPhaseReporter; public class StartingScenarioPhase extends PhaseHandler { diff --git a/megamek/src/megamek/common/autoresolve/acar/phase/VictoryPhase.java b/megamek/src/megamek/common/autoresolve/acar/phase/VictoryPhase.java index 1711a4e44b6..94c9e2f93a6 100644 --- a/megamek/src/megamek/common/autoresolve/acar/phase/VictoryPhase.java +++ b/megamek/src/megamek/common/autoresolve/acar/phase/VictoryPhase.java @@ -1,33 +1,27 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.phase; import megamek.common.Entity; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.report.VictoryPhaseReporter; +import megamek.common.autoresolve.component.Formation; +import megamek.common.autoresolve.damage.DamageApplierChooser; +import megamek.common.autoresolve.damage.EntityFinalState; import megamek.common.enums.GamePhase; import megamek.common.strategicBattleSystems.SBFUnit; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; -import mekhq.campaign.autoresolve.acar.report.VictoryPhaseReporter; -import mekhq.campaign.autoresolve.component.Formation; -import mekhq.campaign.unit.damage.DamageApplierChooser; -import mekhq.campaign.unit.damage.EntityFinalState; public class VictoryPhase extends PhaseHandler { diff --git a/megamek/src/megamek/common/autoresolve/acar/report/AttackReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/AttackReporter.java index 7f511df245f..4bb1dbbc639 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/AttackReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/AttackReporter.java @@ -1,29 +1,23 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.IGame; import megamek.common.Roll; import megamek.common.TargetRoll; +import megamek.common.autoresolve.component.Formation; import megamek.common.strategicBattleSystems.SBFUnit; -import mekhq.campaign.autoresolve.component.Formation; import java.util.function.Consumer; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/EndPhaseReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/EndPhaseReporter.java index 62b3ed86ecc..8cf86fe47a1 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/EndPhaseReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/EndPhaseReporter.java @@ -1,28 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.Entity; import megamek.common.IEntityRemovalConditions; import megamek.common.IGame; -import mekhq.campaign.autoresolve.acar.report.EntityNameReportEntry; import java.util.Map; import java.util.function.Consumer; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/EngagementAndControlReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/EngagementAndControlReporter.java index 60fa489f13c..1cf2d89188c 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/EngagementAndControlReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/EngagementAndControlReporter.java @@ -1,30 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.IGame; import megamek.common.Roll; -import mekhq.campaign.autoresolve.acar.report.PlayerNameReportEntry; -import mekhq.campaign.autoresolve.acar.report.RollReportEntry; -import mekhq.campaign.autoresolve.component.EngagementControl; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.component.EngagementControl; +import megamek.common.autoresolve.component.Formation; import java.util.function.Consumer; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/EntityNameReportEntry.java b/megamek/src/megamek/common/autoresolve/acar/report/EntityNameReportEntry.java index cb67a447e3d..acab9f3cf1c 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/EntityNameReportEntry.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/EntityNameReportEntry.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.util.PlayerColour; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/FormationReportEntry.java b/megamek/src/megamek/common/autoresolve/acar/report/FormationReportEntry.java index 17c67a75aab..c0a0df2b38f 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/FormationReportEntry.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/FormationReportEntry.java @@ -1,28 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.tooltip.SBFInGameObjectTooltip; import megamek.client.ui.swing.util.UIUtil; import megamek.common.IGame; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.component.Formation; public class FormationReportEntry extends PublicReportEntry { diff --git a/megamek/src/megamek/common/autoresolve/acar/report/HtmlGameLogger.java b/megamek/src/megamek/common/autoresolve/acar/report/HtmlGameLogger.java index e15031936c6..4073f246867 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/HtmlGameLogger.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/HtmlGameLogger.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.GameLog; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/MoraleReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/MoraleReporter.java index d7df46e1487..0b4064d5d34 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/MoraleReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/MoraleReporter.java @@ -1,28 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.IGame; import megamek.common.Roll; -import mekhq.campaign.autoresolve.acar.report.RollReportEntry; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.component.Formation; import java.util.function.Consumer; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/PlayerNameReportEntry.java b/megamek/src/megamek/common/autoresolve/acar/report/PlayerNameReportEntry.java index 9992e61787d..e006cad2122 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/PlayerNameReportEntry.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/PlayerNameReportEntry.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.util.PlayerColour; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/PublicReportEntry.java b/megamek/src/megamek/common/autoresolve/acar/report/PublicReportEntry.java index fb777f07b9c..bb235ee4ec5 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/PublicReportEntry.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/PublicReportEntry.java @@ -1,28 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.Report; import megamek.common.ReportEntry; import megamek.common.Roll; -import mekhq.campaign.autoresolve.acar.report.ReportMessages; import java.io.Serializable; import java.util.ArrayList; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/RecoveringNerveActionReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/RecoveringNerveActionReporter.java index 39f75f3df8a..7dad53032e3 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/RecoveringNerveActionReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/RecoveringNerveActionReporter.java @@ -1,29 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.util.UIUtil; import megamek.common.IGame; import megamek.common.Roll; -import mekhq.campaign.autoresolve.acar.report.RollReportEntry; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.component.Formation; import java.util.function.Consumer; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/ReportHeader.java b/megamek/src/megamek/common/autoresolve/acar/report/ReportHeader.java index a7e461801f6..05381954f34 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/ReportHeader.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/ReportHeader.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.util.UIUtil; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/ReportMessages.java b/megamek/src/megamek/common/autoresolve/acar/report/ReportMessages.java index f1c45a0cece..e4656133c9b 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/ReportMessages.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/ReportMessages.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.MegaMek; @@ -30,23 +24,23 @@ public class ReportMessages { private static final ResourceBundle RESOURCE_BUNDLE = - ResourceBundle.getBundle("mekhq.resources.acs-report-messages", MegaMek.getMMOptions().getLocale()); + ResourceBundle.getBundle("megamek.client.acs-report-messages", MegaMek.getMMOptions().getLocale()); private static final ResourceBundle EN_RESOURCE_BUNDLE = - ResourceBundle.getBundle("mekhq.resources.acs-report-messages", Locale.ENGLISH); + ResourceBundle.getBundle("megamek.client.acs-report-messages", Locale.ENGLISH); private static String getEnString(String key) { - try { + if (EN_RESOURCE_BUNDLE.containsKey(key)) { return EN_RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { + } else { return null; } } public static String getString(String key) { - try { + if (RESOURCE_BUNDLE.containsKey(key)) { return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { + } else { return getEnString(key); } } diff --git a/megamek/src/megamek/common/autoresolve/acar/report/RollReportEntry.java b/megamek/src/megamek/common/autoresolve/acar/report/RollReportEntry.java index 041556690c7..7dd26385d21 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/RollReportEntry.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/RollReportEntry.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.util.UIUtil; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/StartingScenarioPhaseReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/StartingScenarioPhaseReporter.java index c114f98acde..043f44124ae 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/StartingScenarioPhaseReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/StartingScenarioPhaseReporter.java @@ -1,28 +1,22 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.Entity; import megamek.common.IGame; import megamek.common.Player; -import mekhq.campaign.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.SimulationManager; import java.util.ArrayList; import java.util.HashMap; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/UnitReportEntry.java b/megamek/src/megamek/common/autoresolve/acar/report/UnitReportEntry.java index d755da6356f..201eaaec6bb 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/UnitReportEntry.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/UnitReportEntry.java @@ -1,26 +1,20 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.util.UIUtil; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.component.Formation; import java.awt.*; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/VictoryPhaseReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/VictoryPhaseReporter.java index c390b069b59..3518da34827 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/VictoryPhaseReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/VictoryPhaseReporter.java @@ -1,29 +1,23 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.common.Entity; import megamek.common.IGame; import megamek.common.Player; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.acar.SimulationManager; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationManager; import java.util.ArrayList; import java.util.HashMap; diff --git a/megamek/src/megamek/common/autoresolve/acar/report/WithdrawReporter.java b/megamek/src/megamek/common/autoresolve/acar/report/WithdrawReporter.java index dadb1348bd8..4c4cfdc1051 100644 --- a/megamek/src/megamek/common/autoresolve/acar/report/WithdrawReporter.java +++ b/megamek/src/megamek/common/autoresolve/acar/report/WithdrawReporter.java @@ -1,31 +1,23 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.acar.report; import megamek.client.ui.swing.util.UIUtil; import megamek.common.IGame; import megamek.common.Roll; import megamek.common.TargetRoll; -import mekhq.campaign.autoresolve.acar.report.PlayerNameReportEntry; -import mekhq.campaign.autoresolve.acar.report.RollReportEntry; -import mekhq.campaign.autoresolve.component.Formation; +import megamek.common.autoresolve.component.Formation; import java.util.function.Consumer; diff --git a/megamek/src/megamek/common/autoresolve/component/AcTurn.java b/megamek/src/megamek/common/autoresolve/component/AcTurn.java index 89da4ca7935..e06bbdd0dcb 100644 --- a/megamek/src/megamek/common/autoresolve/component/AcTurn.java +++ b/megamek/src/megamek/common/autoresolve/component/AcTurn.java @@ -1,26 +1,20 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.component; import megamek.common.AbstractPlayerTurn; -import mekhq.campaign.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationContext; public abstract class AcTurn extends AbstractPlayerTurn { diff --git a/megamek/src/megamek/common/autoresolve/component/EngagementControl.java b/megamek/src/megamek/common/autoresolve/component/EngagementControl.java index a69164b9204..ce67bd81579 100644 --- a/megamek/src/megamek/common/autoresolve/component/EngagementControl.java +++ b/megamek/src/megamek/common/autoresolve/component/EngagementControl.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.component; public enum EngagementControl { diff --git a/megamek/src/megamek/common/autoresolve/component/Formation.java b/megamek/src/megamek/common/autoresolve/component/Formation.java index 2320b869ff1..40fbef41e8c 100644 --- a/megamek/src/megamek/common/autoresolve/component/Formation.java +++ b/megamek/src/megamek/common/autoresolve/component/Formation.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.component; import megamek.ai.utility.Memory; @@ -26,7 +20,6 @@ import megamek.common.alphaStrike.ASRange; import megamek.common.strategicBattleSystems.SBFFormation; import megamek.common.strategicBattleSystems.SBFUnit; -import mekhq.campaign.autoresolve.component.EngagementControl; public class Formation extends SBFFormation { diff --git a/megamek/src/megamek/common/autoresolve/component/FormationTurn.java b/megamek/src/megamek/common/autoresolve/component/FormationTurn.java index 6be4381c029..a6403ffcd8f 100644 --- a/megamek/src/megamek/common/autoresolve/component/FormationTurn.java +++ b/megamek/src/megamek/common/autoresolve/component/FormationTurn.java @@ -1,27 +1,21 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.component; import megamek.common.IGame; import megamek.common.InGameObject; -import mekhq.campaign.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.acar.SimulationContext; public class FormationTurn extends AcTurn { diff --git a/megamek/src/megamek/common/autoresolve/converter/BalancedConsolidateForces.java b/megamek/src/megamek/common/autoresolve/converter/BalancedConsolidateForces.java index 7e637b7f470..7d198a3ad55 100644 --- a/megamek/src/megamek/common/autoresolve/converter/BalancedConsolidateForces.java +++ b/megamek/src/megamek/common/autoresolve/converter/BalancedConsolidateForces.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.converter; import java.util.*; diff --git a/megamek/src/megamek/common/autoresolve/converter/ConsolidateForces.java b/megamek/src/megamek/common/autoresolve/converter/ConsolidateForces.java index fecb040024c..caef1224262 100644 --- a/megamek/src/megamek/common/autoresolve/converter/ConsolidateForces.java +++ b/megamek/src/megamek/common/autoresolve/converter/ConsolidateForces.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.converter; import megamek.common.Entity; diff --git a/megamek/src/megamek/common/autoresolve/converter/ForceToFormationConverter.java b/megamek/src/megamek/common/autoresolve/converter/ForceToFormationConverter.java index 85b6f0d8d1e..264e3c94972 100644 --- a/megamek/src/megamek/common/autoresolve/converter/ForceToFormationConverter.java +++ b/megamek/src/megamek/common/autoresolve/converter/ForceToFormationConverter.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.autoresolve.converter; import megamek.common.Entity; @@ -26,14 +20,14 @@ import megamek.common.alphaStrike.ASRange; import megamek.common.alphaStrike.AlphaStrikeElement; import megamek.common.alphaStrike.conversion.ASConverter; +import megamek.common.autoresolve.acar.SimulationContext; +import megamek.common.autoresolve.component.Formation; import megamek.common.force.Force; import megamek.common.force.Forces; import megamek.common.strategicBattleSystems.BaseFormationConverter; import megamek.common.strategicBattleSystems.SBFUnit; import megamek.common.strategicBattleSystems.SBFUnitConverter; import megamek.logging.MMLogger; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.autoresolve.component.Formation; import java.util.ArrayList; diff --git a/megamek/src/megamek/common/autoresolve/converter/SetupForces.java b/megamek/src/megamek/common/autoresolve/converter/SetupForces.java index 645fef19cae..15259318d95 100644 --- a/megamek/src/megamek/common/autoresolve/converter/SetupForces.java +++ b/megamek/src/megamek/common/autoresolve/converter/SetupForces.java @@ -1,466 +1,24 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. + * 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. * - * MekHQ 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 MekHQ. If not, see . */ package megamek.common.autoresolve.converter; -import io.sentry.Sentry; -import megamek.common.*; -import megamek.common.alphaStrike.conversion.ASConverter; import megamek.common.autoresolve.acar.SimulationContext; -import megamek.common.enums.SkillLevel; -import megamek.common.force.Forces; -import megamek.common.options.OptionsConstants; -import megamek.common.planetaryconditions.PlanetaryConditions; -import megamek.logging.MMLogger; -import mekhq.campaign.Campaign; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.copy.CrewRefBreak; -import mekhq.campaign.mission.AtBDynamicScenario; -import mekhq.campaign.mission.AtBScenario; -import mekhq.campaign.mission.BotForce; -import mekhq.campaign.mission.Scenario; -import mekhq.campaign.unit.Unit; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; - -/** - * @author Luana Coppio - */ -public class SetupForces { - private static final MMLogger logger = MMLogger.create(SetupForces.class); - - private final List units; - private final List players; - private final Forces forces; - - public SetupForces(List players, List units, Forces forces) { - this.units = units; - this.forces = forces; - this.players = players; - } - - /** - * Create the forces for the game object, using the campaign, units and scenario - * @param game The game object to setup the forces in - */ - public void createForcesOnGame(SimulationContext game) { - setupPlayer(game); - setupBots(game); - ConsolidateForces.consolidateForces(game); - convertForcesIntoFormations(game); - } - - private static class FailedToConvertForceToFormationException extends RuntimeException { - public FailedToConvertForceToFormationException(Throwable cause) { - super(cause); - } - } - - /** - * Convert the forces in the game to formations, this is the most important step in the setup of the game, - * it converts every top level force into a single formation, and those formations are then added to the game - * and used in the auto resolve in place of the original entities - * @param game The game object to convert the forces in - */ - private static void convertForcesIntoFormations(SimulationContext game) { - for(var force : game.getForces().getTopLevelForces()) { - try { - var formation = new ForceToFormationConverter(force, game).convert(); - formation.setTargetFormationId(Entity.NONE); - formation.setOwnerId(force.getOwnerId()); - game.addUnit(formation); - game.getForces().addEntity(formation, force.getId()); - } catch (Exception e) { - Sentry.captureException(e); - var entities = game.getForces().getFullEntities(force).stream().filter(Entity.class::isInstance) - .map(Entity.class::cast).toList(); - logger.error("Error converting force to formation {} - {}", force, entities, e); - throw new FailedToConvertForceToFormationException(e); - } - } - } - - /** - * Setup the player, its forces and entities in the game, it also sets the player skill level. - * @param game The game object to setup the player in - */ - private void setupPlayer(SimulationContext game, SkillLevel playerSkillLevel) { - var player = getCleanPlayer(); - game.addPlayer(player.getId(), player); - var entities = setupPlayerForces(player); - game.setPlayerSkillLevel(player.getId(), playerSkillLevel); - sendEntities(entities, game); - } - - /** - * Setup the bots, their forces and entities in the game, it also sets the player skill level. - * @param game The game object to setup the bots in - */ - private void setupBot(SimulationContext game, SkillLevel botSkillLevel) { - var localBots = new HashMap(); - for (int i = 0; i < scenario.getNumBots(); i++) { - BotForce bf = scenario.getBotForce(i); - String name = bf.getName(); - if (localBots.containsKey(name)) { - int append = 2; - while (localBots.containsKey(name + append)) { - append++; - } - name += append; - } - var highestPlayerId = game.getPlayersList().stream().mapToInt(Player::getId).max().orElse(0); - Player bot = new Player(highestPlayerId + 1, name); - bot.setTeam(bf.getTeam()); - localBots.put(name, bot); - configureBot(bot, bf); - game.addPlayer(bot.getId(), bot); - if (bot.isEnemyOf(campaign.getPlayer())) { - game.setPlayerSkillLevel(bot.getId(), enemySkill); - } else { - game.setPlayerSkillLevel(bot.getId(), allySkill); - } - bf.generateRandomForces(units, campaign); - var entities = bf.getFullEntityList(campaign); - var botEntities = setupBotEntities(bot, entities, bf.getDeployRound()); - sendEntities(botEntities, game); - } - } - - /** - * Create a player object from the campaign and scenario wichi doesnt have a reference to the original player - * @return The clean player object - */ - private Player getCleanPlayer() { - var campaignPlayer = campaign.getPlayer(); - var player = new Player(campaignPlayer.getId(), campaign.getName()); - player.setCamouflage(campaign.getCamouflage().clone()); - player.setColour(campaign.getColour()); - player.setStartingPos(scenario.getStartingPos()); - player.setStartOffset(scenario.getStartOffset()); - player.setStartWidth(scenario.getStartWidth()); - player.setStartingAnyNWx(scenario.getStartingAnyNWx()); - player.setStartingAnyNWy(scenario.getStartingAnyNWy()); - player.setStartingAnySEx(scenario.getStartingAnySEx()); - player.setStartingAnySEy(scenario.getStartingAnySEy()); - player.setTeam(1); - player.setNbrMFActive(scenario.getNumPlayerMinefields(Minefield.TYPE_ACTIVE)); - player.setNbrMFConventional(scenario.getNumPlayerMinefields(Minefield.TYPE_CONVENTIONAL)); - player.setNbrMFInferno(scenario.getNumPlayerMinefields(Minefield.TYPE_INFERNO)); - player.setNbrMFVibra(scenario.getNumPlayerMinefields(Minefield.TYPE_VIBRABOMB)); - player.getTurnInitBonus(); - return player; - } - - /** - * Setup the player forces and entities for the game - * @param player The player object to setup the forces for - * @return A list of entities for the player - */ - private List setupPlayerForces(Player player) { - boolean useDropship = false; - if (scenario.getCombatRole().isPatrol()) { - for (Entity en : scenario.getAlliesPlayer()) { - if (en.getUnitType() == UnitType.DROPSHIP) { - useDropship = true; - break; - } - } - if (!useDropship) { - for (Unit unit : units) { - if (unit.getEntity().getUnitType() == UnitType.DROPSHIP) { - useDropship = true; - break; - } - } - } - } - var entities = new ArrayList(); - - for (Unit unit : units) { - // Get the Entity - var entity = ASConverter.getUndamagedEntity(unit.getEntity()); - // Set the TempID for auto reporting - if (Objects.isNull(entity)) { - continue; - } - - entity.setExternalIdAsString(unit.getId().toString()); - // Set the owner - entity.setOwner(player); - - // If this unit is a spacecraft, set the crew size and marine size values - if (entity.isLargeCraft() || (entity.getUnitType() == UnitType.SMALL_CRAFT)) { - entity.setNCrew(unit.getActiveCrew().size()); - entity.setNMarines(unit.getMarineCount()); - } - // Calculate deployment round - int deploymentRound = entity.getDeployRound(); - if (!(scenario instanceof AtBDynamicScenario)) { - int speed = entity.getWalkMP(); - if (entity.getJumpMP() > 0) { - if (entity instanceof Infantry) { - speed = entity.getJumpMP(); - } else { - speed++; - } - } - // Set scenario type-specific delay - deploymentRound = Math.max(entity.getDeployRound(), scenario.getDeploymentDelay() - speed); - // Lances deployed in scout roles always deploy units in 6-walking speed turns - if (scenario.getCombatRole().isPatrol() - && (scenario.getCombatTeamById(campaign) != null) - && (scenario.getCombatTeamById(campaign).getForceId() == scenario.getCombatTeamId()) - && !useDropship) { - deploymentRound = Math.max(deploymentRound, 6 - speed); - } - } - entity.setDeployRound(deploymentRound); - var force = campaign.getForceFor(unit); - if (force != null) { - entity.setForceString(force.getFullMMName()); - } else if (!unit.getEntity().getForceString().isBlank()) { - // this was added mostly to make it easier to run tests - entity.setForceString(unit.getEntity().getForceString()); - } - var newCrewRef = new CrewRefBreak(unit.getEntity().getCrew()).copy(); - entity.setCrew(newCrewRef); - entities.add(entity); - } - - for (Entity entity : scenario.getAlliesPlayer()) { - if (null == entity) { - continue; - } - entity.setOwner(player); - - int deploymentRound = entity.getDeployRound(); - if (!(scenario instanceof AtBDynamicScenario)) { - int speed = entity.getWalkMP(); - if (entity.getJumpMP() > 0) { - if (entity instanceof Infantry) { - speed = entity.getJumpMP(); - } else { - speed++; - } - } - deploymentRound = Math.max(entity.getDeployRound(), scenario.getDeploymentDelay() - speed); - if (!useDropship - && scenario.getCombatRole().isPatrol() - && (scenario.getCombatTeamById(campaign) != null) - && (scenario.getCombatTeamById(campaign).getForceId() == scenario.getCombatTeamId())) { - deploymentRound = Math.max(deploymentRound, 6 - speed); - } - } - - entity.setDeployRound(deploymentRound); - entities.add(entity); - } - - return entities; - } - - /** - * Setup the map settings for the game, not relevant at the moment, as the map settings are not used in the autoresolve currently - * @return The map settings object - */ - private MapSettings setupMapSettings() { - MapSettings mapSettings = MapSettings.getInstance(); - mapSettings.setBoardSize(scenario.getMapX(), scenario.getMapY()); - mapSettings.setMapSize(1, 1); - mapSettings.getBoardsSelectedVector().clear(); - - // if the scenario is taking place in space, do space settings instead - if (scenario.getBoardType() == Scenario.T_SPACE - || scenario.getTerrainType().equals("Space")) { - mapSettings.setMedium(MapSettings.MEDIUM_SPACE); - mapSettings.getBoardsSelectedVector().add(MapSettings.BOARD_GENERATED); - } else if (scenario.isUsingFixedMap()) { - String board = scenario.getMap().replace(".board", ""); - board = board.replace("\\", "/"); - mapSettings.getBoardsSelectedVector().add(board); - - if (scenario.getBoardType() == Scenario.T_ATMOSPHERE) { - mapSettings.setMedium(MapSettings.MEDIUM_ATMOSPHERE); - } - } else { - File mapgenFile = new File("data/mapgen/" + scenario.getMap() + ".xml"); - try (InputStream is = new FileInputStream(mapgenFile)) { - mapSettings = MapSettings.getInstance(is); - } catch (IOException ex) { - Sentry.captureException(ex); - logger.error( - String.format("Could not load map file data/mapgen/%s.xml", scenario.getMap()), - ex); - } - - if (scenario.getBoardType() == Scenario.T_ATMOSPHERE) { - mapSettings.setMedium(MapSettings.MEDIUM_ATMOSPHERE); - } - - // duplicate code, but getting a new instance of map settings resets the size - // parameters - mapSettings.setBoardSize(scenario.getMapX(), scenario.getMapY()); - mapSettings.setMapSize(1, 1); - mapSettings.getBoardsSelectedVector().add(MapSettings.BOARD_GENERATED); - } - return mapSettings; - } - - /** - * Configure the bot player object with the bot force data - * @param bot The bot player object - * @param botForce The bot force data - */ - private void configureBot(Player bot, BotForce botForce) { - bot.setTeam(botForce.getTeam()); - // set deployment - bot.setStartingPos(botForce.getStartingPos()); - bot.setStartOffset(botForce.getStartOffset()); - bot.setStartWidth(botForce.getStartWidth()); - bot.setStartingAnyNWx(botForce.getStartingAnyNWx()); - bot.setStartingAnyNWy(botForce.getStartingAnyNWy()); - bot.setStartingAnySEx(botForce.getStartingAnySEx()); - bot.setStartingAnySEy(botForce.getStartingAnySEy()); - - // set camo - bot.setCamouflage(botForce.getCamouflage().clone()); - bot.setColour(botForce.getColour()); - } - - /** - * Setup the bot entities for the game - * @param bot The bot player object - * @param originalEntities The original entities for the bot - * @param deployRound The deployment round for the bot - * @return A list of entities for the bot - */ - private List setupBotEntities(Player bot, List originalEntities, int deployRound) { - String forceName = bot.getName() + "|1"; - var entities = new ArrayList(); - - for (Entity originalBotEntity : originalEntities) { - var entity = ASConverter.getUndamagedEntity(originalBotEntity); - if (entity == null) { - logger.warn("Could not convert entity for bot {} - {}", bot.getName(), originalBotEntity); - continue; - } - - entity.setOwner(bot); - entity.setForceString(forceName); - entity.setCrew(new CrewRefBreak(entity.getCrew()).copy()); - entity.setId(originalBotEntity.getId()); - entity.setExternalIdAsString(originalBotEntity.getExternalIdAsString()); - entity.setCommander(originalBotEntity.isCommander()); - - if (entity.getDeployRound() == 0) { - entity.setDeployRound(deployRound); - } - entities.add(entity); - } - return entities; - } - - /** - * Get the planetary conditions for the game, not used at the moment in the auto resolve, but planed for the future - * @return The planetary conditions object - */ - private PlanetaryConditions getPlanetaryConditions() { - PlanetaryConditions planetaryConditions = new PlanetaryConditions(); - if (campaign.getCampaignOptions().isUseLightConditions()) { - planetaryConditions.setLight(scenario.getLight()); - } - if (campaign.getCampaignOptions().isUseWeatherConditions()) { - planetaryConditions.setWeather(scenario.getWeather()); - planetaryConditions.setWind(scenario.getWind()); - planetaryConditions.setFog(scenario.getFog()); - planetaryConditions.setEMI(scenario.getEMI()); - planetaryConditions.setBlowingSand(scenario.getBlowingSand()); - planetaryConditions.setTemperature(scenario.getModifiedTemperature()); - } - if (campaign.getCampaignOptions().isUsePlanetaryConditions()) { - planetaryConditions.setAtmosphere(scenario.getAtmosphere()); - planetaryConditions.setGravity(scenario.getGravity()); - } - return planetaryConditions; - } - - /** - * Send the entities to the game object - * @param entities The entities to send - * @param game the game object to send the entities to - */ - private void sendEntities(List entities, SimulationContext game) { - Map forceMapping = new HashMap<>(); - for (final Entity entity : new ArrayList<>(entities)) { - if (entity instanceof ProtoMek) { - int numPlayerProtos = game.getSelectedEntityCount(new EntitySelector() { - private final int ownerId = entity.getOwnerId(); - @Override - public boolean accept(Entity entity) { - return (entity instanceof ProtoMek) && (ownerId == entity.getOwnerId()); - } - }); - - entity.setUnitNumber((short) (numPlayerProtos / 5)); - } - - if (Entity.NONE == entity.getId()) { - entity.setId(game.getNextEntityId()); - } - - // Give the unit a spotlight, if it has the spotlight quirk - entity.setExternalSearchlight(entity.hasExternalSearchlight() - || entity.hasQuirk(OptionsConstants.QUIRK_POS_SEARCHLIGHT)); - game.getPlayer(entity.getOwnerId()).changeInitialEntityCount(1); - game.getPlayer(entity.getOwnerId()).changeInitialBV(entity.calculateBattleValue()); +public abstract class SetupForces { - // Restore forces from MULs or other external sources from the forceString, if - // any - if (!entity.getForceString().isBlank()) { - List forceList = Forces.parseForceString(entity); - int realId = megamek.common.force.Force.NO_FORCE; - boolean topLevel = true; + public abstract void createForcesOnSimulation(SimulationContext context); - for (megamek.common.force.Force force : forceList) { - if (!forceMapping.containsKey(force.getId())) { - if (topLevel) { - realId = game.getForces().addTopLevelForce(force, entity.getOwner()); - } else { - megamek.common.force.Force parent = game.getForces().getForce(realId); - realId = game.getForces().addSubForce(force, parent); - } - forceMapping.put(force.getId(), realId); - } else { - realId = forceMapping.get(force.getId()); - } - topLevel = false; - } - entity.setForceString(""); - entity.setIGame(game); - game.addEntity(entity); - game.getForces().addEntity(entity, realId); - } - } - } } diff --git a/megamek/src/megamek/common/autoresolve/damage/AeroDamageApplier.java b/megamek/src/megamek/common/autoresolve/damage/AeroDamageApplier.java new file mode 100644 index 00000000000..aafdc26542d --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/AeroDamageApplier.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + +import megamek.common.Aero; +import megamek.common.HitData; +import megamek.common.IEntityRemovalConditions; + +import java.util.ArrayList; +import java.util.List; + +import static megamek.common.Compute.randomInt; + +/** + * Applies damage to an Aero entity. + * @param entity Aero entity + * @param crewMustSurvive Whether the crew must survive + * @param entityMustSurvive Whether the entity must survive + * @author Luana Coppio + */ +public record AeroDamageApplier(Aero entity, boolean crewMustSurvive, boolean entityMustSurvive) implements DamageApplier { + + @Override + public int getRandomHitLocation() { + var entity = entity(); + List validLocations = new ArrayList<>(); + for (int i = 0; i < entity.locations(); i++) { + if (entity.getOArmor(i) <= 0) { + continue; + } + if (!entity.isLocationBlownOff(i) && entity.getSI() > 0) { + validLocations.add(i); + } + } + + return validLocations.isEmpty() ? -1 : validLocations.get(randomInt(validLocations.size())); + } + + @Override + public void destroyLocationAfterEjection() { + entity().setDestroyed(true); + entity().setRemovalCondition(IEntityRemovalConditions.REMOVE_DEVASTATED); + } + + @Override + public HitDetails damageInternals(HitDetails hitDetails) { + HitData hit = hitDetails.hit(); + var entity = entity(); + int currentInternalValue = entity.getSI(); + int newInternalValue = Math.max(currentInternalValue + hitDetails.setArmorValueTo(), 0); + entity.setArmor(0, hit); + entity.setSI(newInternalValue); + applyDamageToEquipments(hit); + if (newInternalValue == 0) { + hitDetails = destroyLocation(hitDetails); + } + return hitDetails; + } +} diff --git a/megamek/src/megamek/common/autoresolve/damage/DamageApplier.java b/megamek/src/megamek/common/autoresolve/damage/DamageApplier.java new file mode 100644 index 00000000000..71103e78a1f --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/DamageApplier.java @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + +import megamek.common.*; +import megamek.logging.MMLogger; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author Luana Coppio + */ +public interface DamageApplier { + MMLogger logger = MMLogger.create(DamageApplier.class); + + record HitDetails(HitData hit, int damageToApply, int setArmorValueTo, boolean hitInternal, int hitCrew) { + public HitDetails withCrewDamage(int crewDamage) { + return new HitDetails(hit, damageToApply, setArmorValueTo, hitInternal, crewDamage); + } + public HitDetails killsCrew() { + return new HitDetails(hit, damageToApply, setArmorValueTo, hitInternal, Crew.DEATH); + } + } + + E entity(); + + boolean crewMustSurvive(); + + boolean entityMustSurvive(); + + /** + * Applies damage to the entity in clusters of a given size. + * This is USUALLY the function you will want to use. + * + * @param dmg the total damage to apply + * @param clusterSize the size of the clusters + */ + default int applyDamageInClusters(int dmg, int clusterSize) { + int totalDamage = dmg; + int damageApplied = 0; + while (totalDamage > 0) { + if (entity().isCrippled() && entity().getRemovalCondition() == IEntityRemovalConditions.REMOVE_DEVASTATED) { + // devastated units don't need to take any damage anymore + break; + } + var clusterDamage = Math.min(totalDamage, clusterSize); + applyDamage(clusterDamage); + totalDamage -= clusterDamage; + damageApplied += clusterDamage; + } + return damageApplied; + } + + /** + * Applies damage to the entity. + * + * @param dmg the total damage to apply + */ + default void applyDamage(int dmg) { + int hitLocation = getRandomHitLocation(); + if (hitLocation == -1) { + entity().setDestroyed(true); + return; + } + HitData hit = getHitData(hitLocation); + HitDetails hitDetails = setupHitDetails(hit, dmg); + applyDamage(hitDetails); + } + + /** + * Returns the location to hit. + * + * @return returns a valid random location to be hit. + */ + default int getRandomHitLocation() { + var entity = entity(); + List validLocations = new ArrayList<>(); + for (int i = 0; i < entity.locations(); i++) { + if (entity.getOArmor(i) <= 0) { + continue; + } + var locationIsNotBlownOff = !entity.isLocationBlownOff(i); + var locationIsNotDestroyed = entity.getInternal(i) > 0; + if (locationIsNotBlownOff && locationIsNotDestroyed) { + validLocations.add(i); + } + } + Collections.shuffle(validLocations); + return validLocations.isEmpty() ? -1 : validLocations.get(0); + } + + /** + * Hits the entity with the given hit details. + * + * @param hitDetails the hit details + */ + default void applyDamage(HitDetails hitDetails) { + hitDetails = damageArmor(hitDetails); + if (hitDetails.hitInternal()) { + hitDetails = damageInternals(hitDetails); + } + tryToDamageCrew(hitDetails.hitCrew()); + } + + /** + * Destroys the location after the crew has been ejected. + */ + default void destroyLocationAfterEjection() { + // default implementation does nothing + } + + /** + * Applies damage to the internals of the entity. + * + * @param hitDetails the hit details + */ + default HitDetails damageInternals(HitDetails hitDetails) { + HitData hit = hitDetails.hit(); + var entity = entity(); + int currentInternalValue = entity.getInternal(hit); + int newInternalValue = Math.max(currentInternalValue + hitDetails.setArmorValueTo(), entityMustSurvive() ? 1 : 0); + entity.setArmor(0, hit); + logger.trace("[{}] Damage: {} - Internal at: {}", entity.getDisplayName(), hitDetails.damageToApply(), newInternalValue); + entity.setInternal(newInternalValue, hit); + applyDamageToEquipments(hit); + if (newInternalValue == 0) { + hitDetails = destroyLocation(hitDetails); + } + return hitDetails; + } + + /** + * Destroys the location of the entity. This one is used when you have the HitData. + * + * @param hitDetails the hit details with information about the location + */ + default HitDetails destroyLocation(HitDetails hitDetails) { + destroyLocation(hitDetails.hit().getLocation()); + return hitDetails.killsCrew(); + } + + /** + * Destroys the location of the entity. This one is used when the location is already known. + * + * @param location the location index in the entity + */ + default void destroyLocation(int location) { + var entity = entity(); + logger.trace("[{}] Destroying location {}", entity.getDisplayName(), location); + entity.destroyLocation(location); + entity.setDestroyed(true); + setEntityDestroyed(entity); + } + + /** + * Tries to damage the crew of the entity. If the crew is dead, the entity is marked as destroyed. + * The crew won't be damaged if they are already ejected or already dead. + * This function also does try to not outright kill the crew, as it has proven to be a bit too deadly. + * @param hitCrew the amount of hits to apply to ALL crew + */ + default void tryToDamageCrew(int hitCrew) { + if (hitCrew == 0) { + return; + } + + var entity = entity(); + Crew crew = entity.getCrew(); + if (crew == null || crew.isEjected() || crew.isDead()) { + return; + } + var hits = tryToNotKillTheCrew(hitCrew, crew); + + crew.setHits(hits, 0); + logger.trace("[{}] Crew hit ({} hits)", entity().getDisplayName(), crew.getHits()); + if (crew.isDead()) { + logger.trace("[{}] Crew died", entity().getDisplayName()); + entity.setDestroyed(true); + setEntityDestroyed(entity); + } + } + + /** + * Tries to not kill the crew. This function will set the amount of hits the crew will take. + * If the crew must survive, the crew will try to eject instead, and if they can't be + * ejected, it will set the total hits to DEATH - 1 (so... 5). + * @param hitCrew the amount of hits to apply to ALL crew + * @param crew the crew to apply the hits to + * @return the amount of hits to apply to the crew + */ + private Integer tryToNotKillTheCrew(int hitCrew, Crew crew) { + var hits = Math.min(crew.getHits() + hitCrew, Crew.DEATH); + + if (hits == Crew.DEATH) { + if (crewMustSurvive()) { + hits = Compute.randomIntInclusive(4) + 1; + } + if (tryToEjectCrew()) { + destroyLocationAfterEjection(); + } + } + return hits; + } + + /** + * Sets the entity as destroyed. + * @param entity entity to be set as destroyed + * @param the type of the entity + */ + static void setEntityDestroyed(E entity) { + if (entity.getRemovalCondition() != IEntityRemovalConditions.REMOVE_DEVASTATED) { + entity.setRemovalCondition(IEntityRemovalConditions.REMOVE_SALVAGEABLE); + entity.setSalvage(true); + logger.trace("[{}] Entity destroyed", entity.getDisplayName()); + } + } + + /** + * Sets the entity as destroyed by ejection if possible. + * @param entity entity to be set as destroyed + * @param the type of the entity + */ + static void setEntityDestroyedByEjection(E entity) { + if (entity.getRemovalCondition() != IEntityRemovalConditions.REMOVE_DEVASTATED) { + entity.setRemovalCondition(IEntityRemovalConditions.REMOVE_EJECTED); + entity.setSalvage(true); + logger.trace("[{}] Entity destroyed by ejection", entity.getDisplayName()); + } + } + + /** + * Tries to eject the crew of the entity if possible. + * + * @return true if the crew was ejected + */ + default boolean tryToEjectCrew() { + var entity = entity(); + var crew = entity.getCrew(); + if (crew == null || crew.isEjected() || !entity().isEjectionPossible() || entityMustSurvive()) { + return false; + } + crew.setEjected(true); + entity.setDestroyed(true); + setEntityDestroyedByEjection(entity); + logger.trace("[{}] Crew ejected", entity().getDisplayName()); + return true; + } + + /** + * Applies damage to the equipments of the entity. + * + * @param hit the hit data with information about the location + */ + default void applyDamageToEquipments(HitData hit) { + var entity = entity(); + var criticalSlots = entity.getCriticalSlots(hit.getLocation()); + Collections.shuffle(criticalSlots); + for (CriticalSlot slot : criticalSlots) { + if (slot != null && slot.isHittable() && !slot.isHit() && !slot.isDestroyed()) { + slot.setHit(true); + slot.setDestroyed(true); + logger.trace("[{}] Equipment destroyed: {}", entity.getDisplayName(), slot); + break; + } + } + } + + /** + * Applies damage only to the armor of the entity. + * + * @param hitDetails the hit details + */ + default HitDetails damageArmor(HitDetails hitDetails) { + var currentArmorValue = Math.max(hitDetails.setArmorValueTo(), 0); + entity().setArmor(currentArmorValue, hitDetails.hit()); + logger.trace("[{}] Damage: {} - Armor at: {}", entity().getDisplayName(), hitDetails.damageToApply(), currentArmorValue); + return hitDetails; + } + + /** + * Returns the hit data for the given hit location. + * + * @param hitLocation the hit location + * @return the hit data + */ + default HitData getHitData(int hitLocation) { + return new HitData(hitLocation, false, HitData.EFFECT_NONE); + } + + /** + * Sets up the hit details for the given hit and damage. + * + * @param hit the hit data + * @param damageToApply the damage to apply + * @return the hit details + */ + default HitDetails setupHitDetails(HitData hit, int damageToApply) { + int currentArmorValue = entity().getArmor(hit); + int setArmorValueTo = currentArmorValue - damageToApply; + boolean hitInternal = setArmorValueTo < 0; + int hitCrew = hitInternal ? 1 : 0; + + return new HitDetails(hit, damageToApply, setArmorValueTo, hitInternal, hitCrew); + } +} diff --git a/megamek/src/megamek/common/autoresolve/damage/DamageApplierChooser.java b/megamek/src/megamek/common/autoresolve/damage/DamageApplierChooser.java new file mode 100644 index 00000000000..66519b3888e --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/DamageApplierChooser.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + +import megamek.common.*; + +/** + * @author Luana Coppio + */ +public class DamageApplierChooser { + + + /** + * Choose the correct DamageHandler for the given entity. + * A damage handler is a class that handles applying damage on an entity, be it a Mek, Infantry, etc. + * It can damage internal, armor, cause criticals, kill crew, set limbs as blown-off, can even destroy the entity, + * @param entity the entity to choose the handler for + * @return the correct DamageHandler for the given entity + */ + public static DamageApplier choose(Entity entity) { + return choose(entity, EntityFinalState.ANY); + } + + /** + * Choose the correct DamageHandler for the given entity. + * A damage handler is a class that handles applying damage on an entity, be it a Mek, Infantry, etc. + * It can damage internal, armor, cause criticals, kill crew, set limbs as blown-off, can even destroy the entity, + * This one also accepts parameters to indicate if the crew must survive and if the entity must survive. + * @param entity the entity to choose the handler for + * @param entityFinalState if the crew must survive and/or entity must survive + * @return the correct DamageHandler for the given entity + */ + public static DamageApplier choose( + Entity entity, EntityFinalState entityFinalState) { + return choose(entity, entityFinalState.crewMustSurvive, entityFinalState.entityMustSurvive); + } + + /** + * Choose the correct DamageHandler for the given entity. + * A damage handler is a class that handles applying damage on an entity, be it a Mek, Infantry, etc. + * It can damage internal, armor, cause critical, kill crew, set limbs as blown-off, can even destroy the entity, + * This one also accepts parameters to indicate if the crew must survive and if the entity must survive. + * @param entity the entity to choose the handler for + * @param crewMustSurvive if the crew must survive + * @param entityMustSurvive if the entity must survive + * @return the correct DamageHandler for the given entity + */ + public static DamageApplier choose( + Entity entity, boolean crewMustSurvive, boolean entityMustSurvive) { + + if (entity instanceof Infantry) { + return new InfantryDamageApplier((Infantry) entity); + } else if (entity instanceof Mek) { + return new MekDamageApplier((Mek) entity, crewMustSurvive, entityMustSurvive); + } else if (entity instanceof GunEmplacement) { + return new GunEmplacementDamageApplier((GunEmplacement) entity, crewMustSurvive, entityMustSurvive); + } else if (entity instanceof Aero) { + return new AeroDamageApplier((Aero) entity, crewMustSurvive, entityMustSurvive); + } + return new SimpleDamageApplier(entity, crewMustSurvive, entityMustSurvive); + } + + /** + * Automatically applies damage to the entity based on the "removal condition" provided. + * The damage is calculated as being a percentage of the total armor of the unit, then it is transformed in a roll of dices + * which the average roll is that amount, then the total damage is calculated and applied in clusters of 5 damage. It rolls a minimum of + * 1 dice of damage. + * The removal condition is a code that indicates why the entity is being removed from the game. + * It will decide if the unit or entity must survive based on the type of removal condition. + * The removal conditions are: + * * RETREAT: crew must survive, entity must survive, 80% of the total armor is applied as damage + * * SALVAGEABLE: crew may die, entity must be destroyed, 75% of the total armor is applied as damage + * * CAPTURED: crew must survive, entity must be destroyed, 33% of the total armor is applied as damage + * * EJECTED: crew must survive, entity must be destroyed, 33% of the total armor is applied as damage + * * DEVASTATED: crew may survive, entity must be destroyed, 500% of the total armor is applied as damage + * * OTHER: crew may die, entity may be destroyed, 33% of the total armor applied as damage + * The amount of damage applied present right now was decided arbitrarily and can be changed later, maybe even make it follow + * a config file, client settings, etc. + * + * @param entity the entity to choose the handler for + * @param removalCondition the reason why the entity is being removed + */ + public static void damageRemovedEntity(Entity entity, int removalCondition) { + var numberOfDices = getNumberOfDices(entity, removalCondition); + var damage = Compute.d6(numberOfDices); + var clusterSize = 5; + + var retreating = removalCondition == IEntityRemovalConditions.REMOVE_IN_RETREAT; + var captured = removalCondition == IEntityRemovalConditions.REMOVE_CAPTURED; + var ejected = removalCondition == IEntityRemovalConditions.REMOVE_EJECTED; + var devastated = removalCondition == IEntityRemovalConditions.REMOVE_DEVASTATED; + var salvageable = removalCondition == IEntityRemovalConditions.REMOVE_SALVAGEABLE; + + var crewMustSurvive = retreating || captured || ejected; + var entityMustSurvive = !devastated && !salvageable && !ejected; + + DamageApplierChooser.choose(entity, crewMustSurvive, entityMustSurvive) + .applyDamageInClusters(damage, clusterSize); + } + + private static int getNumberOfDices(Entity entity, int removalCondition) { + double targetDamage = switch (removalCondition) { + case IEntityRemovalConditions.REMOVE_CAPTURED, IEntityRemovalConditions.REMOVE_EJECTED -> entity.getTotalOArmor() * 1.2; + case IEntityRemovalConditions.REMOVE_DEVASTATED -> entity.getTotalOArmor() * 5; // no damage is actually applied + case IEntityRemovalConditions.REMOVE_IN_RETREAT -> entity.getTotalOArmor() * 0.8; + case IEntityRemovalConditions.REMOVE_SALVAGEABLE -> entity.getTotalOArmor() * 0.75; + default -> entity.getTotalOArmor() * 0.33; + }; + + return Math.max(1, (int) (targetDamage / 6 / 0.6)); + } + +} diff --git a/megamek/src/megamek/common/autoresolve/damage/EntityFinalState.java b/megamek/src/megamek/common/autoresolve/damage/EntityFinalState.java new file mode 100644 index 00000000000..2affacd308d --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/EntityFinalState.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + + +public enum EntityFinalState { + ANY(false, false), + CREW_MUST_SURVIVE(true, false), + ENTITY_MUST_SURVIVE(false, true), + CREW_AND_ENTITY_MUST_SURVIVE(true, true); + + final boolean crewMustSurvive; + final boolean entityMustSurvive; + + EntityFinalState(boolean crewMustSurvive, boolean entityMustSurvive) { + this.crewMustSurvive = crewMustSurvive; + this.entityMustSurvive = entityMustSurvive; + } +} diff --git a/megamek/src/megamek/common/autoresolve/damage/GunEmplacementDamageApplier.java b/megamek/src/megamek/common/autoresolve/damage/GunEmplacementDamageApplier.java new file mode 100644 index 00000000000..d481c60a7fb --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/GunEmplacementDamageApplier.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + + +import megamek.common.GunEmplacement; + +public record GunEmplacementDamageApplier(GunEmplacement entity, boolean crewMustSurvive, boolean entityMustSurvive) + implements DamageApplier { + + @Override + public int getRandomHitLocation() { + if (entity.isDestroyed()) { + return -1; + } + return 0; + } + +} diff --git a/megamek/src/megamek/common/autoresolve/damage/InfantryDamageApplier.java b/megamek/src/megamek/common/autoresolve/damage/InfantryDamageApplier.java new file mode 100644 index 00000000000..10674a88365 --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/InfantryDamageApplier.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + +import megamek.common.BattleArmor; +import megamek.common.Infantry; + +/** + * @author Luana Coppio + */ +public record InfantryDamageApplier(Infantry entity) implements DamageApplier { + + @Override + public boolean crewMustSurvive() { + return false; + } + + @Override + public boolean entityMustSurvive() { + return false; + } + + @Override + public HitDetails damageArmor(HitDetails hitDetails) { + if (entity() instanceof BattleArmor te) { + for (int i = 0; i < te.getTroopers(); i++) { + var currentValueArmor = te.getArmor(BattleArmor.LOC_SQUAD); + var newArmorValue = Math.max(currentValueArmor - 1, 0); + if (te.getArmor(BattleArmor.LOC_TROOPER_1 + i) > 0) { + te.setArmor(newArmorValue, BattleArmor.LOC_TROOPER_1 + i); + } + } + } + if (entity().isCrippled()) { + entity().setDestroyed(true); + } + return hitDetails; + } + + @Override + public HitDetails damageInternals(HitDetails hitDetails) { + if (entity() instanceof BattleArmor te) { + for (int i = 0; i < te.getTroopers(); i++) { + var currentValue = te.getInternal(BattleArmor.LOC_SQUAD); + var newValue = Math.max(currentValue - 1, 0); + if (te.getInternal(BattleArmor.LOC_TROOPER_1 + i) > 0) { + te.setInternal(newValue, BattleArmor.LOC_TROOPER_1 + i); + } + } + } else { + var currentValue = entity().getInternal(Infantry.LOC_INFANTRY); + var newValue = Math.max(currentValue - 1, 0); + entity().setInternal(newValue, Infantry.LOC_INFANTRY); + } + + if (entity().isCrippled()) { + entity().setDestroyed(true); + } + return hitDetails; + } +} diff --git a/megamek/src/megamek/common/autoresolve/damage/MekDamageApplier.java b/megamek/src/megamek/common/autoresolve/damage/MekDamageApplier.java new file mode 100644 index 00000000000..2a7b6a5a817 --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/MekDamageApplier.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + + +import megamek.common.*; +import megamek.common.util.weightedMaps.WeightedDoubleMap; + +import java.util.Collections; +import java.util.Objects; +import java.util.Set; + +import static megamek.common.Compute.rollD6; +import static megamek.common.CriticalSlot.TYPE_SYSTEM; + +/** + * @author Luana Coppio + */ +public record MekDamageApplier(Mek entity, boolean crewMustSurvive, boolean entityMustSurvive) implements DamageApplier { + + // Target roll to hit the rear arc of the mek randomly + private static final int REAR_ARC_HIT_CHANCE = 11; + private static final Set criticalSystems = Set.of(Mek.SYSTEM_ENGINE, Mek.SYSTEM_GYRO, Mek.SYSTEM_LIFE_SUPPORT, + Mek.SYSTEM_SENSORS, Mek.SYSTEM_COCKPIT); + private static final Set criticalLocations = Set.of(Mek.LOC_CT, Mek.LOC_HEAD, Mek.LOC_LT, Mek.LOC_RT); + + @Override + public int getRandomHitLocation() { + var entity = entity(); + WeightedDoubleMap weightedDoubleMap = new WeightedDoubleMap<>(); + for (int i = 0; i < entity.locations(); i++) { + if (entity.getOArmor(i) <= 0) { + continue; + } + var locationIsNotBlownOff = !entity.isLocationBlownOff(i); + var locationIsNotDestroyed = entity.getInternal(i) > 0; + var locationIsNotHead = Mek.LOC_HEAD != i; + var weight = locationIsNotHead ? 6.0 : 1.0; + if (locationIsNotBlownOff && locationIsNotDestroyed) { + weightedDoubleMap.add(weight, i); + } + } + return weightedDoubleMap.randomOptionalItem().orElse(-1); + } + + @Override + public HitDetails setupHitDetails(HitData hit, int dmg) { + int currentArmorValue = entity.getArmor(hit); + int setArmorValueTo = currentArmorValue - dmg; + boolean hitInternal = setArmorValueTo < 0; + boolean isHeadHit = (entity.getCockpitType() != Mek.COCKPIT_TORSO_MOUNTED) && (hit.getLocation() == Mek.LOC_HEAD); + int hitCrew = isHeadHit || hitInternal ? 1 : 0; + + return new HitDetails(hit, dmg, setArmorValueTo, hitInternal, hitCrew); + } + + @Override + public HitData getHitData(int hitLocation) { + boolean hitRearArc = Compute.rollD6(2).isTargetRollSuccess(REAR_ARC_HIT_CHANCE); + return getHitData(hitLocation, hitRearArc); + } + + /** + * Returns the hit data for the given location, considering if the hit is on the rear arc or not. + * @param hitLocation the location of the hit + * @param hitRearArc if the hit is on the rear arc + * @return the hit data + */ + public HitData getHitData(int hitLocation, boolean hitRearArc) { + return new HitData(hitLocation, hitRearArc && hitLocationHasRear(hitLocation), HitData.EFFECT_NONE); + } + + private boolean hitLocationHasRear(int hitLocation) { + return switch(hitLocation) { + case Mek.LOC_CT, Mek.LOC_LT, Mek.LOC_RT -> true; + default -> false; + }; + } + + + @Override + public HitDetails destroyLocation(HitDetails hitDetails) { + var entity = entity(); + var hit = hitDetails.hit(); + entity.destroyLocation(hit.getLocation()); + if (hit.getLocation() == Mek.LOC_CT || hit.getLocation() == Mek.LOC_HEAD) { + entity.setDestroyed(true); + if (hit.getLocation() == Mek.LOC_HEAD) { + if (entity.isEjectionPossible()) { + var toHit = new ToHitData(); + toHit.addModifier(4, "Ejection"); + if (rollD6(2).isTargetRollSuccess(toHit)) { + hitDetails = hitDetails.withCrewDamage(2); + } else { + hitDetails = hitDetails.killsCrew(); + } + } else { + hitDetails = hitDetails.killsCrew(); + } + DamageApplier.setEntityDestroyed(entity); + } else { + entity.setSalvage(false); + entity.setRemovalCondition(IEntityRemovalConditions.REMOVE_DEVASTATED); + logger.trace("[{}] Mek devastated!", entity.getDisplayName()); + } + } + if (hit.getLocation() == Mek.LOC_RLEG || hit.getLocation() == Mek.LOC_LLEG) { + // leg destroyed causes a fall which damages the pilot + hitDetails.withCrewDamage(1); + } + return hitDetails; + } + + @Override + public void applyDamageToEquipments(HitData hit) { + var entity = entity(); + var criticalSlots = entity.getCriticalSlots(hit.getLocation()); + Collections.shuffle(criticalSlots); + if (entityMustSurvive() && criticalLocations.contains(hit.getLocation())) { + criticalSlots = criticalSlots.stream().filter(Objects::nonNull) + .filter(slot -> !(slot.getType() == TYPE_SYSTEM && criticalSystems.contains(slot.getIndex()))) + .toList(); + } + for (CriticalSlot slot : criticalSlots) { + if (slot != null && slot.isHittable() && !slot.isHit() && !slot.isDestroyed()) { + slot.setHit(true); + slot.setDestroyed(true); + logger.trace("[{}] Slot {} destroyed", entity.getDisplayName(), slot.getIndex()); + break; + } + } + // TODO: check if damage on ammo + // TODO: check if damage on life support + // TODO: check if damage on cockpit + } + + @Override + public void destroyLocationAfterEjection(){ + var entity = entity(); + entity.destroyLocation(Mek.LOC_HEAD); + } + + @Override + public HitDetails damageInternals(HitDetails hitDetails) { + HitData hit = hitDetails.hit(); + var entity = entity(); + int currentInternalValue = entity.getInternal(hit); + int newInternalValue = Math.max(currentInternalValue + hitDetails.setArmorValueTo(), 0); + entity.setArmor(0, hit); + if (entityMustSurvive() && !canLoseLocation(hit)) { + newInternalValue = Math.max(newInternalValue, Compute.d6()); + } + entity.setInternal(newInternalValue, hit); + applyDamageToEquipments(hit); + if (newInternalValue == 0) { + hitDetails = destroyLocation(hitDetails); + } + return hitDetails; + } + + private boolean canLoseLocation(HitData hitData) { + var location = hitData.getLocation(); + if (!entityMustSurvive()) { + return true; + } + + if (location == Mek.LOC_CT || location == Mek.LOC_HEAD) { + return false; + } + if (location == Mek.LOC_LT || location == Mek.LOC_RT) { + if (entity.getCritical(location, Mek.SYSTEM_ENGINE) == null) { + return true; + } + } + if (location == Mek.LOC_LLEG || location == Mek.LOC_RLEG) { + return !entity.isLocationBlownOff(Mek.LOC_LLEG) && !entity.isLocationBlownOff(Mek.LOC_RLEG); + } + + return true; + } +} diff --git a/megamek/src/megamek/common/autoresolve/damage/SimpleDamageApplier.java b/megamek/src/megamek/common/autoresolve/damage/SimpleDamageApplier.java new file mode 100644 index 00000000000..aad07012667 --- /dev/null +++ b/megamek/src/megamek/common/autoresolve/damage/SimpleDamageApplier.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.damage; + +import megamek.common.Entity; + +/** + * @author Luana Coppio + */ +public record SimpleDamageApplier(Entity entity, boolean crewMustSurvive, boolean entityMustSurvive) + implements DamageApplier {} diff --git a/megamek/src/megamek/common/autoresolve/event/AutoResolveConcludedEvent.java b/megamek/src/megamek/common/autoresolve/event/AutoResolveConcludedEvent.java index 47ea24aab58..03aa2b8cf58 100644 --- a/megamek/src/megamek/common/autoresolve/event/AutoResolveConcludedEvent.java +++ b/megamek/src/megamek/common/autoresolve/event/AutoResolveConcludedEvent.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2025 - 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.common.autoresolve.event; /* * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. * @@ -17,16 +33,13 @@ * along with MekHQ. If not, see . */ -package megamek.common.autoresolve.event; - import megamek.common.Entity; import megamek.common.IEntityRemovalConditions; import megamek.common.IGame; import megamek.common.annotations.Nullable; +import megamek.common.autoresolve.acar.SimulationContext; import megamek.common.event.PostGameResolution; import megamek.server.victory.VictoryResult; -import mekhq.campaign.autoresolve.acar.SimulationContext; -import mekhq.campaign.mission.AtBScenario; import org.apache.commons.lang3.builder.ToStringBuilder; import java.io.File; @@ -40,7 +53,6 @@ public class AutoResolveConcludedEvent implements PostGameResolution { private final IGame game; private final boolean controlledScenario; - private final AtBScenario scenario; private final Vector survived = new Vector<>(); private final Vector retreated = new Vector<>(); private final Vector graveyard = new Vector<>(); @@ -57,7 +69,6 @@ public AutoResolveConcludedEvent(SimulationContext game, VictoryResult victoryRe this.controlledScenario = (game.getLocalPlayer().getTeam() == victoryResult.getWinningTeam()); this.victoryResult = victoryResult; this.game = game; - this.scenario = game.getScenario(); this.logFile = logFile; game.getInGameObjects().stream() @@ -106,10 +117,6 @@ public AutoResolveConcludedEvent(SimulationContext game, VictoryResult victoryRe .forEach(wrecked::addElement); } - public AtBScenario getScenario() { - return scenario; - } - public VictoryResult getVictoryResult() { return victoryResult; } diff --git a/megamek/src/megamek/common/internationalization/Internationalization.java b/megamek/src/megamek/common/internationalization/Internationalization.java index 1ba61d4b8f0..1aa5b806dbe 100644 --- a/megamek/src/megamek/common/internationalization/Internationalization.java +++ b/megamek/src/megamek/common/internationalization/Internationalization.java @@ -1,22 +1,16 @@ /* - * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2025 - The MegaMek Team. All Rights Reserved. * - * This file is part of MekHQ. + * 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. * - * MekHQ 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. - * - * MekHQ 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 MekHQ. 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.common.internationalization; import megamek.MegaMek; @@ -37,21 +31,16 @@ */ public class Internationalization { - private final String prefix; - protected static final String DEFAULT = "messages"; + private final String defaultBundle; private final ConcurrentHashMap resourceBundles = new ConcurrentHashMap<>(); - private static Internationalization instance; - - { - instance = new Internationalization(); - } + protected static Internationalization instance; - protected Internationalization() { - prefix = "megamek.client."; + static { + instance = new Internationalization("megamek.client.messages"); } - protected Internationalization(String prefix) { - this.prefix = prefix; + protected Internationalization(String defaultBundle) { + this.defaultBundle = defaultBundle; } public static Internationalization getInstance() { @@ -73,7 +62,7 @@ public ResourceBundle newBundle(String baseName, Locale locale, String format, C ResourceBundle getResourceBundle(String bundleName) { return resourceBundles.computeIfAbsent(bundleName, k -> - ResourceBundle.getBundle(prefix + bundleName, MegaMek.getMMOptions().getLocale(), new UTF8Control())); + ResourceBundle.getBundle(bundleName, MegaMek.getMMOptions().getLocale(), new UTF8Control())); } /** @@ -95,7 +84,7 @@ public static String getTextAt(String bundleName, String key) { * @return the localized string */ public static String getText(String key) { - return getTextAt(DEFAULT, key); + return getTextAt(getInstance().defaultBundle, key); } /** @@ -105,7 +94,7 @@ public static String getText(String key) { * @return the localized string */ public static String getFormattedText(String key, Object... args) { - return MessageFormat.format(getFormattedTextAt(DEFAULT, key), args); + return MessageFormat.format(getFormattedTextAt(getInstance().defaultBundle, key), args); } /** diff --git a/megamek/src/megamek/common/weapons/capitalweapons/NLWeapon.java b/megamek/src/megamek/common/weapons/capitalweapons/NLWeapon.java index 8102e42e9f0..64bca10aa43 100644 --- a/megamek/src/megamek/common/weapons/capitalweapons/NLWeapon.java +++ b/megamek/src/megamek/common/weapons/capitalweapons/NLWeapon.java @@ -34,7 +34,7 @@ public NLWeapon() { super(); atClass = CLASS_CAPITAL_LASER; capital = true; - flags = flags.andNot(F_PROTO_WEAPON).andNot(F_MEK_WEAPON).andNot(F_TANK_WEAPON);; + flags = flags.andNot(F_PROTO_WEAPON).andNot(F_MEK_WEAPON).andNot(F_TANK_WEAPON); } @Override diff --git a/megamek/src/megamek/common/weapons/capitalweapons/NavalACWeapon.java b/megamek/src/megamek/common/weapons/capitalweapons/NavalACWeapon.java index 5f66e21e6f1..8bfd674db03 100644 --- a/megamek/src/megamek/common/weapons/capitalweapons/NavalACWeapon.java +++ b/megamek/src/megamek/common/weapons/capitalweapons/NavalACWeapon.java @@ -35,7 +35,7 @@ public NavalACWeapon() { super(); ammoType = AmmoType.T_NAC; atClass = CLASS_CAPITAL_AC; - flags = flags.or(F_DIRECT_FIRE).or(F_BALLISTIC).andNot(F_MEK_WEAPON).andNot(F_TANK_WEAPON);; + flags = flags.or(F_DIRECT_FIRE).or(F_BALLISTIC).andNot(F_MEK_WEAPON).andNot(F_TANK_WEAPON); capital = true; } diff --git a/megamek/src/megamek/common/weapons/capitalweapons/SubCapCannonWeapon.java b/megamek/src/megamek/common/weapons/capitalweapons/SubCapCannonWeapon.java index c68149b370a..e8dedfe0183 100644 --- a/megamek/src/megamek/common/weapons/capitalweapons/SubCapCannonWeapon.java +++ b/megamek/src/megamek/common/weapons/capitalweapons/SubCapCannonWeapon.java @@ -35,7 +35,7 @@ public SubCapCannonWeapon() { super(); ammoType = AmmoType.T_SCC; atClass = CLASS_CAPITAL_AC; - flags = flags.or(F_DIRECT_FIRE).or(F_BALLISTIC).andNot(F_PROTO_WEAPON).andNot(F_MEK_WEAPON).andNot(F_TANK_WEAPON);; + flags = flags.or(F_DIRECT_FIRE).or(F_BALLISTIC).andNot(F_PROTO_WEAPON).andNot(F_MEK_WEAPON).andNot(F_TANK_WEAPON); capital = true; subCapital = true; } diff --git a/megamek/src/megamek/common/weapons/lasers/ISXPulseLaserSmall.java b/megamek/src/megamek/common/weapons/lasers/ISXPulseLaserSmall.java index 40e9e3b48ae..c9fb21b3d34 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISXPulseLaserSmall.java +++ b/megamek/src/megamek/common/weapons/lasers/ISXPulseLaserSmall.java @@ -54,7 +54,7 @@ public ISXPulseLaserSmall() { maxRange = RANGE_SHORT; shortAV = 3; cost = 31000; - flags = flags.or(F_BURST_FIRE).andNot(F_PROTO_WEAPON);; + flags = flags.or(F_BURST_FIRE).andNot(F_PROTO_WEAPON); rulesRefs = "321, TO"; //Tech Progression tweaked to combine IntOps with TRO Prototypes/3145 NTNU RS techAdvancement.setTechBase(TECH_BASE_IS).setTechRating(RATING_E) @@ -63,7 +63,7 @@ public ISXPulseLaserSmall() { .setProductionFactions(F_LC) .setStaticTechLevel(SimpleTechLevel.STANDARD); } - + @Override public boolean isAlphaStrikePointDefense() { return true;