Skip to content

Commit

Permalink
Merge pull request #6372 from Scoppio/feat/acar-v2
Browse files Browse the repository at this point in the history
feat/ACAR-2025.01.beta
  • Loading branch information
Sleet01 authored Jan 9, 2025
2 parents 95bbd7d + 0ee346c commit 7bb40eb
Show file tree
Hide file tree
Showing 151 changed files with 11,385 additions and 191 deletions.
Binary file added megamek/data/images/misc/acar_splash_hd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
145 changes: 145 additions & 0 deletions megamek/i18n/megamek/client/acs-report-messages.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
#
# Copyright (c) 2020-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.

################################################################################
## Header / Starting Scenario
################################################################################
acar.header=<h1>Abstract Combat Auto Resolution</h1>
acar.header.startingScenario=<h2>\u25ce Starting Scenario Phase</h2>
acar.header.teamFormations=Team {0} Formations:
acar.startingScenario.numberOfUnits={0} has {1} units.
acar.startingScenario.unitStats={0}, Armor: {1}, Structure: {2}, Crew: {3}, Hits: {4}
acar.shortBlurb=short blurb

################################################################################
## Summary
################################################################################
acar.header.summary=<h2>\u203b Summary</h2>
acar.link.backRef=back to top
acar.summary.roundCount=Round {0}
acar.summary.movementPhase=Movement Phase
acar.summary.firingPhase=Firing Phase
acar.summary.endPhase=End Phase
acar.summary.endOfCombat=End of Combat
acar.summary.teamReport={0} Report
acar.summary.playerReport=Player {0} Report
acar.summary.player.remainingUnits=Remaining Units
acar.summary.player.destroyedUnits=Destroyed Units
acar.summary.player.retreatingUnits=Retreating Units
acar.summary.scenarioResult=Scenario Result

################################################################################
## Initiative Phase / Deployment
################################################################################
acar.initiative.freePlaceholder={0}
acar.initiative.roundHeader=<h2>\u25d4 Initiative Phase for Round {0}</h2>
acar.initiative.startOfGameHeader=<h2>\u25d4 Initiative Phase for Start of Game Deployment</h2>
acar.initiative.rollAnnouncement=\u25ba {0} initiative rolls.
acar.initiative.rollAnnouncementWithBonus=\u25ba {0} initiative rolls, they have {1} bonus.
acar.initiative.generalTurnOrder=\u25b6 The general turn order is:
acar.initiative.turnOrderHeader=<h3>\u25bc The turn order is:</h3>
acar.initiative.turnOrderEntry=\u25ba {0}({1}), rolled {2}
acar.initiative.deploymentHeader=<h3>\u2740 Deployment on Round #{0}</h3><br/>
acar.initiative.deploymentInfo={0} ({1}), Start: {2}
acar.initiative.deploymentTeam={0}[Team {1}]
acar.initiative.noEffect=no effect
acar.initiative.endOfGame=<h2>\u25cf End of the Game</h2>
acar.initiative.rollAnnouncementCustom={0} rolls {1}...

################################################################################
## Movement Phase
################################################################################
acar.movementPhase.header=<h2>\u25d1 Movement Phase</h2>
acar.movementPhase.deployed={0} deployed at sector {1}.
acar.movementPhase.advancing={0} is advancing.
acar.movementPhase.advancingTarget={0} is advancing towards {1}.
acar.movementPhase.advancingDetailed={0} is advancing to {2} against {1}.
acar.movementPhase.movingAway={0} is moving away from {1}, at {2}.
acar.movementPhase.disengaging={0} is disengaging from battle and retreating.

################################################################################
## Range Descriptions
################################################################################
acar.range.pointBlank=pointblank
acar.range.close=close quarters
acar.range.skirmish=skirmish range
acar.range.bombardment=bombardment range
acar.range.extreme=extreme range
acar.range.beyondVisual=beyond visual range

