triplea-game / triplea

TripleA is a turn based strategy game and board game engine, similar to Axis & Allies or Risk.
https://triplea-game.org/
GNU General Public License v3.0
1.32k stars 392 forks source link

CasualtySelector#selectCasualties:118 - java.lang.IllegalStateException #11610

Open tripleabuilderbot opened 1 year ago

tripleabuilderbot commented 1 year ago

Map

total_world_war

Log Message

sortedTargetsToPickFrom must have the same size as targetsToPickFrom list

TripleA Version

2.6.14356

Java Version

11.0.9.1

Operating System

Windows 10

Stack Trace

Exception: java.lang.IllegalStateException sortedTargetsToPickFrom must have the same size as targetsToPickFrom list
java.lang.Exception
    at games.strategy.triplea.delegate.battle.casualty.CasualtySelector.selectCasualties(CasualtySelector.java:118)
    at games.strategy.triplea.delegate.battle.steps.fire.SelectMainBattleCasualties$Select.apply(SelectMainBattleCasualties.java:157)
    at games.strategy.triplea.delegate.battle.steps.fire.SelectMainBattleCasualties.apply(SelectMainBattleCasualties.java:57)
    at games.strategy.triplea.delegate.battle.steps.fire.SelectMainBattleCasualties.apply(SelectMainBattleCasualties.java:28)
    at games.strategy.triplea.delegate.battle.steps.fire.SelectCasualties.execute(SelectCasualties.java:75)
    at games.strategy.triplea.delegate.ExecutionStack.execute(ExecutionStack.java:34)
    at games.strategy.triplea.delegate.battle.MustFightBattle.fight(MustFightBattle.java:712)
    at games.strategy.triplea.odds.calculator.BattleCalculator.calculate(BattleCalculator.java:124)
    at games.strategy.triplea.odds.calculator.ConcurrentBattleCalculator.lambda$calculate$4(ConcurrentBattleCalculator.java:184)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:952)
    at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:926)
    at java.base/java.util.stream.AbstractTask.compute(AbstractTask.java:327)
    at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    at java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
    at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateParallel(ReduceOps.java:919)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at games.strategy.triplea.odds.calculator.ConcurrentBattleCalculator.calculate(ConcurrentBattleCalculator.java:196)
    at games.strategy.triplea.ai.pro.util.ProOddsCalculator.callBattleCalc(ProOddsCalculator.java:250)
    at games.strategy.triplea.ai.pro.util.ProOddsCalculator.callBattleCalc(ProOddsCalculator.java:226)
    at games.strategy.triplea.ai.pro.util.ProOddsCalculator.calculateBattleResults(ProOddsCalculator.java:159)
    at games.strategy.triplea.ai.pro.util.ProOddsCalculator.calculateBattleResults(ProOddsCalculator.java:143)
    at games.strategy.triplea.ai.pro.util.ProOddsCalculator.calculateBattleResults(ProOddsCalculator.java:124)
    at games.strategy.triplea.ai.pro.util.ProOddsCalculator.calculateBattleResults(ProOddsCalculator.java:134)
    at games.strategy.triplea.ai.pro.ProNonCombatMoveAi.moveUnitsToDefendTerritories(ProNonCombatMoveAi.java:1047)
    at games.strategy.triplea.ai.pro.ProNonCombatMoveAi.doNonCombatMove(ProNonCombatMoveAi.java:121)
    at games.strategy.triplea.ai.pro.AbstractProAi.move(AbstractProAi.java:133)
    at games.strategy.triplea.ai.AbstractAi.start(AbstractAi.java:515)
    at games.strategy.engine.framework.ServerGame.waitForPlayerToFinishStep(ServerGame.java:593)
    at games.strategy.engine.framework.ServerGame.runStep(ServerGame.java:450)
    at games.strategy.engine.framework.ServerGame.runNextStep(ServerGame.java:345)
    at games.strategy.engine.framework.ServerGame.startGame(ServerGame.java:312)
    at games.strategy.engine.framework.startup.launcher.LocalLauncher.launchInternal(LocalLauncher.java:92)
    at games.strategy.engine.framework.startup.launcher.LocalLauncher.lambda$launch$0(LocalLauncher.java:60)
    at java.base/java.lang.Thread.run(Thread.java:834)
asvitkine commented 1 year ago

However, looks like this is an old issue, pre-dating 2.6. Example reports from prior versions: https://github.com/triplea-game/triplea/issues/10451 https://github.com/triplea-game/triplea/issues/11524

asvitkine commented 1 year ago

The relevant code, which is in sortUnitsForCasualtiesWithSupport() is pretty complex. Not only is there a lot of inline logic, there's also a caching system surrounding it.

I suspect this issue will remain non-actionable until we can find a reliable repro.

asvitkine commented 5 months ago

If someone encounters this and gets redirected to this issue, please post a saved game so we can have more chances of figuring out what's wrong!

frigoref commented 1 month ago

@asvitkine Can we flag this as inactive until we get a save game? inactive / saveGameNeeded / blockedUntilUserInput / ...