* Simulated AI: Fix multi-target spell simulation.
Removes an incorrect check that was comparing two semantically different things (number of possible to choose from vs. number of targets chosen). Adds a test using Incremental Growth, where number of possible targets is 5, but the spell requires only 3 to be chosen.
* Fix the root issue and eliminate incorrect simulations.
* Fix infinite loop with invalid targets.
* Fix logic.
* Support export/import states with arbitrary players.
Previously, the dump/setup game state dev options were only able to handle a 2-player human vs. AI game. This PR expands the functionality to support any number of players and ignores the type of player (naming them p0,p1,...,pN). The previous names of ai and human are supported for backwards compatibility.
This change improves Simulated AI logic by eliminating many unnecessary simulations, particularly due to:
- Invalid targets involving counterspells countering themselves (including modal spells).
- Pruning identical land drop decisions.
Tests are added to cover these cases.
Some core logic is changed, in particular, SpellAbility.canTarget() was not rejecting self-targeting for counterspells. This was likely being done at a higher level somewhere (e.g. in UI code for choosing targets for the human player or AI-specific code for non-simulated AI).
Additionally, a convenience SpellAbility.hasLegalTargets() method is added, from the logic that was previously in AIController.java, so that it can be re-used by the simulation AI code.
A few small style clean ups are included in the code being changed.
Uses a seeded deterministic random generator when simulating choices, which ensures the same number of sub-choices are always used, which the code requires. Adds a test.