################################################################################
## Firing Phase
################################################################################
acar.firingPhase.header=<h2>\u25d5 Firing Phase</h2>
acar.firingPhase.attackAnnouncement={0} attacks {1}.
acar.firingPhase.receivedDamage={0} received {1} damage, {2} armor left
acar.firingPhase.attackCannotSucceed=The attack cannot succeed: {0}
acar.firingPhase.hitThreshold=Needs {0}+ to hit <i>\u27e8{1}\u27e9</i>.
acar.firingPhase.attackMisses=The attack misses.
acar.firingPhase.attackHits=The attack hits!
acar.firingPhase.highStress=High Stress episode!
acar.firingPhase.crippled=It's crippled!
acar.firingPhase.destroyed=\u2620 It's destroyed!
acar.firingPhase.targetingDamage={0} took {1} damage to its targeting system.
acar.firingPhase.internalDamageRoll=Rolling for internal damage.
acar.firingPhase.weaponDamage={0} took {1} damage to its weapons system.
acar.firingPhase.noInternalDamage=Took no internal damage.

################################################################################
## End Phase
################################################################################
acar.endPhase.header=<h2>\u25cf End Phase</h2>
acar.endPhase.destroyedHeader=<h3>Destroyed Units</h3>
acar.endPhase.withdrawAnnouncement=[Withdraw] {0} attempts to withdraw under {1} conditions.
acar.endPhase.withdrawThreshold=[Withdraw] Needs {0}+ to successfully withdraw <i>\u27e8{1}\u27e9</i>.
acar.endPhase.withdrawRoll=[Withdraw] {0} rolled {1} for withdrawal.
acar.endPhase.withdrawSuccess=[Withdraw] The {0} has withdrawn from the battlefield.
acar.endPhase.withdrawFail=[Withdraw] The withdrawal attempt fails.
acar.endPhase.crewDeath=[Crew] {0} has succumbed from his wounds \u2620
acar.endPhase.crewAlive=[Crew] {0} is still alive ({1} hits) \u263a
acar.endPhase.devastated=[Devastated] {0} has been devastated, there is nothing left of it.
acar.endPhase.destroyedPilot=[Destroyed] {0} was destroyed by the pilot ejection.
acar.endPhase.destroyedOffBoard=[Destroyed] {0} was destroyed after being pushed off the combat envelope.
acar.endPhase.captured=[Captured] {0} was captured by enemy forces.
acar.endPhase.retreat=[Retreated] {0} has left the battlefield in full retreat.
acar.endPhase.missing=[Missing] {0} never joined the battle.
acar.endPhase.destroyedSalvage=[Destroyed] {0} was destroyed, it is salvageable.
acar.endPhase.destroyedSurprise=[Destroyed] {0} was destroyed by surprise, it is salvageable.

################################################################################
## Morale Checks
################################################################################
acar.morale.recoveryAttempt=[Morale] {0} attempts a morale recovery check. Need {1} to succeed.
acar.morale.recoveryRoll=[Morale] Rolls {0}, recovers its nerves and morale improves to {1}.
acar.morale.recoveryFail=[Morale] Rolls {0}, fails to recover its nerves. Morale stays at {1}.

acar.morale.checkAttempt=[Morale] {0} attempts a morale check. Need {1} to succeed.
acar.morale.checkRolled=[Morale] {0} rolled {1}.
acar.morale.checkSuccess=[Morale] {0} holds steady and does not lose morale.
acar.morale.checkFail=[Morale] {0} fails its morale check! Morale worsens from {1} to {2}.

