Improves:
* refactor: split CostAdjuster logic in multiple parts - prepare X, prepare cost, increase cost, reduce cost;
* refactor: improved VariableManaCost to support min/max values, playable and AI calculations, test framework;
* refactor: improved EarlyTargetCost to support mana costs too (related to #13023);
* refactor: migrated some cards with CostAdjuster and X to EarlyTargetCost (Knollspine Invocation, etc - related to #13023);
* refactor: added shared code for "As an additional cost to cast this spell, discard X creature cards";
* refactor: added shared code for "X is the converted mana cost of the exiled card";
* tests: added dozens tests with cost adjusters;
Bug fixes:
* game: fixed that some cards with CostAdjuster ignore min/max limits for X (allow to choose any X, example: Scorched Earth, Open The Way);
* game: fixed that some cards ask to announce already defined X values (example: Bargaining Table);
* game: fixed that some cards with CostAdjuster do not support combo with other cost modification effects;
* game, gui: fixed missing game logs about predefined X values;
* game, gui: fixed wrong X icon for predefined X values;
Test framework:
* test framework: added X min/max check for wrong values;
* test framework: added X min/max info in miss X value announce;
* test framework: added check to find duplicated effect bugs (see assertNoDuplicatedEffects);
Cards:
* Open The Way - fixed that it allow to choose any X without limits (close#12810);
* Unbound Flourishing - improved combo support for activated abilities with predefined X mana costs like Bargaining Table;
* refactor: standard enum style for SourcePermanentToughnessValue
* refactor SourcePermanentPowerCount to enum SourcePermanentPowerValue
add comments on usage of NOT_NEGATIVE vs ALLOW_NEGATIVE
* Replace "([a-zA-Z]+).getManaCostsToPay().getX()" with CardUtil.getSourceCostsTag(game, $1, "X", 0)
Fix Disrupting Shoal
* Change final card .getX() calls
* Condense all ManacostVariableValue enum values into "instance"
* Further removal of getX, Display X symbol for non-mana X cards
* Fix test
* Fully remove ManaCosts.getX
* Replace all different X dynamic values with GetXValue
* Remove individual cards checking getAmount for X values (leaving cost reduction that does not use X)
* Add null check for game object inside getSourceCostsTagsMap
* fix build errors
* fix Vicious Betrayal
* text fix
* Last Night Together
* Nanogene Conversion
* Return the Past
* Rose, Cutthroat Raider
* Diamond City
* Fix Apostrophe
* Various fixes
* Replace Diamond City and Celebration Watchers
* LastNightTogether improvements, add hint to ReturnThePast
* Add AttackedThisTurnOpponentsCount hint, ignore new failing Celebration test
* Review fixes, also create ValueConditionHint for value hints with a conditional threshold
* Comments improvements
* Requested changes to make ValueConditionHint extend ConditionHint
* single super call in ValueConditionHint constructor
* Create generic X MV adjuster
* Update XTargetsAdjuster
* Create DynamicValueTargetsAdjuster to replace VerseCounterAdjuster
* Convert XTargetsAdjuster to use DynamicValueTargetsAdjuster
* Genericize MV target adjuster
* Converting custom classes for A and B cards, fix Back in Town to only target creature cards
* Add Power and Toughness target adjusters, C cards
* Set up and use Monstrosity X DynamicValue
* Move Scry amount dynamic value to common, add D and E cards
* Convert F to I cards
* Cards K-M
* N, O cards
* Cards O-R
* S cards (check Scrap Welder)
* Cards T - Z
* Rename target adjusters
* Add filter messages, don't add 0 count targets
* Clear blueprint targets (just in case), fix target names, Temporal Firestorm is not target
* Requested renames
* Aether Burst is "up to"
* Review fixes
* Add new cards, add source to dynamic value calculation