################################################################################
## End of Combat
################################################################################
acar.endOfCombat.header=<h2>\u25d9 End of Combat</h2>
acar.endOfCombat.teamReportHeader=<h3>Team {0} Report:</h3>
acar.endOfCombat.teamRemainingUnits=<h3>{0} has {1} units remaining.</h3>
acar.endOfCombat.teamUnitStats={0}, Armor remaining: {1}, Structure remaining: {2}, Crew: {3}, Hits: {4}
acar.endOfCombat.teamUnitStatsShort={0} - Armor remaining: {1}, Structure remaining: {2}
acar.endOfCombat.teamDestroyedUnits=<h3>{0} has {1} units destroyed.</h3>
acar.endOfCombat.teamRetreatingUnits=<h3>{0} has {1} units retreating.</h3>

################################################################################
## Victory
################################################################################
acar.victory.teamVictorious=<h2><i>Team {0} is victorious!</i></h2>
Empty file.
18 changes: 17 additions & 1 deletion megamek/i18n/megamek/client/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -845,9 +845,20 @@ ChatLounge.compact.prone=Prone
ChatLounge.compact.altitude=Alt
ChatLounge.compact.fuel=Fuel
ChatLounge.compact.velocity=Vel

ChatLounge.popup.quirks=Quirks...

# ACAR for Megamek
ChatLounge.name.autoResolveSetup=Abstract Combat Auto Resolution
ChatLounge.name.autoResolveSetup.tooltip=Simulate the combat between all forces loaded in the lobby. It converts all units to alpha strike for the simulation and uses the current board and player starting positions.
ChatLounge.name.autoResolveSetup.blurb=Simulate combat with all loaded forces using ACAR rules.
ChatLounge.butRunAutoResolve=Run Simulation
ChatLounge.chkAutoResolve=Calculate chances
ChatLounge.autoresolve.parallelism=Parallelism
ChatLounge.autoresolve.tooltip=Run locally the abstract combat auto resolution, it uses Alpha Strike models as proxies for TW units.
ChatLounge.autoresolve.numOfSimulations=Simulation Runs
ChatLounge.autoresolve.numOfSimulations.tooltip=Number of simulations to run before the auto resolve. Values beyond 100 runs can be slow on very larger armies.


## The following are accessed programmatically, please don't remove
ChatLounge.teamOverview.COLTEAM=Team
ChatLounge.teamOverview.COLTONNAGE=Tonnage
Expand Down Expand Up @@ -4828,3 +4839,8 @@ Bot.commands.caution=Piloting Caution
#### TacOps movement and damage descriptions
TacOps.leaping.leg_damage=leaping (leg damage)
TacOps.leaping.fall_damage=leaping (fall)

### AutoResolveDialog
AutoResolveMethod.dialog.name=Auto Resolve Chance Dialog
AutoResolveMethod.dialog.title=Calculating scenario outcome
AutoResolveMethod.text=Simulating combat...
169 changes: 169 additions & 0 deletions megamek/i18n/megamek/common/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -606,3 +606,172 @@ 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.cover=Partial Cover
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


### AutoResolveDialog
AutoResolveMethod.dialog.name=Auto Resolve Chance Dialog
AutoResolveMethod.dialog.title=Calculating scenario outcome
AutoResolveMethod.text=Simulating combat...

# Progress gag text
AutoResolveMethod.progress.0=Loading scenario...
AutoResolveMethod.progress.1=Checking mek alignment protocols...
AutoResolveMethod.progress.2=Calculating ballistic trajectories...
AutoResolveMethod.progress.3=Rolling dice for pilot survival chances...
AutoResolveMethod.progress.4=Consulting Solaris VII odds makers...
AutoResolveMethod.progress.5=Loading ammo into the simulation (don't jettison!)...
AutoResolveMethod.progress.6=Determining optimal mek trash-talk...
AutoResolveMethod.progress.7=Setting turrets to 'mildly menacing'...
AutoResolveMethod.progress.8=Calculating heat dissipation coefficients...
AutoResolveMethod.progress.9=Estimating repair bay bills...
AutoResolveMethod.progress.10=Compiling mekwarrior ego damage projections...
AutoResolveMethod.progress.11=Balancing AI's tactical hubris...
AutoResolveMethod.progress.12=Crunching numbers on the 'perfect headshot'...
AutoResolveMethod.progress.13=Establishing drop location drama...
AutoResolveMethod.progress.14=Simulating ammo explosions (wear safety glasses)...
AutoResolveMethod.progress.15=Scouting nearest salvage crews...
AutoResolveMethod.progress.16=Recalculating jump jet failures...
AutoResolveMethod.progress.17=Breaking ties with a coin toss...
AutoResolveMethod.progress.18=Deploying fresh cappuccino for the Command Center...
AutoResolveMethod.progress.19=Stackpoling probability matrix generation...
AutoResolveMethod.progress.20=Mocking clanners in idle animation...
AutoResolveMethod.progress.21=Calculating the odds of friendly fire "accidents"...
AutoResolveMethod.progress.22=Measuring mekwarrior stress levels (hint: high)...
AutoResolveMethod.progress.23=Resolving 'how did that hit the ammo bin?' queries...
AutoResolveMethod.progress.24=Adjusting enemy AI difficulty: TOO HARD vs. UNFAIR...
AutoResolveMethod.progress.25=Consulting Star League-era technical manuals...
AutoResolveMethod.progress.26=Running the "AC/20 hit or miss?" lottery...
AutoResolveMethod.progress.27=We trust Comstar...
AutoResolveMethod.progress.28=Debating the moral implications of using flamers...
AutoResolveMethod.progress.29=Double-checking mekwarrior callsigns for profanity...
AutoResolveMethod.progress.30=Preparing excuses for unlucky dice rolls...
AutoResolveMethod.progress.31=Processing missile swarm hit ratios...
AutoResolveMethod.progress.32=Simulating headshot scenarios...
AutoResolveMethod.progress.33=Determining flamer effectiveness...
AutoResolveMethod.progress.34=Adjusting weapon jam probabilities...
AutoResolveMethod.progress.35=Loading Lance formation data...
AutoResolveMethod.progress.36=Identifying terrain bottlenecks...
AutoResolveMethod.progress.37=Evaluating reinforcement deployment options...
AutoResolveMethod.progress.38=Simulating overheating consequences...
AutoResolveMethod.progress.39=Calibrating long-range sensor arrays...
AutoResolveMethod.progress.40=Calculating probability of friendly fire...
AutoResolveMethod.progress.41=Verifying enemy morale thresholds...
AutoResolveMethod.progress.42=Analyzing debris collision chances...
AutoResolveMethod.progress.43=Running thermal vision overlays...
AutoResolveMethod.progress.44=Analyzing enemy retreat vectors...
AutoResolveMethod.progress.45=Preparing enemy salvage reports...
AutoResolveMethod.progress.46=Compiling pilot performance stats...
AutoResolveMethod.progress.47=Checking mek stability in rough terrain...
AutoResolveMethod.progress.48=Resolving targeting discrepancies...
AutoResolveMethod.progress.49=Applying Star League-era targeting algorithms...
AutoResolveMethod.progress.50=Simulating dust cloud visibility effects...
AutoResolveMethod.progress.51=Evaluating melee weapon readiness...
AutoResolveMethod.progress.52=Scouting salvageable terrain features...
AutoResolveMethod.progress.53=Determining Lance composition effectiveness...
AutoResolveMethod.progress.54=Resolving LRM indirect fire paths...
AutoResolveMethod.progress.55=Adjusting pilot fatigue levels...
AutoResolveMethod.progress.56=Simulating cockpit ejection scenarios...
AutoResolveMethod.progress.57=Compiling mekwarrior callsign database...
AutoResolveMethod.progress.58=Identifying Atlas encounter probabilities...
AutoResolveMethod.progress.59=Modeling heat sink efficiency variance...
AutoResolveMethod.progress.60=Resolving AI tactical inconsistencies...
AutoResolveMethod.progress.61=Evaluating urban combat performance...
AutoResolveMethod.progress.62=Cross-referencing weapon cooldown times...
AutoResolveMethod.progress.63=Crunching missile scatter algorithms...
AutoResolveMethod.progress.64=Resolving LOS obstructions...
AutoResolveMethod.progress.65=Simulating comm interference scenarios...
AutoResolveMethod.progress.66=Compiling engagement range profiles...
AutoResolveMethod.progress.67=Reviewing pilot injury records...
AutoResolveMethod.progress.68=Determining ammo depletion effects...
AutoResolveMethod.progress.69=Configuring Lance AI personalities...
AutoResolveMethod.progress.70=Re-evaluating jump jet burn duration...
AutoResolveMethod.progress.71=Resolving hill advantage simulations...
AutoResolveMethod.progress.72=Simulating stray projectile outcomes...
AutoResolveMethod.progress.73=Preparing pilot bravery stats...
AutoResolveMethod.progress.74=Adjusting simulated time dilation rates...
AutoResolveMethod.progress.75=Modeling cockpit feedback delays...
AutoResolveMethod.progress.76=Resolving urban debris interactions...
AutoResolveMethod.progress.77=Simulating mek power fluctuations...
AutoResolveMethod.progress.78=Reviewing mekwarrior injury survival rates...
AutoResolveMethod.progress.79=Running lance morale simulations...
AutoResolveMethod.progress.80=Performing post-battle repair estimates...
AutoResolveMethod.progress.81=Resolving turret targeting sequences...
AutoResolveMethod.progress.82=Analyzing AC/20 hit probabilities...
AutoResolveMethod.progress.83=Recalibrating PPC hit radii...
AutoResolveMethod.progress.84=Compiling headshot excuses for unlucky pilots...
AutoResolveMethod.progress.85=Mocking Clanner tactics...
AutoResolveMethod.progress.86=Resolving critical hit misfire scenarios...
AutoResolveMethod.progress.87=Reviewing pilot trash-talk logs...
AutoResolveMethod.progress.88=Adjusting for night vision conditions...
AutoResolveMethod.progress.89=Analyzing mek repair queue efficiency...
AutoResolveMethod.progress.90=Calculating salvage crew response times...
AutoResolveMethod.progress.91=Resolving simulated dropship landings...
AutoResolveMethod.progress.92=Processing planetary weather data...
AutoResolveMethod.progress.93=Reviewing combat simulation logs...
AutoResolveMethod.progress.94=Determining ammo dump safety radius...
AutoResolveMethod.progress.95=Simulating AI mutiny risk...
AutoResolveMethod.progress.96=Cross-referencing mek chassis vulnerabilities...
AutoResolveMethod.progress.97=Balancing Lance formations for fairness...
AutoResolveMethod.progress.98=Evaluating retreat probabilities...
AutoResolveMethod.progress.99=Finalizing combat scenario results...

AutoResolveDialog.title=Auto Resolve Battle
AutoResolveDialog.messageFailedCalc=Commander, we were unable to simulate any combat scenarios. Do you want to proceed?
AutoResolveDialog.messageSimulated=Commander, we ran {0} simulated combat scenarios and our forces came out victorious in {1}, lost {2}, and drew {3} times. This gives us a {4}% chance of victory. Do you want to proceed?
AutoResolveDialog.messageScenarioTeam=Team {0} won the scenario.
AutoResolveDialog.messageScenarioPlayer=Player {0} won the scenario.
AutoResolveDialog.message.victory=Your forces won the scenario. Did your side control the battlefield at the end of the scenario?
AutoResolveDialog.message.defeat=Your forces lost the scenario. Do you want to declare your side as controlling the battlefield at the end of the scenario?
AutoResolveDialog.victory=Victory!
AutoResolveDialog.defeat=Defeat!
ResolveDialog.control.title=Control of Battlefield?
ResolveDialog.control.message=Did your side control the battlefield at the end of the scenario?
Loading

0 comments on commit 7bb40eb

Please sign in to comment.